集合类
以下是下面将要写的主要内容

List接口:
首先list接口实现了collection接口,List接口下有ArrayList,Vector,LinkedList三个实现类,其中Vector过于老旧所以此处不在讲述,主要介绍ArrayList和LinkedList,其中List是有序的,可重复的,保存序即为添加的顺序
ArrayList:非线性安全,底层利用数组储存,删改效率较低,get效率高
1.首先关于自动扩容,在造ArrayList对象时,有空参构造器和自定义大小的构造器,若空参构造器则默认大小为10个,当不够用时会自动扩容,扩容步骤:创建一个新的数组,newArray = old + old>>2,故新数组大小为老数组的1.5倍,同时将老数组的数据复制到新数组中完成扩容
2.我们要注意一个细节,List和Collection中都定义的有remove()方法,其中collection传入的参数是Object o,即删除的是匹配内容,List中传入的是索引,即删除的是索引位置的内容,注意参数的传入
3.其中我们要注意,当你想要存储自定义类型时,要注意remove()和contains()方法,涉及到内容的比较所以我们要在自定义类中重写equals方法,便于比较方法的使用。
LinkedList:非线性安全,底层双向链表储存,所以get方法遍历效率较低,同时实现了Queue接口,可以创建用于创建队列
由于Linked List和ArrayList都遵从List实现标准,所以代码形式与ArrayList完全相同,其中区别在于:链表储存不需要频繁的进行新数组的空间开辟,但是在根据索引获取数据时,数组储存复杂度o(1),链表o(n)。
Set接口:
Set集合可以看作数学定义中的集合,储存内容无序,不可重复
HashSet:非线性安全,基于散列存放的集合
1.在添加自定义类时,为了排除重复,我们要重写HashCode()和equals()方法,先对判定目标的哈希值进行对比,然后equals对比,都相同时,则为同一对象。
2.HashSet存在一个问题在于无序处理,为了解决这一问题,提供了LinkedHashSet子类,实现基于链表的数据保存,但注意存放的过程仍然是无序的,但遍历是根据添加顺序,增加顺序就是集合的保存顺序,并且不会重复
TreeSet:是基于自平衡的排序二叉树,也就是红黑树
1.首先TreeSet再进行数据保存时,保存的数据默认是按照从小到大的顺序排列
2.所以再进行有序数据的存储时,依据的是Comparable接口实现排序,并且也是依靠Comparable接口中的CompareTo方法判别重复元素
3.当存储类型是自定义类时:
3.1在自定义类中实现Comparable接口,并重写CompareTo方法
3.2在造TreeSet对象构造器中加Comparator比较器
Collection集合的输出
1.Collection接口中提供的有toArray()方法,可以通过遍历数组,或者在toString输出
2.利用Iterator接口实现遍历输出:
其中常用的三个方法:
1 | public boolean hasNext(); |
3.foreach输出
接下来时Map集合:
首先对于map集合的理解:它是一种键值对的存储方式key-value–>entry,构成的entry用set集合存储起来,其中key是Set存储,不可重复,value是List型可重复
主要利用HashMap和TreeMap存储,还有HashTable和LinkedHashMap不在详细介绍,LinkedHashMap和HashMap的区别同LinkedList,不在过多解释
HashMap:散列方式进行存储
1.其中对于put()方法注意细节:当设置的key不存在时,直接保存,并返回null,当存在时,则会替换换来的value,同时返回覆盖前的value
2.当添加自定义类时,同样需要重写equal()方法。
TreeMap:底部红黑树存储,所以是有序存储
1.和TreeSet的异同:在添加自定义类时,都需要调用Comparable和Comparator实现排序和去重,但TreeMap只能根据key来排序,不能通过value
关于map集合的输出
1.利用Entry<>内部接口,先转换为Set集合
1.1:
1 | for(Map.Entry<Byte, Integer> entry : map.entrySet()) { |
1.2:
1 | Iterator<Map.Entry<T,T>> iter = entry.iterator(); |