掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢?
接下来,我们一起学习Collection中的常用几个子类( java.util.List 集合、java.util.Set 集合)。

1. List集合

1.1 List接口介绍

java.util.List 接口继承自Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了List 接口的对
象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过
索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
看完API,我们总结一下:
List接口特点:

  1. 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、
    22、33的顺序完成的)。
  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引
  3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

1.2 List接口中常用方法

List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操
作集合的特有方法,如下:

  • public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
  • public E get(int index) :返回集合中指定位置的元素。
  • public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
  • public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
    List集合特有的方法都是跟索引相关:
public class ListDemo {public static void main(String[] args) {// 创建List集合对象List<String> list = new ArrayList<String>();// 往 尾部添加 指定元素list.add("图图");list.add("小美");list.add("不高兴");System.out.println(list);// add(int index,String s) 往指定位置添加list.add(1,"没头脑");System.out.println(list);// String remove(int index) 删除指定位置元素 返回被删除元素// 删除索引位置为2的元素System.out.println("删除索引位置为2的元素");System.out.println(list.remove(2));System.out.println(list);// String set(int index,String s)// 在指定位置 进行 元素替代(改)// 修改指定位置元素list.set(0, "三毛");System.out.println(list);// String get(int index) 获取指定位置元素// 跟size() 方法一起用 来 遍历的for(int i = 0;i<list.size();i++){System.out.println(list.get(i));}//还可以使用增强forfor (String string : list) {System.out.println(string);}}
}

1.3 List子类

1.3.1 ArrayList 集合

java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为
查询数据、遍历数据,所以ArrayList 是最常用的集合。
许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。

1.3.2 LinkedList 集合

java.util.LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。

LinkedList是一个双向链表,那么双向链表是什么样子的呢,我们用个图了解下


实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方
法我们作为了解即可:

  • public void addFirst(E e) :将指定元素插入此列表的开头。
  • public void addLast(E e) :将指定元素添加到此列表的结尾。
  • public E getFirst() :返回此列表的第一个元素。
  • public E getLast() :返回此列表的最后一个元素。
  • public E removeFirst() :移除并返回此列表的第一个元素。
  • public E removeLast() :移除并返回此列表的最后一个元素。
  • public E pop() :从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e) :将元素推入此列表所表示的堆栈。
  • public boolean isEmpty() :如果列表不包含元素,则返回true。

LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList
的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可)
方法演示:

public class LinkedListDemo {public static void main(String[] args) {LinkedList<String> link = new LinkedList<String>();//添加元素link.addFirst("abc1");link.addFirst("abc2");link.addFirst("abc3");System.out.println(link);// 获取元素System.out.println(link.getFirst());System.out.println(link.getLast());// 删除元素System.out.println(link.removeFirst());System.out.println(link.removeLast());while (!link.isEmpty()) { //判断集合是否为空System.out.println(link.pop()); //弹出集合中的栈顶元素}System.out.println(link);}
}

2. Set接口

java.util.Set 接口和java.util.List接口一样,同样继承自Collection 接口,它与Collection 接口中的方法基本一致,并没有对Collection 接口进行功能上的扩充,只是比Collection 接口更加严格了。与List 接口不同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
Set 集合有多个子类,这里介绍其中的java.util.HashSetjava.util.LinkedHashSet 这两个集合。

tips:Set集合取出元素的方式可以采用:迭代器、增强for。

2.1 HashSet集合介绍

java.util.HashSet 是Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。java.util.HashSet 底层的实现其实是一个java.util.HashMap 支持。
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCodeequals 方法。
先来使用一下Set集合存储,看下现象,再了解原理:

public class HashSetDemo {public static void main(String[] args) {//创建 Set集合HashSet<String> set = new HashSet<String>();//添加元素set.add(new String("cba"));set.add("abc");set.add("bac");set.add("cba");//遍历for (String name : set) {System.out.println(name);}}
}

输出结果如下,说明集合中不能存储重复元素:

cba
abc
bac

tips:根据结果我们发现字符串"cba"只存储了一个,也就是说重复的元素set集合不存储。

2.2 HashSet集合存储数据的结构(哈希表)

什么是哈希表呢?
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。

这个是怎么存储的呢?结合一个存储流程图来说明一下:

总而言之,JDK1.8引入红黑树大程度优化了HashMap的性能,那么对于我们来讲保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

2.3 HashSet存储自定义类型元素

给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一
创建自定义Student类

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o)return true;if (o == null || getClass() != o.getClass())return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
public class HashSetDemo2 {public static void main(String[] args) {//创建集合对象 该集合中存储 Student类型对象HashSet<Student> stuSet = new HashSet<Student>();//存储Student stu = new Student("于谦", 43);stuSet.add(stu);stuSet.add(new Student("郭德纲", 44));stuSet.add(new Student("于谦", 43));stuSet.add(new Student("郭麒麟", 23));stuSet.add(stu);for (Student stu2 : stuSet) {System.out.println(stu2);}}
}

执行结果:
Student [name=郭德纲, age=44]
Student [name=于谦, age=43]
Student [name=郭麒麟, age=23]

2.4 LinkedHashSet

HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?在HashSet下面有一个子类java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构。演示代码如下:

public class LinkedHashSetDemo {public static void main(String[] args) {Set<String> set = new LinkedHashSet<String>();set.add("bbb");set.add("aaa");set.add("abc");set.add("bbc");Iterator<String> it = set.iterator();while (it.hasNext()) {System.out.println(it.next());}}
}

结果:
bbb
aaa
abc
bbc

Java基础:List集合和Set接口相关推荐

