【韩顺平讲Java】Java集合专题 -ArrayList HashMap HashSet List Map TreeMap
01----集合的理解和好处
- 可以动态保存任意多个对象,比较方便。
- 提供了一系列操作对象的方法:
add()
,remove()
,set()
,get()
。
02----集合的框架体系
- 单列集合
- 双列集合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cotMTIEA-1640566300154)(E:[HanShunping] Java Collection\笔记\01.png)]
03----集合的常用方法
import java.util.ArrayList;
import java.util.List;
public class CollectionMethod {
public static void main(String[] args) {
List list = new ArrayList();
//add 添加元素
list.add("jack");
list.add(10);
list.add(true);
//remove 删除元素
list.remove(0); //删除第一个元素
list.remove(true);
System.out.println(list);
//contains 查找元素是否存在
System.out.println(list.contains("jack"));
//size 获取元素个数
System.out.println(list.size());
//isEmpty 判断是否为空
System.out.println(list.isEmpty());
//clear 清空
list.clear();
//addAll 添加多个元素
List list2 = new ArrayList();
list2.add("wang");
list2.add(100);
list.addAll(list2);
//cintainsAll 查找多个元素是否都存在
list.containsAll(list2);
//removeAll 删除多个元素
list.removeAll(list2);
}
}
04----迭代器遍历
iterator.hasNext()
:判断是否有下一个元素。
import java.util.ArrayList;
import java.util.Iterator;
public class CollectionIterator {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("Wang");
arrayList.add("Zhao");
arrayList.add("Qian");
//生成迭代器
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
05----增强 for
循环
增强 for
底层仍然是迭代器。
for(Object obj : arrayList){
System.out.println(obj);
}
07----List
接口方法
- 有序可重复(添加,取出顺序一致)
- 支持索引
- 可根据序号存取容器中的元素
ArrayList
线程不安全,效率高Vector
线程安全LinkedList
线程不安全
add(int index, Object ele)
:在 index 位置插入 ele 元素
addAll(int index, Collection eles)
:从 index 位置开始将 eles 中所有元素添加进去
get(int index)
:获取指定位置的元素
indexOf(Object obj)
:返回 obj 首次出现的位置
lastIndexOf()
:
remove(int index)
:删除指定位置的元素,并返回此元素
set(int index, Object ele)
:设置指定位置的元素为 ele
subList(int fromIndex, int toIndex)
:返回从 fromIndex 到 toIndex 位置的子集合
12----ArrayList
底层结构和源码分析
ArrayList
中维护了一个Object
类型的数组elementData
,transient Object[] elementData
。- 当创建
ArrayList
对象时,如果使用的是无参构造器,则初始elementData
容量为0,第一次添加数据时扩容elementData
为10,如需要再次扩容,则按照 1.5倍 增加。 - 当使用指定大小的构造器时,则初始
elementData
容量为指定大小,如需要扩容,则按照 1.5倍 增加。
16----Vector
底层结构和源码分析
Vector
中维护了一个Object
类型的数组elementData
,transient Object[] elementData
。- 当创建
Vector
对象时,如果使用的是无参构造器,则默认elementData
容量为10,如需要扩容,则按照 2倍 增加。 - 当使用指定大小的构造器时,则初始
elementData
容量为指定大小,如需要扩容,则按照 2倍 增加。
17----LinkedList
底层结构和源码分析
- LinkedList
的底层操作机制
LinkedList
底层维护了一个双向链表- 维护了两个属性
first
和last
分别指向首节点和尾节点 - 每个节点
Node对象
里面又维护了prev
,next
,item
三个属性,其中通过prev
指向前一个,next
指向后一个节点,最终实现双向链表 - 所以
LinkedList
的元素的添加和删除不是通过数组完成的,相对说效率较高
20----Set
接口和常用方法
- 无序不可重复
- 没有索引
21----HashSet
HashSet
实现了Set
接口HashSet
实际上是HashMap
- 可以存放
null
值,但只能有一个 HashSet
不保证元素是有序的,取决于hash
后,再确定索引结果- 元素,对象不可重复
经典Java
面试题:
Set set = new HashSet();
set.add(new Dog("tom")); //Ok
set.add(new Dog("tom")); //Ok
set.add(new String("hsp")); //Ok
set.add(new String("hsp")); //false
22----数组链表模拟
Node[] table = new Node[16];
Node john = new Node("john", null);
table[2] = john;
Node jack = new Node("jack", null);
john.next = jack; //jack挂载到john后
class Node{
Object item;
Node next; //单向链表
public Node(Object item, Node next){
this.item = item;
this.next = next