Java集合

143 阅读3分钟

Collection(单列集合 value)

  • 有两个重要的接口,list、set
  • collection实现子类可以存放多个元素,每个元素可以是Object
  • 有些Collection的实现类,可以存放重复的元素,有些不可以
  • 有些Collection的实现类,有些是有序的(List),有些不是有序(Set)
  • Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的

List

  • List集合类中元素有序、且可重复
  • List集合中的每个元素都有对应的顺序索引,即支持索引
  • List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
  • 常用的:ArrayList、LinkedList、Vector
  • ArrayList

可变数组

  • LinkedList

双向链表

  1. 如果我们改查的操作多,选择ArrayList
  2. 如果我们增删的操作多,选择LinkedList
  3. 一般来说,在程序中,80%~90%都是查询,因此大部分情况下会选择ArrayList
  4. 在一个项目中,根据业务灵活选择,也可以这样,一个模块使用ArrayList,另一个模块是LinkedList.

Set

  • Set接口实现类的对象,不能存放重复的元素,可以添加一个Null
  • Set接口对象存放数据是无序的(即添加的顺序和取出的顺序不一致)
  • 取出的顺序的顺序随饭不是添加的顺序,但是它是固定的
  • 获取元素的时候不能通过索引去获取

HashSet

  • HashSet底层是HashMap
  • HashMap的底层是(数组+链表+红黑树)
  • 可以存放null,但是只能有一个
  • HashSet不保证元素是有序的,取决于hash后,在确定索引的结果
  • 不能有重复的元素
/*  1.HashSet底层是HashMap
    2.添加一个元素时,先得到hash值-会转成->索引值
    3.找到存储数据表table,看这个索引位置是否已经存放的有元素
    4.如果没有直接加入
    5.如果有,调用equals比较,如果相同,就放弃添加,如果不同,则添加到最后
    6.在Java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认是8),并且table的大小 >= MIN_TREEIFY_CAPACITY(默认是64)就会进行树化(红黑树)
*/

Vector

Map(双列集合 key-value)

  • Map用于保存具有映射关系的数据Key-Value
  • Map中的key和value可以是任何引用类型的数据额,会封装到HashMap$Node对象中
  • Map中的Key不允许重复,原因和HashSet一样
  • Map中的Value可以重复
  • Map的key可以为null,value也可以为null,注意key为null只能有一个,value为null可以多个
  • 常用String作为Map的key
  • key和value之间存在单向一对一关系,即通过指定key总能找到对应的value

Hashtable

  • 存放的元素是键值对:即key-value
  • hashtable的键和值都不能为null,否则会抛出NullPointerException
  • hashTable 使用方法基本上和HashMap一样
  • hashTable是线程安全的(synchronized),hashMap是线程不安全的

Properties

  • Properties类继承自Hashtable类并实现了Map接口,也是使用一种键值对的形式来保存数据
  • 它的会用特点Hashtable类似
  • Properties和可以用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改
  • xxx.properties文件通常作为配置文件

开发中如何选择集合实现类

    1. 先判断存储的类型
    1. 一组对象:Collection接口
    • 允许重复:List
    • 增删多:LiknedList(底层维护了一个双向链表)
    • 改查多:ArrayList(底层维护Object类型可变数组)
    • 不允许重复:Set
    • 无序:HashSet(底层是HashMap,维护了一个哈希表-即 数组+链表+红黑树)
    • 排序:TreeSet
    • 插入和取出的顺序一致:LinkedHashSet,维护数组+双向链表
    1. 一组键值对:Map
    • 键无序:HashMap(底层是:哈希表 jdk7:数组+链表 , jdk8:数组+链表+红黑树)
    • 键排序:TreeMap
    • 键插入和取出顺序一致:LinkedHasMap
    • 读取文件 Properties