遗漏知识点
- transient --> 序列化相关的知识
- 集合的概念
- Collection接口
- List接口与实现类
- 泛型和工具类
- Set接口与实现类
- Map接口与实现类
集合的概念
集合:对象的容器,实现了对对象常用的方法,可实现数组的功能
与数组的区别
- 数组长度固定,集合长度不固定
- 数组可以存储基本类型和引用类型,集合只能存储引用类型
位置:java.util.*
Collection接口
![[Pasted image 20250826235508.png]]
Collection: 该体系结构的根接口,代表一组对象,称为“集合”
List:有序,有下标,元素可重复
Set:无序,无下标,元素不能重复
Collection
特点:代表一组任意类型的对象,无序、无下标、不能重复。
方法:
boolean add (Object obj) //添加一个对象到集合中。
boolean addAll (Collection c) //把一个集合里的所有对象,都添加到当前集合里。
void clear () //清空当前集合里的所有对象。
boolean contains (Object o) //检查当前集合里有没有 o 这个对象。
boolean equals (Object o) //对比当前集合和指定对象(需是集合类型等可比较情况 )是否相等。
boolean isEmpty () //判断当前集合是不是空的(没有元素 )
boolean remove (Object o)//从当前集合里移除 o 这个对象。
int size () //返回当前集合里元素的个数。
Object [] toArray () //把当前集合转换成对象数组。
iterator() //迭代器
a.removeAll(Collection<> c) //删除全部c在a中出现过的元素
a.retainAll(Collection<> c) // 保留a和c中的交集部分
特别注意:遍历元素
- 增强for
- 迭代器
//3.1 使用增强 for
for (Object object : collection) {
System.out.println (object);
}
//3.2 使用迭代器 (迭代器专门用来遍历集合的一种方式)
//hasNext (); 有没有下一个元素,
//next (); 获取下一个元素
//remove (); 删除当前元素
Iterator it=collection.iterator ();
while (it.hasNext ()) {
String s=(String) it.next ();
System.out.println (s);
}
List
特点:有序,有下表,元素可以重复
int indexOf(Object o) //返回列表中第一次出现的指定元素的索引,如果不包含该元素,就返回-1
int lastIndexOf(Object o) // 返回此列表中最后出现的指定元素的索引,如果列表不包含此元素,则返回-1
E set(int index,E element) //用指定元素替换列表中指定位置的元素
实现类
- ArrayList
- 数组结构实现,查询快,增删慢
- JDK1.2版本,运行效率快,线程不安全
- Vector
- 数据结构实现,查询快,增删慢
- JDK1.0版本,运行效率慢,线程安全
- LinkedList:
- 链表结构实现,增删快,查询慢
源码分析
-
ArrayList结论:没有添加任何元素时,容量为0,添加一个元素之后,容量为10;扩容是按照1.5倍 -
LinkedList结论:存储结构双向链表 -
区别:ArrayList,必须开辟连续空间,查询快,增删慢;LinkedList:无需开辟连续空间,查询慢,增删快
泛型
-
概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致。
-
特点:
- 编译时即可检查,而非运行时抛出异常。
- 访问时,不必类型转换(拆箱)。
- 不同泛型之间引用不能相互赋值,泛型不存在多态。
Set
方法全部继承与Collection 方法
-
HashSet(重点)
- 基于HashCode计算元素存放位置
- 当存入元素的哈希码相同时,会调用equals进行确认,结果为true,则拒绝后者存入
- 存储结构:哈希表(数组+链表+红黑树)
-
存储对象的时候,需要重写一下
hashCode和equals -
TreeSet:
- 存储结构:红黑树
- 基于排列顺序实现元素不重复。
- 实现了 SortedSet 接口,对集合元素自动排序。
- 元素对象的类型必须实现 Comparable 接口,指定排序规则。
- 通过 CompareTo 方法确定是否为重复元素。
TreeSet<Person> persons = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int n1 = o1.getAge() - o2.getAge();
int n2 = o1.getName().compareTo(o2.getName());
return n1 == 0 ? n2 : n1;
}
});
Person p1 = new Person("xyz", 20);
Person p2 = new Person("hello", 22);
Person p3 = new Person("zhangsan", 25);
persons.add(p1);
persons.add(p2);
persons.add(p3);
注:也可以不实现Comparable 接口,指定排序规则。而是在创建 TreeSet 的时候,使用匿名内部类
Map
特点:存储一对数据,无序,无下标,键不可重复,值可以重复
// 添加
map.put(key,values);
// 删除
map.remove(key);
// 拿到key
Set<T> keyset = map.keyset();
// 获取value
map.get(key)
// 一种遍历方式
System.out.println("-----entrySet()-----");
//Set<Map.Entry<String, String>> entries=map.entrySet();
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey()+"--------"+entry.getValue());
}
实现类
- HashMap
- 存储结构:数组+链表+红黑树
- 使用key用hashcode和equals作为判断重复依据
(1) HashMap 刚创建时,table 是 null,为了节省空间,当添加第一个元素时,table 容量调整为 16
(2) 当元素个数大于阈值 (16×0.75=12) 时,会进行扩容,扩容后大小为原来的 2 倍。目的是减少调整元素的个数。
(3) jdk1.8 当每个链表长度大于 8,并且数组元素个数大于等于 64 时,会调整为红黑树,目的提高执行效率
(4) jdk1.8 当链表长度小于 6 时,调整成链表
(5) jdk1.8 以前,链表时头插入,jdk1.8 以后时是尾插入
- TreeMap
- 存储结构:红黑树
工具类
概念:集合工具类,定义了除了存取以外的集合常用方法
public class Demo4 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(20);
list.add(5);
list.add(12);
list.add(30);
list.add(6);
//sort排序
System.out.println("排序之前:" + list.toString());
Collections.sort(list);
System.out.println("排序之后:" + list.toString());
}
}
sort() //排序
binarySearch() //二分查找,需要排序好的数组
copy(dest,list) //注意容量大小
reverse() //反转
shuffle() //打乱
list.toArray(new xxx[0]) //把集合转换成数组
Arrays.asList() //将数组转换成集合,该集合是一个受限集合,不能添加和删除

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



