我是南城余!阿里云开发者平台专家博士证书获得者!
欢迎关注我的博客!一同成长!
一名从事运维开发的worker,记录分享学习。
专注于AI,运维开发,windows Linux 系统领域的分享!
本章节对应知识库
集合框架 (yuque.com)
面试相关
集合中安全与不安全的类
不安全:ArrayList、HashMap、HashSet
安全:Vector、Hashtable
两种遍历集合的方式
public class exer1 {public static void main(String[] args) {HashMap hashMap = new HashMap();hashMap.put("张杰","逆战");hashMap.put("邓紫棋","喜欢你");hashMap.put("群星","逆战");hashMap.put("张杰","天下");//遍历 方式1Iterator iterator = hashMap.keySet().iterator();while (iterator.hasNext()){System.out.println(iterator.next());}System.out.println("======");Iterator iterator1 = hashMap.keySet().iterator();;while (iterator1.hasNext()){System.out.println(iterator1.next());}//遍历方式2:增强for循环System.out.println("======");for(Object obj: hashMap.entrySet()){System.out.println(obj);}}
}
数组存储的特点
》数组一旦初始化,其长度是确定的
》数组中的多个元素是依次紧密排列的,有序的,可重复的
》(优点)数组一旦初始化完成,其元素的类型就确定的。不是此类型的元素,就不能添加到此数组中
int[] arr = new int[10];
arr[1] = 1;
arr[2] = "aa"; //编译报错Object[] arr1 = new Object[10];
arr[0] = new String();
arr[1] = new Date();
(优点)元素的类型既可以是基本数据类型,也可以是引用数据类型
数据存储的弊端
》数组一旦初始化,其长度就不可变
》数组中存储数据特点单一,对于无序的、不可重复的场景的多个数据就无能为力
》数组中可用的方法、属性都极少。具体的需求,都需要自己来组织代码逻辑
集合框架(java.util包下)
java.util.Collection:存储一个一个的数据
子接口:List:存储有序的、可重复的数据(动态数组)
ArrayList(主要实现类)、LinkedList、Vector
子接口:Set:存储无序的、不可重复的数据
HashSet(主要实现类)、LinkedHashSet、TreeSet
java.util.Map :存储一对一对的数据(key-value键值对,(x1、y1)(x2、y2)->y=f(x),类似于高中的函数)
HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties
集合与数组的相互转换
集合——》数组:toArray()
数组——》集合:调用Arrays的静态方法asList(Object ... objs),返回一个List
Collection
向Collection中添加元素要求
要求元素所属的类的equals()方法重写
原因:
因为Collection中的相关方法(contains()/remove())在使用时,要调用元素所在类的equals()方法。
迭代器(Iterator)
迭代器是用来遍历Collection,不能用来遍历Map(因为Map里面存储的键值)
设计模式的一种
迭代器不负责存储数据,只用来遍历集合元素
迭代器创建对象
Iterator itertor = 对象名.Iterator();
遍历Iterator对象
while(iterator.hasNext()){
System.out.pringtln(iteror.next());
}
增强for循环(foreach循环)(jdk5)
作用
用来遍历数组、集合
for(要遍历的集合或数组的类型 临时变量名:要遍历的集合或数组的变量名){
操作临时变量的输出
}
说明
》针对集合来讲,增强for循环的底层仍然使用的是迭代器
》增强for循环的执行过程,是将集合和数中的元素依次赋值给临时变量,注意,循环体对临时变量的修改,可能不会导致原有集合和数组中的元素的修改。
一般for循环
一般for循环是用来遍历List
List
由于时Colletion类的子类,所以Colletion类方法List都可以使用
但是继承关系,所以新增了多种方法
增
add(Object obj)
addAll(Collection coll)
删
remove(Obeject obj)
remove(int index)
改
set(int index,Object ele)
查
get(int index)
插
add(int index,Object ele)
addAll(int index,Collection eles)
长度
size()
遍历
Iterator()
增强for循环
一般for循环
List实现类
java.util.Collection:存储一个一个的数据
子接口:List:存储有序的、可重复的数据(动态数组)
ArrayList:List的主要实现类;线程不安全;底层使用Object[]数组存储
在添加数据、查找数据时,效率高效,在插入、删除数据时,效率低效
LinkedList:底层使用双向链表的方式进行存储数据;在对集合中的数据进行频繁删除,插入操作 时,建议使用此类
在插入数据、删除数据时,效率较高,在添加数据、查找数据时,效率低效
Vector:List的古老实现类;线程安全的,效率低;底层使用Object[]数组储存
Set
Set实现类
java.util.Collection:存储一个一个的数据
子接口:Set:存储无序的、不可重复的数据
HashSet:主要实现类,底层使用的时HashMap,即使用的是数组+单向链表+红黑树进行存储
LinkedHashSet:是HashSet子类,在现有的数组+单向链表+红黑树结构基础上,又添加 了一组双向链表,用于记录添加的元素先后顺序。即我们可以按照添加元素的顺序进行遍历
TreeSet:底层使用红黑树进行存储,可以按照添加的元素的指定属性的大小顺序进行遍历。
开发中,Set使用频率比List、Map少,用来过滤重复数据
无序性:!=随机性
添加元素的顺序和遍历的元素的顺序不一致,是不是无序性呢?No!
这里的无序性,指的是与添加的元素的位置有关,不像ArrayList一样依次紧密排列
这里根据的是添加元素的哈希值,计算的其在数组中的存储位置。此位置不是依次排列的,表现为无序性
不可重复性:
是根据哈希值先判断两个存储数据的哈希值是否相等,若相等,则判断值是否相等,或者是否存 在,不存在则放入,存在则覆盖数据。
比较标准,需判断hashCode()得到的哈希值以及equals()得到的boolean型的结果
哈希值相同且equals()返回true,则认为元素相同
添加到HashSet和LinkedHahSet元素的要求
要求元素所在类要重写两个方法:equals()和hashCode()
TreeSet
底层使用红黑树进行存储,可以按照添加的元素的指定属性的大小顺序进行遍历。
添加元素的属性必须保持一致,否则会保错异常ClassException
必须考虑排序:①自然排序②定制排序
判断数据是否相同的标准
不再是考虑hashCode()和equals()方法,也意味着添加到TreeSet中的元素所在的类不需要重写这两种方法
比较元素的方法为排序:①自然排序②定制排序(compareTo()或者compare()的返回值)
如果compareTo()或者compare()的返回值为0,则认为两个对象相等
由于TreeSet中存放的元素不能相同,则后一个元素如果i相同,则不能添加到TreeSet中
Map
java.util.Map:存储一对一对的数据(key-value键值对,(x1,y1),(x2,y2)->y=f(x))
HashMap:主要的实现类,线程不安全,效率高,可以添加null的key和value的值,底层使用的 数组+单向链表+红黑树结构存储
LinkedHashMap:是HashMap的子类,在HashMap使用的数据结构基础上,增加了一 对双向链表,用于记录添加的元素的先后顺序,即添加的顺序即为打·· 印输出的顺序,进而遍历元素时,就可以按照添加的元素显示
TreeMap:底层使用的红黑树存储,可以添加按照key-value中的key元素指定的属性大小顺序遍 历,需要考虑①自然排序②定制排序(compareTo()或者compare()的返回值)
Hashtable:古老的实现类,线程安全,效率低,不可以添加null的key或value的值;底层使用的是数组+单向链表存储
Properties:其key和value都是String类型。常用来处理属性文件
HashMapkey存储位置
存储在数组+链表+红黑树。key、value作为树的node属性出现。
HashMap中的元素特点
》HashMap中的所有的key彼此之间是不可重复的,无序的。所有的key就构成了一个Set集合。——》key所在类要重写HashCode()和equals()方法
》HashMap中的所有的value彼此之间是可重复的、无序的。所有的value就构成一个Collection集合——》value所在的类要重写equals()
》HashMap中的一个key—value,就构成了一个entry
》HasnMap中的所有entry彼此之间是不可重复的、无序的。所以entry就构成了一个Set集合
Map中的常用方法
- 添加、修改操作:
-
- Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
- void putAll(Map m):将m中的所有key-value对存放到当前map中
- 删除操作:
-
- Object remove(Object key):移除指定key的key-value对,并返回value
- void clear():清空当前map中的所有数据
- 元素查询的操作:
-
- Object get(Object key):获取指定key对应的value
- boolean containsKey(Object key):是否包含指定的key
- boolean containsValue(Object value):是否包含指定的value
- int size():返回map中key-value对的个数
- boolean isEmpty():判断当前map是否为空
- boolean equals(Object obj):判断当前map和参数对象obj是否相等
- 元视图操作的方法:
-
- Set keySet():返回所有key构成的Set集合
- Collection values():返回所有value构成的Collection集合
- Set entrySet():返回所有key-value对构成的Set集合
import java.util.HashMap;public class TestMapMethod {public static void main(String[] args) {//创建 map对象HashMap map = new HashMap();//添加元素到集合map.put("黄晓明", "杨颖");map.put("李晨", "李小璐");map.put("李晨", "范冰冰");map.put("邓超", "孙俪");System.out.println(map);//删除指定的key-valueSystem.out.println(map.remove("黄晓明"));System.out.println(map);//查询指定key对应的valueSystem.out.println(map.get("邓超"));System.out.println(map.get("黄晓明"));}
}
TreeMap
底层使用红黑树进行存储,可以按照添加的key-value的中key元素的指定属性的大小顺序进行遍历。
添加元素的属性必须保持一致,否则会保错异常ClassException
必须考虑排序:①自然排序②定制排序
向TreeMap中添加的key属性必须保持一致,即唯一
Properties
Properties是HashTable的子类
Colletions
Collections是一个操作Set、List、Map等集合的工具类
Colletion和Colletions的区别
Colletion:集合框架的接口,其子类包括Set、List等子接口
Collections是一个操作Set、List、Map等集合的工具类
Map不是直接继承自Collection接口。实际上,Map是继承自Collection接口的另一个接口,叫做Map接口。Map接口提供了键值对数据的存储和访问方法,与Collection接口提供的基本集合操作方法不同。
以下是一些与Map相关的常用实现类:
- HashMap:基于哈希表的实现,提供快速的插入和查找操作。
- TreeMap:基于红黑树的实现,按键进行排序,可以进行二分查找。
- LinkedHashMap:在HashMap的基础上,通过链表维护插入顺序或访问顺序。
- ConcurrentHashMap:支持高并发访问的线程安全Map实现。
这些实现类都是基于Map接口的扩展,具有不同的特性和适用场景。
常用方法
Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法(均为static方法):
排序操作:
- reverse(List):反转 List 中元素的顺序
- shuffle(List):对 List 集合元素进行随机排序
- sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
- sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
- swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
查找
- Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
- Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
- Object min(Collection):根据元素的自然顺序,返回给定集合中的最小元素
- Object min(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最小元素
- int binarySearch(List list,T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且必须是可比较大小的,即支持自然排序的。而且集合也事先必须是有序的,否则结果不确定。
- int binarySearch(List list,T key,Comparator c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且集合也事先必须是按照c比较器规则进行排序过的,否则结果不确定。
- int frequency(Collection c,Object o):返回指定集合中指定元素的出现次数
复制、替换
- void copy(List dest,List src):将src中的内容复制到dest中
- boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
- 提供了多个unmodifiableXxx()方法,该方法返回指定 Xxx的不可修改的视图。
添加
- boolean addAll(Collection c,T... elements)将所有指定元素添加到指定 collection 中。
同步
- Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题: