集合与数组
数组:
1.一旦初始化,长度就不可修改了;
2.一旦定义后,就只能操作指定类型的数据了;
3.数组提供的方法非常有限,且效率不高;
4.获取数组中实际元素的个数,没有现成的属性和方法可调用;
5.存储特点:有序,可重复。
集合:Java集合分为Collection和Map两种体系
Collection接口:单列数据,存储一个一个的对象
<1> List接口:元素有序,可重复,可以存null,遍历元素使用迭代器以及下标遍历get()
实现类:
ArrayList,作为List接口的主要实现类;线程不安全,效率高;底层使用Object[] elementData存储
LinkedList,对于频繁插入,删除效率较高;底层使用双向链表储存
Vector,作为List接口的古老实现类;线程安全,效率低;底层使用Object[] elementData存储
<2> Set接口:元素无序,不可重复,只能存一个null,便利元素时只能使用迭代器遍历
实现类:
HashSet,作为Set接口的主要实现类;线程不安全;可以存储null
LinkedHashSet,HashSet的子类;遍历时可以按照添加的顺序遍历;对于频繁遍历效率较高
TreeSet,要求数据是同一个类型,可按照对象的指定属性进行排序
Map接口:双列数据,存储具有映射关系”key - value对“
实现类:
HashMap,作为Map的主要实现类;线程不安全,效率高;能存储null的键值对
-> LinkedHashMap,保证在遍历元素时,可以按照添加顺序进行遍历;对于频繁遍历效率较高
->原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前、后的元素。
TreeMap,按照添加的key-value进行排序;底层采用红黑树
Hashtable,作为Map的古老实现类;线程安全,效率低;不能存存储null的键值对
-> Properties,常用来处理配置文件。key和value都是String类型
Collection接口中的方法
1 |
|
迭代器Iterator接口
1 | //集合元素的遍历,调用迭代器Iterator接口 |
foreach循环
1 |
|
List常用方法
1 | //List常用方法 |
LinkedList的可顺序遍历性
1 | // LinkedList可按顺序进行遍历 使用foreach遍历 |
Set常用方法
HashSet并没有添加新的方法,沿用Collection的方法
HashSet的添加
向Set中添加数据一定要重写hashCode()和equals()方法,相等的对象必须具有相同的散列码
1 | // HashSet 无序性 使用迭代器遍历 |
TreeSet按指定属性进行排序
1 | //TreeSet按指定属性遍历 |
Person类实现Comparable接口并重写toCompare()方法
1 | // 按照年龄排序 |
输出结果:
使用定制排序
1 |
|
List与数组之间的相互转换和遍历
1 | public class Test1 { |
Map接口
Map的结构:
Map中的key:无序,不可重复,使用Set储存所有的key,key所在的类要重写equals()和 hashCode()
Map中的value:无序,可重复,使用List存储所有的value,value所在类要重写equals()
一个键值对构成一个entry对象
Map中的entry:无序,不可重复,使用Set储存所有的entry
HashMap的底层实现原理:
HashMap map = new HashMap();
实例化后,底层创建了一个长度为16的一维数组Entry[] table
map.put(key1,value1);
在jdk7中,首先调用key1所在类的hashCode()计算key的哈希值,此哈希值通过某种算法后,得到在Entry数组中的存放位置;
如果此位置为空,则添加成功,
否则将key1的哈希值与此位置上的一个或多个元素(key2,value2)的哈希值比较,
如果哈希值不同,则添加成功,
否则调用key1所在类的equals(),如果返回false,则添加成功,否则添加到链表头部(jdk8插入尾部)。
涉及到扩容时,容量扩大为原来的2倍,原有的数据全部被复制过来。
在jdk8中,没有马上就创建数组,而是在put()时创建Node[]数组
Map接口中的方法
1 |
|
集合初始化时,指定集合初始值大小。如果暂时无法确定集合大小,那么指定相应的默认值,这也要求我们记得各种集合的默认值大小, ArrayList 大小为10 HashMap 默认值为 16 。
在HashMap中initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即 loader factor)默认为 0.75。
—–来自《阿里java开发手册》
集合工具类
1 |
|