1、集合与数组
集合:集合是java中提供的一种容器,可以用来存储多个数据。
集合和数组既然都是容器,它们有啥区别呢?
1.数组的长度是固定的。集合的长度是可变的。
2.数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以.
不一致。在开发中一般当对象多的时候,使用集合进行存储。
2、介绍
为了可以满足用户数据更多种的逻辑关系,而设计的一系列的不同 于数组的可变的聚合的抽象数据类型。
这些接口和类在java.uti包中,因为类型很丰富,因此我们通常称为集合框架集。
集合主要分为两大系列: Collection和Map, Collection 表示一组对象,Map表示一组映射关系或键值对。
3、Collection
存储元素集合,Collection 接口又有3种子类型,List. Set 和Queue,再下面是一些抽象类,最后是具
体实现类;
Collection的实现类只能存储引用类型,所以对于基本数据类型, Collection的实 现类只能存储他们的包装
类。
任何对象加入集合类后,如果集合没有使用泛型,会自动转变为Object类型,在取出的时候,需要进行强
制类型转换;使用泛型之后不用强制转换。
3.1 Set
Set接口的实现类存储的数据是无序的,元素不重复的
//创建一个Set集合
Set<String> set = new HashSet<>();
//判断集合是否为空null
System. out. printIn(set. isEmpty());
//集合增加元素
set. add("a");
set. add("b");s
//判断集合中是否存在指定元素
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());
3.2 List
List接口的实现类存储的数据是有序的,元素可重复的;
List接口主要有两个实现类: ArrayList和LinkedList;
LinkedList与ArrayList的区别:
1) ArrayList是实现了基于动态数组的数据结构,在未声明长度的情况下,默认长度是10,数据溢出自动扩充。
2) LinkedList基于链表的数据结构。
3)对于随机访问get和set (即查找元素),ArrayList觉得优于LinkedList, 因为LinkedList要移动指针。
4)对于新增和删除操作add和remove, LinedList比较占优势,因为ArrayList要移动数据。
4.Map
Map中存储键值对(Key-Value)
HashMap是Map接口的实现类,该类根据键的hashcode值存储数据
Map的特点:
1) key和value只能是引用类型的数据
2) Map的key不允许重复
3)多次给同一个键名赋值,后面的会把前面的赋值覆盖
4)key可以为null,值可以多个为空
Map<String,Student> map = new HashMap<>();
map. put("A01", new Student());
map. put("A02",new Student());
Student stu = new Student();
stu.name = "张三" ;
map. put("A01", stu);//覆盖前面的数据
System. out. println(map. size());//2
Student S =map. get("A02");//获得value
//通过keySet方法获取到所有key值的set集合
for (String k1 : map. keySet()) {
System. out. println(map.get(k1));
}
//遍历map所有的值
for (Integer key : set) {
System. out . println(key); //打印键名
Sys' tem. out . print ln(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 ten = m2.size();
System. out. println(len);
//打E印map中的元素
System. out . println(m2. toString());
//获取所有的值的集合
Collection<Integer> list3 = m2. values();
for (Integer integer : list3) {
System. out. println( integer);
}
// values方法,把所有的值拿出来
for (Student st : map.values()) {
System. out. println(st);
}
// entry 代表的是键值对,最推荐使用
for (Map. Entry<String, Student> entry : map. entrySet()) {
String key = entry. getKey();
Student stu2 = entry. getValue();
}
map. remove("A02");
boolean b = map. containsKey("A01");
//map. containsValue(new Student());
System. out. println(map) ;
5、HashMap
HashMap的底层存储结构为:数组加链表,jdk1.8之后 又加入了红黑树。
1) HashMap底层就是一个数组结构,数组中的每一个元素又是一 个链表。当新建一个HashMap的时候,就
会初始化-个数组。
2)允许null值和null键
3) Entry就是数组中的元素(k-v,每个Map.Entry 其实就是一个key- -value键值对,它持有一个指向下一 个
元素的引用,这就构成了链表
4)当添加一个元素(key- -value) 时,首先计算元素的key的hash值,以此来确定插入数组中的位置;
5)如果hash值相同,这时就添加到同-个hash值(hashCode) 的元素的后面,他们在数组的同一位置,
于是形成了链表
6)当链表长度大于8且元素(k-v) 个数超过64时,链表就转换为红黑树,这样就提高了查找的效率;
7)当红黑树中的节点个数小于6时,红黑树又重新转换为链表;