  1. 7. Java不可变集合和Stream流

    Java不可变集合和Stream流 1. 不可变集合 2. Stream流 2.1 概述 2.2 Stream流的获取 2.3 Stream流的常用API 2.4 Stream流的综合应用 2.5 收 ...

  2. Java 基础之类集

    平时我们用 List . Map 用得挺 Happy 的,只知道可以用它来保存数据,最近面试的时候问到这个 List 和 那个 List 的区别是什么呀, Vector 和 ArrayList 的区别 ...

  3. Java基础_Lambda表达式 函数是接口 Stream流

    一.Lambda表达式(1.8特性) 函数式编程始终编程方式,它将电脑视为函数的计算.将业务逻辑细化.抽象.封装成一个个功能函数(方法),并借助语言自带的高阶函数,将整个业务流程转化为函数之间的相互调 ...

  4. Java基础---多态、抽象类、接口

    2015-4-4 一.多态 1.定义:某一个事物,在不同时刻表现出来的不同状态. 2.多态的前提与体现: (1)要有继承关系: (2)要进行方法的重写: (3)要父类引用指向子类对象. 3.成员访问特 ...

  5. 《java基础》-胖菜鸟说接口

    先扯两句   常常责怪自己,当初不应该.想写<设计模式>就好好写不好吗,非要搞什么拓展,在"工程模式"要介绍什么是泛型:结果泛型说到泛型接口,又想要再介绍介绍什么是接口 ...

  6. 【java基础】第11天——接口、多态

    今日内容介绍 1.接口 2.多态 01(面向对象)接口概述.avi 02(面向对象)接口抽象方法定义.avi 03(面向对象)接口的实现类.avi 04(面向对象)接口中的成员变量的特点.avi 05 ...

  7. Java基础篇:抽象类与接口

    1.抽象类和接口的定义: (1)抽象类主要用来抽取子类的通用特性,作为子类的模板,它不能被实例化,只能被用作为子类的超类. (2)接口是抽象方法的集合,声明了一系列的方法操作,自身并不能做任何事情.如 ...

  8. 【JAVA基础篇】抽象类和接口的区别

    抽象类和接口是定义抽象概念的两种方式,正是由于抽象类和接口,才赋予了Java强大的面向对象的能力.在讨论他们的不同点之前,我们先来了解抽象类和接口. 抽象类 在面向对象的领域一切事物都是对象.对象都是 ...

  9. Java基础:什么是List接口,如何去运用?

    List接口扩展了Collection并声明存储一系列元素的类集的特性.使用一个基于零的下标,元素可以通过它们在列表中的位置被插入和访问. 一个列表可以包含复制元素.除了由Collection定义的方 ...

  10. Java基础篇:如何应用接口?

    为理解接口的功能,让我们看一个更实际的例子.我们曾开发过一个名为Stack的类,该类实现了一个简单的固定大小的堆栈.然而,有很多方法可以实现堆栈.例如,堆栈的大小可以固定也可以不固定.堆栈还可以保存在 ...

最新文章

  1. java char的包装对象,Java 从Character和char的区别来学习自动拆箱装箱
  2. 如何在Flexbox中垂直对齐文本?
  3. 自动驾驶进入第3阶段 ADAS黑科技守护开车人
  4. Apache Spark机器学习.1.7 机器学习工作流示例
  5. 超出网络bios会话限制_?老旧BIOS说再见,拯救者系列设置超简单
  6. sparksql dataframe变成csv保存_Spark大数据分析(三):DataFrame和SQL
  7. js获取当前页面url网址等信息
  8. javafx css_JavaFX缺少的功能调查:CSS
  9. trie树查找前缀串_Trie数据结构(前缀树)
  10. 浪客剑心:位图法Bitmap算法分析
  11. VMware12安装虚拟机教程、Ubuntu16.04安装教程
  12. 2018年最新全国县级以上行政区划对应关系数据(按国家统计局网站整理)
  13. javascript将页面设为首页代码大全
  14. 电子科技大学计算机学生水平,近三年的学生评价结果-电子科技大学.DOC
  15. 2021年全国职业院校技能大赛获奖名单(高职组网络系统管理)
  16. 视频教程-H3CNE认证网络工程师视频课程-H3C认证
  17. 切换窗口快捷键 你知道吗?
  18. [React hooks] Antd Form: Instance created by `useForm` is not connected to any Form element.Forget t
  19. ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学
  20. djyvp2计算机电缆哪家好,ZA-DJYVP22-2*2*1.5计算机电缆

热门文章

  1. 22.c语言各种输入输出与错误处理
  2. 42. HTTP Cookie
  3. 15. CSS 表格
  4. 11. Magento路由分发过程解析(一):在前端控制器中获取路由对象
  5. 安全运维 - Linux系统维护
  6. Mac 下 Eclipse 添加 Dynamic Web Project 并配置 Tomcat
  7. 每天CookBook之JavaScript-073
  8. poj2488-A Knight's Journey【DFS】
  9. Gradle方式构建Java多项目
  10. Ngnix中的fastcgi参数性能优化和解释