集合框架概述
java视频笔记 https://www.bilibili.com/video/av48065654/
集合是队多个数据进行存储操作的结构,简称java容器,是内存层面的存储。
集合可分为Collection接口和Map接口。
Collection接口:单列数据分为List和Set
List:有序、可重复
Set:无序、不可重复
Map接口:双列数据,保存具有映射关系"key-value对"集合
Collection接口继承树

Map接口继承树

List接口
ArrayList
线程不安全,查询效率高,增删慢
ArrayList(jdk7)
添加方法为list.add(),初始容量为10,若超过初始容量,则扩容为1.5倍,并将原有宿主复制到新的数组中。
ArrayList(jdk8)
初始化为{},第一次调用add方法再赋值初始容量,若超过初始容量,则扩容为1.5倍,并将原有宿主复制到新的数组中。
LinkedList
双向列表,线程不安全,查询效率低,增删快
vector
线程安全,效率低
List遍历
Iterator迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
for循环
int len = list.size();
for (int i=0;i<len;i++){
System.out.println(list.get(i));
}
foreach循环
for (Object o:list){
System.out.println(o);
}
List遍历时删除
public void testDel() {
List<Integer> list = new ArrayList();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer integer = iterator.next();
if (integer == 2)
iterator.remove();
}
}
执行后结果: list = [1,3]
参考 https://blog.csdn.net/zcyzsy/article/details/82790381
Set接口
HashSet
线程不安全,可以存null值。基于hashmap添加,通过hash值来添加,底层是个数组。
**添加元素过程:**先调用hashCode()方法计算hash值,然后通过某种算法计算出在数组中存放位置,判断该位置上是否有元素:
如果没有,则添加成功
如果有,先比较hash值,
如果不同,则添加成功,以链表的形式;
如果相同,则通过equals()判断
如果equals()返回true,则添加失败,否则添加成功,以链表的形式
LinkedHashSet
HashSet的子类,遍历时可以按照添加顺序遍历,添加数据的同时还维护了两个引用,记录前后数据,对于频繁遍历,效率高于hashSet
TreeSet
底层是红黑树,可以按照添加对象的指定属性,进行排序。
- 向TreeSet添加数据只能为相同类的对象
- 自然排序和定制排序
- 自然排序实现Comparable中compareTo()方法,判断相等是compareTo()不是equals()
- 定制排序使用中compare()方法,不是equals()
Map接口
map结构理解:
key:无序,不可重复,使用set存储所有的key
value: 无序,可以重复,使用Collection存储所有的value
entry:无序,不可以重复,使用set存储entry
HashMap
线程不安全,效率高,可以存储null的key和value
HashMap底层:数组+链表+红黑树
HashMap底层原理(jdk7)
HashMap map = new HashMap();
实例化后,底层创建了长度是16的Entry[] table数组.
map.put(key1,value1)添加元素时,先使用hashCode()计算key1的hash值,经过算法之后,得到在Entry数组中的存放位置
如果此位置上数据为空,此时entry添加成功
如果不为空,比较当前key1和链表中数据的key的hash值
如果hash值都不同,添加成功,以链表方式
如果相同,调用key所在类的equals()方法
如果返回false,添加成功,以链表方式
如果返回true,将value1替换value值
扩容:容量为2倍,原来数据复制过来
HashMap底层原理(jdk8相较于7)
- 底层没有创建数组
- 底层数组是Node[]
- 首次调用put()时才在创建数组
- 底层增加了红黑树,当索引位置上元素以链表存储数据个数 > 8 且数组长度 > 64改为红黑树存储,查找效率高
遍历HashMap
public void test() {
HashMap<String, Object> map = new HashMap();
map.put("AAA",111);
map.put("BBB",222);
//迭代器 推荐
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry next = (Map.Entry)iterator.next();
System.out.println(next.getKey() +".."+next.getValue());
}
//调用entrySet()方法的map必须是泛型
for (Map.Entry entry : map.entrySet()) {/*---*/
System.out.print("key= " + entry.getKey() + " and value= " + entry.getValue() + "; ");
}
//遍历value
for(Object o: map.values()){
System.out.println(o);
}
//key集合再获取value,速度慢
for(Object key:map.keySet()){
System.out.println(key+".."+map.get(key));
}
}
LinkedHashMap
保证遍历map时,按照添加顺序实现遍历,添加了指向前后指针,频繁操作效率高于LinkedHashMap
Hashtable
线程安全,效率低,不可以存储null的key和value
propertise
常用来处理配置文件,key和value都是String类型
TreeMap
保证按照添加的key-value排序,key的自然排序或者定制排序
本文深入讲解Java集合框架,包括Collection和Map接口,探讨ArrayList、LinkedList、Vector、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap、Hashtable等数据结构的特点与使用场景。

1217

被折叠的 条评论
为什么被折叠?



