作者:浅浅的醉意_942_932 | 来源:互联网 | 2023-10-13 13:49
List接口和常用方法区别于collection方法,list接口方法只能list及其子接口能调用,collection、set等无法调用List接口是Collection接口的子
List接口和常用方法
区别于collection方法,list接口方法只能list及其子接口能调用,collection、set等无法调用
List接口是Collection接口的子接口
List集合类中元素有序且可重复(即添加顺序和取出顺序一致);
List集合中的每个元素都有对应的顺序索引,即支持索引;get(i);
JDK API中List接口的实现类很多,ArrayList、LinkedList和Vector只是常用实现类;
void add(int index , Object ele):在index位置插入elel元素;后续元素整体后移
boolean addAll(int index , Collection eles):在list集合的index位置开始将eles中的所有元素添加进来
Object get(int intdex):获取指定index位置的元素
int indexOf(Object obj):获取obj在集合中首次出现的位置;不包含返回-1
int lastIndexOf(Object obj):返回obj在集合中末次出现的位置;不包含返回-1
Object remove(int index):移除指定index位置的元素,并返回此元素;
Object set(int index , Object ele):设置指定index位置的元素为ele,等同替换;
List subList(int fromIndex , int toIndex):返回从fromIndex到toIndex位置的子集合;不包括toIndex
ListIterator
listIterator(int index):从列表中的index位置开始,返回列表中的元素(按正确顺序)的列表迭代器。
int sort(Comparator super E> c):使用指定的c(匿名内部类)排序方式对集合元素进行排序。
- Comparator是一个接口,提供一个方法:int compare(Object o1 , Object o2);
List接口遍历元素方式
方式一:使用iterator,同collection使用
方式二:增强for循环,同collection使用
方式三:普通for循环:长度为list.size();输出list.get(i);
for (int i = 0; i <list.size(); i++) {
System.out.println(list.get(i));
}
ArrayList底层结构和源码分析
ArrayList注意事项
能容纳所有类型对象,包括null,并且可放多个
ArrayList是由数组来实现数据存储的;
ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高,在多线程情况下,不建议使用ArrayList)
ArrayList的底层操作机制源码分析
底层是数组,频繁进行添加、删除,不建议使用
ArrayList中维护了一个Object类型的数组elementData:transient Object[] elementData;transient表示瞬时、短暂的;表示该属性不会被序列化,不会存入硬盘;
当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData的容量为0,第一次添加,扩容为elementData为10,如需再次扩容,则扩容为原来的1.5倍;即15--->22--->33--->49
如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如需扩容,则直接扩容为原来的1.5倍;0510韩顺平Java_ArrayList底层源码1哔哩哔哩_bilibili
Vector底层结构和源码分析
vector类的定义说明:
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
Vector底层也是一个对象数组,protected Object[] elementData;
创建对象:如果使用无参构造器,默认容量为10,添加时,扩容为原来的2倍;指定容器大小,添加时,扩容为原来的2倍;0513韩顺平Java_Vector源码解读哔哩哔哩_bilibili
Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized;
在开发中,需要线程同步安全时,考虑使用Vetor;
LinkedList底层结构
LinkedList的全面说明:
LinkedList底层实现了双向链表和双端队列特点;
不需要初始化容量
可以添加任意元素(元素可以重复),包括null;
有序,没有索引
线程不安全,没有实现同步;
封装了大量对于首、尾结点操作的API;
LinkedList的底层操作机制:
LinkedList底层维护了一个双向链表;
LinkedList中维护了两个属性first和last分别指向首节点和尾结点
每个结点(Note对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个结点。最终实现双向链表;
LinkedList元素的添加和删除依靠链表,不是通过数组完成的,相对来说效率较高;
0515韩顺平Java_LinkedList源码图解哔哩哔哩_bilibili
ArrayList和LinkedList比较
|
底层结构 |
增删的效率 |
改查的效率 |
---|
ArrayList |
可变数组 |
较低,数组扩容 |
较高 |
LinkedList |
双线链表 |
较高,通过链表追加 |
较低 |
set接口和常用方法
set接口介绍
无序(添加和取出的顺序不一致),没有索引;但取出的顺序是固定的,不会改变
不允许重复元素,所以最多包含一个null
JDK API中Set接口的实现类有:
set接口的常用方法
和List接口一样,Set接口也是Collection的子接口,因此常用方法和Collection接口一样;
Set<Integer> set = map.keySet();
Integer[] toArray = set.toArray(new Integer[0]);
Set接口的遍历方式
HashSet
HashSet的全面说明
HashSet实现了Set接口;
HashSet底层是哈希表结构,实际上是HashMap,(看源码);
public HashSet() {
map = new HashMap<>();
}
不能有重复元素/对象;详见:HashSet01.java
无索引
可以存放null,但只能有一个;
HashSet元素无序,位置取决于hash后,再确定索引的结果(无序的);
HashSet底层机制
添加元素,判断是否重复:详见HashSet_01
HashSet底层机制是HashMap,HashMap底层是(数组+单向链表+红黑树);数组链表模拟见HashSetStructure.java;
添加一个元素时,先得到hash值----转换成----->索引值,确定保存在哪个链表中;
找到存储数据表table,看这个索引位置是否已存放元素;如果没有,直接加入
如果有,调用equals比较此索引位置链表的每个元素,如果相同,就放弃添加;如果遍历链表没有相同的,则添加到链表的最后;
在Java 8中,如果一个链表的元素个数到达 TREEIFY_THRESHOLD(默认是8),并且table的大小>=MIN_TREEIFY_CAPACITY(默认64),就会进行树化(红黑树);
0521韩顺平Java_HashSet源码解读1哔哩哔哩_bilibili
不同的对象(即使是一样的两个对象)HashCode值一般不同,可以通过重写类的hashCode方法,实现两个一样的对象的HashCode值相同,重写equals方法,实现对象部分属性相同即相同,从而做到集合内自定义不重复
LinkedHashSet
LinkedHashSet底层机制
0528韩顺平Java_LHashSet源码解读哔哩哔哩_bilibili
数据结构