集合
一、List
1、泛型
作用:
增强程序的稳定性与可读性
强制检测数据的类型
写法:
//中括号内可以放入任意引用数据类型
List<String> list=new ArrayList<>();
2、List的一些常用方法
方法名 | 作用 |
---|---|
of() | 生成定长的列表 |
get() | 获取对应索引的元素 |
set() | 在对应索引设置元素 |
remove() | 移除索引处的元素 |
subList() | 截取对应范围内的元素返回新的集合 |
3、列表迭代器
ListIterator()
提供了一些与索引有关的方法,具体可以查看API
二、ArrayList
1、ArrayList :
底层结构: 可变数组
优点: 根据索引查询效率高,访问速度快
缺点: 增删涉及到数组的拷贝问题等效率较低
应用场景: 大量做查询,少量做增删的情况下适合使用ArrayList存储数据
扩容: 初始容量为10,扩容机制->int newCapacity = oldCapacity + (oldCapacity >> 1);
每次扩容原容量的1.5倍,利用Arrays.copyOf实现扩容
新增方法: void forEach(Consumer<? super E> action) 对 Iterable每个元素执行给定操作,直到处理 Iterable所有元素或操作引发异常。
2、Vector
向量 有序可重复
Vector 与 ArrayList 区别:
ArrayList 线程不安全,不同步->效率较高 ;Vector 是线程安全,同步 -> 效率较低
ArrayList->每次扩容原容量的1.5倍 Vector 每次扩容原容量的2倍,ArrayList更有利于内存的节约
三、LinkedList
特点: 有序,可重复
底层结构: 双向链表
优点 : 做查询效率较低
缺点 : 做增删效率较高
应用场景 : 大量做增删少量做查询推荐使用LinkedList
新增功能 : 新增了一些可以操作链表头尾的方法
代码简单实现LinkedList效果
import java.util.Objects;
public class LinkedListTest {
public static void main(String[] args) {
Link link = new Link();
link.add("张三");
link.add("李四");
link.add("王五");
link.add("赵六");
System.out.println(link.size());
System.out.println(link.get(1));
System.out.println(link);
}
}
class Link {
private Ceil head;
private int size;
public Link() {
}
public void add(Object o) {
Ceil newCeil = new Ceil(o, null);
if (head == null&&size==0) {
head = newCeil;
size++;
return;
}
Ceil c = head;
while (c.getCeil() != null) {
c = c.getCeil();
}
c.setCeil(newCeil);
size++;
}
public Object get(int index){
if(index <0 || index>=size){
throw new IndexOutOfBoundsException(index+"索引越界啦!!!");
}
Ceil c = head;
for(int i=0;i<size;i++){
if(i == index){
return c.getO();
}
c = c.getCeil();
}
return null;
}
public int size() {
return this.size;
}
@Override
public String toString() {
return "Link{" +
"head=" + head +
", size=" + size +
'}';
}
}
class Ceil {
private Object o;
private Ceil ceil;
@Override
public int hashCode() {
return Objects.hash(o, ceil);
}
@Override
public boolean equals(Object o1) {
if (this == o1) return true;
if (o1 == null || getClass() != o1.getClass()) return false;
Ceil ceil1 = (Ceil) o1;
return Objects.equals(o, ceil1.o) &&
Objects.equals(ceil, ceil1.ceil);
}
@Override
public String toString() {
return "Ceil{" +
"o=" + o +
", ceil=" + ceil +
'}';
}
public Object getO() {
return o;
}
public void setO(Object o) {
this.o = o;
}
public Ceil getCeil() {
return ceil;
}
public void setCeil(Ceil ceil) {
this.ceil = ceil;
}
public Ceil(Object o, Ceil ceil) {
this.o = o;
this.ceil = ceil;
}
public Ceil() {
}
}
四、Set
特点:无序,去重
新增一个静态方法:Set.of();
无序: 存放的顺序与内部真实存储的顺序不一致(内部与自己存储的规则)
去重: 两个数据调用equals方法返回值true,相同需要去重,false不同可以添加
遍历方式 :
1.for each
2.迭代器 iterator
HashSet
底层结构: 哈希表 (数组+链表+红黑树) ->是由HashMap维护
优点 : 查询,增删效率较高
缺点 : 无序
应用场景: 实现不存储相同数据,查询,增删效率较高的时候建议使用HashSet
新增功能: 无新增功能
去重: 需要在存储数据的类型中重写hashcode与equals方法实现数据的去重
哈希表:
当ArrayList.lrngth() > 64 && LinkedList.size() > 8时,变成红黑树