colletion集合
一、集合
存储一个元素集合,Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类;
Collection的实现类只能存储引用类型,所以对于基本数据类型,Collection的实现类只能存储他们的包装类(位于java.lang包)
Java中共有八个包装类:
1.Byte(byte) 2.Short(short) 3.Integer(int) 4.Long(long)
5.Float(float) 6.Double(double) 7.Boolean(boolean) 8.Character(char)
任何对象加入集合类后,如果集合没有使用泛型,会自动转变为Object类型,在取出的时候,需要进行强制类型转换;使用泛型之后不用强制转换。
二、set集合
Set接口的实现类存储的数据是无序的,元素不重复的
实例:
//创建一个Set集合
Set<String> set = new HashSet<>();
//判断集合是否为空 null
System.out.println(set.isEmpty());
//集合增加元素
set.add("a");
set.add("b");
//判断集合中是否存在指定元素
boolean tar = set.contains("c");
System.out.println(tar);
//迭代器 遍历集合中的元素
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {//判断是否有下一行数据
System.out.println(iterator.next());
}
//删除集合中的元素
set.remove("a");
//查看集合中的所有元素
for (String str : set) {
System.out.println(str);
}
//集合的大小:集合中的元素个数
int size = set.size();
System.out.println(size);
//清空集合
set.clear();
System.out.println(set.toString());
三、list集合
List接口的实现类存储的数据是有序的,元素可重复的;
List接口主要有两个实现类:ArrayList和LinkedList;
LinkedList与ArrayList的区别:
- ArrayList是实现了基于动态数组的数据结构,在未声明长度的情况下,默认长度是10,数据溢出自动扩充。
- LinkedList基于链表的数据结构。
- 对于随机访问get和set(即查找元素),ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
四、map集合
1、基本概念
Map中存储键值对(Key-Value)
HashMap是Map接口的实现类,该类根据键的hashcode值存储数据
Map的特点: - key和value只能是引用类型的数据
- Map的key不允许重复
- 多次给同一个键名赋值,后面的会把前面的赋值覆盖
实例:
//创建一个Map<Key,Value>
Map<Integer, String> map = new HashMap<Integer, String>();
//添加记录
map.put(1, "tom");
map.put(2, "jerry");
//根据键key获取数据
System.out.println(map.get(1));
//获取所有键的集合
Set<Integer> set = map.keySet();
//遍历map所有的值
for (Integer key : set) {
System.out.println(key); //打印键名
System.out.println(map.get(key)); //根据键名获取值
}
Map<String, Integer> m2 = new HashMap<String, Integer>();
m2.put("张三", 90);
m2.put("李四", 20);
//取值
System.out.println(m2.get("李四"));
//根据键key删除键值对
m2.remove("张三");
//判断key键是否存在
boolean tar = m2.containsKey("张三");
//判断value值是否存在
boolean tar2 = m2.containsValue(20);
//获取map集合的元素个数
int len = m2.size();
System.out.println(len);
//打印map中的元素
System.out.println(m2.toString());
//获取所有的值的集合
Collection<Integer> list3 = m2.values();
for (Integer integer : list3) {
System.out.println(integer);
}
2、HashMap实现原理
数组加链表,jdk1.8之后又加入了红黑树
- HashMap底层就是一个数组结构,数组中的每一个元素又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。
- 允许null值和null键
- Entry就是数组中的元素(k-v),每个Map.Entry 其实就是一个key-value键值对,它持有一个指向下一个元素的引用,这就构成了链表
- 当添加一个元素(key-value)时,首先计算元素的key的hash值,以此来确定插入数组中的位置;
- 如果hash值相同,这时就添加到同一个hash值(hashCode)的元素的后面,他们在数组的同一位置,于是形成了链表
- 当链表长度大于8且元素(k-v)个数超过64时,链表就转换为红黑树,这样就提高了查找的效率;
- 当红黑树中的节点个数小于6时,红黑树又重新转换为链表;