javaSE集合

集合

在这里插入图片描述
在这里插入图片描述

1、ArrayList

1.1初始化(new)
  1. 在指定长度(有参构造器)时在创建对象时会创建对应的数组
  2. 没有指定长度(空参构造器)时在创建对象时,不创建数组
  3. 当第一次调用add()方法时,会默认创建容量为10的集合
//指定数组大小容量
ArrayList list = new ArrayList(7);
//-------------源码
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}


//不指定
ArrayList list1 = new ArrayList();

//-----------------源码
public ArrayList() {
  this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

1.2、扩容
  • 扩容为原来的1.5倍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:当使用空参构造器创建ArrayList时,一开始时没有给List创建存储数组的,在第一次调用add()方法时创建

1.3、特点
  • 不是线程安全的
  • 查询、修改效率高(根据下标查询indexOf();根据下标修改add(index,value))

2、Vector

Vector实现上与ArrayList相似,只是Vector是线程安全的,因为Vector中许多方法都被synchronized修饰,因此这些方法变成了同步方法
特点:
1、Vector 线程安全
2、效率比较低

3、LinkedList

1、LinkedList使用节点进行存储数据
2、节点中存在数据域和指针域

private static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}
3.1、初始化

初始化时不创建第一个节点,当调用第一次add()方法时才创建表头。

3.2、特点
  1. 容量理论上是没有限制的
  2. 通过节点的指针可以快速获取临近节点
  3. 添加和删除效率高、遍历(查询)效率低
  4. 不是线程安全的

4、HashSet

HashSet 底层使用HashMap实现的(甚至可以说两者共用代码)。
HashSet是利用HashMap中的key进行存储。

4.1、特点
  1. 无序性(不是随机性)
  2. 不可重复
  3. 线程不安全
4.2、初始化
  1. jdk1.7前在new时创建初始容量为16的Node<K,V>[ ]数组
  2. jdk1.8以后是在第一次put()时创建长度为16的Node<K,V>[ ]数组
4.3、扩容——原来的2倍
  • HashSet里面有几个重要的常量:
  1. DEFAULT_LOAD_FACTOR 默认的加载因子:0.75(这个加载因子决定了数组什么时候扩容)
  2. DEFAULT_INITIAL_CAPACITY HashMap(HashSet就是用HashMap实现的)的初始容量:16
  3. threshold 扩容临界值:threshold = DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR

当 Node<K,V>[ ]数组的长度大于等于扩容临界值(threshold)时, Node<K,V>[ ]数组会扩容为原来的两倍。为什么不是等到容量到达最大容量时扩容呢?因为节点插入的位置是根据 i = (n - 1) & hash 计算出来的。因此不一定能恰好将数组所有的位置填满。

4.4、如何确保加入的元素是唯一的

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意:如果添加的元素是自定义类的对象需要重写hashCode()和equals()方法,否者HashSet无法判断两个对象是否相等。因为hash值是通过hashCode()计算出来的。像String 的 equals()是重写过的。

5、LinkedHashSet

LinkedHashSet与HashSet实现原理相似,只是LinkedHashSet的节点添加了before节点和after节点,这两个节点用来记录此节点的前节点和后节点的地址(引用)
在这里插入图片描述

5、TreeSet

TreeSet多用于排序,TreeSet是一颗树。
规定左节点比根节点小,右节点比根节点大

6、HashMap

HashMap的实现原理于HashSet一致。
先判断key是否(存在)添加过。不存在直接将key、value以node节点的方式存储到数值中,如果key存在,就将value的值替换。

6.1、扩容
  1. jdk7 :底层结构是数组+链表
  2. jdk8:底层是数组+链表+红黑树
  3. 何时将链表转换为红黑树:当链表的长度大于8且整个数组的长度大于64时,将链表转换为红黑树(为了加快搜索速度,链表过长不利于遍历)

7、HashTable

特点:
1、线程安全
2、kay和value都不能为null

8、HashTable的子类——Properties

特点:用于读取.Properties文件,结合io流使用

FileInputStream fileInputStream = new FileInputStream("src/classreflex/jdbc.properties");
Properties properties = new Properties();
properties.load(fileInputStream);
String user = properties.getProperty("user");
System.out.println(user);
String password = properties.getProperty("password");
System.out.println(password);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值