1:单列集合
collection(单列集合):每个元素(数据)只包含一个值。
collection集合体系:接口,实现类
collection集合特点:
List系列集合:添加的元素时有序、可重复、有索引。
ArrayList、LinekList:有序、可重复、有索引
Set系列集合:添加的元素是无序、不重复、无索引
HashSet无序、重不复、无索引;
LinkedHashSet有序、不重复、无索引;
TreeSet 按照大小默认升序排序,不重复、无索引;
2:Map双列集合:每个元素包含两个值(键值队)。
3:
4:
collection的遍历方式:
一:迭代器:是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。
二:增强for循环 :for(元素的数据类型 变量名:数组或者集合){
}
如:Collection<String> c=new ArrayList<>();
...
for(String s:c){
System.out,println(s)
}
增强for可以用来遍历集合或者数组。
增强for遍历集合,本质就是迭代器遍历集合的简化写法。
三:Lambda表达式:
1:List系列集合:
特点:有序,可重复,有索引。
ArrayList:有序,可重复,有索引。
LinkedList:有序,可重复,有索引。
但二者底层采用的数据结构(存储、组织数据的方式)不同,适合的场景不同。
特有方法:List集合因为支持索引,所以多了与索引相关的方法,当然,Collection的功能List也都继承了。
List集合支持的遍历方式:接口,实现类
ArrayList集合的底层原理:基于数组实现的。
数组的特点:查询快,增删慢
(1:查询速度快:(是根据索引查询数据快)查询数据通过地址值和索引定位,查询任意数据耗时相同。2:删除效率低:可能需要把后面很多的数据进行前移。3:可能需要把后面很多的数据后移,再增加元素;或者也可能需要进行数组的扩容。)
1:利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组。
2:添加第一个元素时,底层会创建一个新的长度为10的数组。
3:存满时,会扩容1.5倍。
4:如果一次添加多个元素,1.5倍还放不下,则创建数组的长度以实际为准。
2:ArrayList集合适合的应用场景:
ArrayList集合适合根据索引查询数据,比如根据随机索引去数据(高效)!或者数据量不是很大时!
3:LinkedList集合的底层原理:基于双链表实现的。
链表:
链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
链表的特点:
1:查询慢,无论查询哪个数据都要从头开始找。
2:链表增删相对快。但对首尾元素进行增删改查的速度是极快的。
4:LinkedList新增了:很多首尾操作的特有方法。
5:LinkedList的应用场景之一:可以用来设计队列。
可以用来设计栈 。(只是在首部增删元素, LinkedList用来实现很合适)
数据进入栈模型的过程称为:压/进栈(push)
数据离开栈模型的过程称为:弹/出栈(pop)
队列的特点:先进先出,后进后出。
6:Set系列集合特点:无序:添加数据的顺序和获取出的数据顺序不一致;不重复;无索引;
HashSet:无序,不重复;无索引;
LinkedHashSet:有序,不重复;无索引;
TreeSet:排序,不重复;无索引;
(Set要用到的常用方法,基本上都是collection提供的!!自己几乎没有额外新增一些常用功能!)
7:哈希值:
就是一个int类型的数值,Java中每个对象都有一个哈希值。
Java中所有对象,都可以调用Object类提供的hashCode方法,返回该对象的哈希值。
public int hashCode():返回该对象的哈希码值。
8:对象哈希值的特点:
同一个对象调用 hashCode()方法返回的哈希值时相同的。
不同的对象,他们的哈希值一般不同,但也有可能会相同(哈希碰撞)。
HashSet集合的底层原理:
基于哈希表实现。
哈希表时一种增删改查数据,性能都很好的数据结构。
JDK8之前:哈希表=数组+链表
JDK8之后:哈希表=数组+链表+红黑树
JDK8之后引进了红黑树,进一步提高了操作数据的性能。
JDK8开始,当链表长度超过8,且数组长度>=64时,自动将链表转换成红黑树
二叉查找树存在的问题:当数据已经是排好序的,导致查询的性能与单链表是一样,查询速度变慢。
平衡 二叉树在满足查找二叉树大小的规则下,让树尽可能矮小,以此提高查询数据的性能。
9:深入理解HashSet集合去重复的机制。
HashSet集合默认不能对内容一样的两个对象去重复!
如果希望Set集合认为2个内容一样的对象是重复的,必须重写对象的hashCode()和equais()方法。
LinkedHashSet底层原理:
依然是基于哈希表(数组+链表+红黑树)实现的。
但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置。
9:TreeSet:
特点:不重复,无索引,可排序(默认升序排列,按照元素的大小,有小到大排序)
底层是基于红黑树实现的排序。
注意:对于数值类型:Integer,Double,默认按照数值本身的大小进行升序 排序。
对于字符串类型:默认按照首字符的编号 升序排序。
对于自定义类型如Student对象,TreeSet默认是无法直接排序的。
10:自定义排序规则:TreeSet集合存储自定义的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。
方式一:让自定义的类(如学生类)实现Comparator接口,重写里面的comparaTo方法来指定比较规则。
方式二:通过调用TreeSet集合有参数构造器,可以设置Comparator对象(比较器对象,用于指定比较规则)
public TreeSet(Comparator<? super E> comparator)
11:如果希望记住元素的添加顺序,需要存储重复的元素,又要频繁的根据索引查询数据用ArrayList集合(有序、可重复、有索引),底层基于数组。
如果希望记住元素的添加顺序,且增删首尾数据的情况较多,用LinkedList集合(有序、可重复、有索引),底层基于双链表实现。
如果不在意元素顺序,也没有重复元素需要存储,只希望增删改查都快,用HashSet集合(无序、不重复、无索引),底层基于哈希表实现的。
如果希望记住元素的添加顺序,也没有重复元素需要存储,只希望增删改查都快,用LinkedHashSet集合(有序、不重复、无索引),底层基于哈希表和双链表实现的。
如果要对元素进行排序,也没有重复元素需要存储,只希望增删改查都快,用TreeSet集合,基于红黑树实现。