Java基础——集合

Java基础——常用集合

Collection体系集合:

image

Collection接口存储一组不唯一、无序的对象

List接口存储一组不唯一,有序(索引顺序)的对象。

Set接口存储一组唯一,无序的对象。

Map接口存储一组键值对象,提供key到value的映射。

  • key:唯一、无序
  • value:不唯一、无序

1. List集合

主要实现类有ArrayList和LinkedList,分别由顺序表和链表实现。另外还包括栈和队列的实现类:Deque和Queue。

特点:有序、不唯一(可重复)

ArrayList

  • 内存中分配连续空间,实现了长度可变的数组
  • 优点:遍历元素和随机访问元素的效率比较高
  • 缺点:添加和删除需要大量移动元素,按照内容查询效率低

LinkedList

  • 采用双向链表存储方式
  • 缺点:遍历和随机访问元素效率下降
  • 有点:插入、删除元素效率比较高

几种遍历方式

for循环

for(int i = 0; i < list.size(); i++){
    // ..
}

for-each循环

for(Object o: objects){
    //...
}

Iterator迭代

Iterator it = list.iterator();
while(it.hasNext()){ // 是否还有元素
    Object o = it.next(); // 取出来
    // ...
}

Lambda表达式

list.forEach((i)->
   	//...
)

2. Set集合

主要有HashSet和TreeSet,LinkedHashSet三种。特点是唯一(不重复)、无序。

Set是无序的,相比Collection没有添加任何方法。而List相比Collection添加了索引相关的方法,比如get(i),remove(i)等等。

HashSet

  • 采用哈希表存储结构
  • 优点:添加速度快、查询速度快、删除速度快
  • 缺点:无序

LinkedHashSet

是HashSet的子类。

  • 采用哈希表存储结构,同时使用链表维护次序
  • 有序(添加顺序)

TreeSet

  • 采用二叉树(红黑树)的存储结构
  • 优点:有序(自然顺序)、查询速度比List快(按照内容)、唯一
  • 缺点:查询速度没有HashSet快

基本操作

// 添加
set.add(object);
// 大小
set.size();
// 删除
set.remove(object);
// 由于无序,无法通过for i 遍历

两个问题

  1. 为什么HashSet、LinkedHashSet存储String是唯一的,但是存储Student不唯一了?
  2. 为什么TreeSet存储String是有序的,但存储Student却报异常?

原因:

​ String是系统类,已经做了某些操作,而Student是自定义类,某些操作还没有做。

​ 问题1解决:重写equals()和hashCode(),缺一不可。

​ 问题2解决:实现一个Comparable的接口,之重写方法compareTo中指定比较规则。

哈希表原理

如何添加数据?

  1. 计算哈希码(调用hashCode),结果是一个int值,整数的哈希码取自身即可。

  2. 计算在哈希表中的存储位置:y=k(x)=x%11

    x:哈希码,y:元素在哈希表中的存储位置

查询:

​ 和添加过程类似。

3. Map集合

HashMap

  • 优点:添加速度快、查询速度快、删除速度快
  • 缺点:key无序

LinkedHashMap

  • 采用哈希表存储结构,同时使用链表维护次序
  • key有序

TreeMap

  • 采用二叉树(红黑树)的存储结构
  • 优点:key有序,查询速度比List快
  • 缺点:查询速度没有HashMap快

基础操作

// 放入键值对
map.put("key", "value");
// 使用键获取值,未查找到则为null
value = map.get("key");
// 大小
map.size();
// 删除
map.remove("key");
// 遍历:三种方法:1.得到所有的key组成的set,遍历;2.得到所有Entry的set集合,然后使用iterator遍历
posted @ 2022-02-08 12:23  新衫如旧  阅读(57)  评论(0)    收藏  举报