re0:从零开始的Java学习生活15(连载)

集合

一、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时,变成红黑树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值