集合概述
程序存储数据方式:
- 变量:单一的数据
- 数组:一组具有相同数据类型的数据
- 元素的数据类型都是相同的
- 长度不可变
- 对象:一组具有关联性的数据(变相)
例:存储学生数据:创建学生对象,存储学生姓名,年龄,身高,体重
存储多个学生数据:Student[] - 集合:
- 丰富多样的强大的数据存储(java给你提供的一大堆API)
集合的体系结构
在java.util 包(工具)
接口Collection:存储的是可重复(不唯一),无序的数据
- 接口List:存储的是可重复(不唯一),有序的数据
使用接口要找他们的实现类- ArrayList
- LinkedList
- 接口Set:存储的是不可重复(唯一),无序的数据
- HashSet
- TreeSet
**接口 Map:**存储的是键值对(key键-value值,键和值一一对应)数据
- HashMap
- HashTable
- properties
- TreeMap
List集合
ArrayList
动态数组
构造方法:
- ArrayList()
// 代码样式
ArrayList<数据类型> list = new ArrayList<>();
常用方法:
- add(E e) : boolean 存储指定类型(E:泛型类型)的元素
- add(int index, E element) : void 在指定下标位置存储指定类型的元素,原有位置的元素会依次后移
- remove(int index) : E 删除指定下标位置的元素,返回被删除的元素
- remove(Object obj) : boolean 删除指定的元素(如果有重复的,只会删除第一个找到的元素)
- set(int index, E element) : E 修改指定下标位置的元素,返回被替换的元素
- get(int index) : E 根据下标查询元素
- size() : int 查询集合中存储的元素数量
- contains(Object o) : boolean 判断集合中是否存在指定的元素
- indexOf(Object o) : int 查询指定元素在集合中的下标,找不到会返回 -1
- lastIndexOf(Object o) : int 从后往前查找指定元素在集合中的下标,找不到会返回-1
注意:从后往前查找,只不过是方向变化,下标还是正向的下标(不会变!) - clear() : void 清空集合
- isEmpty() : boolean 判断集合是否是空的(没有一个元素)
LinkedList
构造方法:
- LinkedList()
常用方法:
- addFirst(E e) : void 向前追加元素
- addLast(E e) : void 向后追加元素
- removeFirst() : E 删除第一个元素
- removeLast() : E 删除最后一个元素
- getFirst() : E 查询第一个元素
- getLast() : E 查询最后一个元素
其他方法略,大多和 ArrayList 一致,因为这些方法都是定义在 List 接口中,所以同为 List 接口实现类,当然都会重写相应的方法。
注意:方法名虽然相同,代表的只是方法功能一致,但不代表实现一致!
例如:add()、remove() …
ArrayList和LinkedList的区别(面试题)
相同点:
- 都是 List 接口的实现类,可以存储可重复的,有序的数据
不同点: - ArrayList 底层数据结构是数组结构,在实现数据的查询时,因为数组结构有下标,所以效率较高。但是,在增加或删除数据时,因为数组结构长度不可变,所以会创建一个新的数组,导致效率较低。
它适合于查询较多,增删较少的情况。 - LinkedList 底层数据结构是链表结构,在增加或删除数据时,尤其是首尾的增删,因为链表结构增加节点或删除节点,只需要修改下一个连接的地址即可,效率较高。但是,在实现数据的查询时,没有下标,只能从首节点依次进行查询,效率较低。
它适合于增删较多,查询较少的情况。
Set集合
HashSet
构造方法:
- HashSet()
常用方法:
- add(E e) : boolean 存储元素(去重数据)
- remove(E e) : E 删除数据
- size() : int 获取集合的元素数量
- contains(Object o) : boolean 判断是否包含指定的元素
因为 Set 和 List 都是继承自 Collection 接口,所以很多方法也是相同的。
注意: 如果用 Set 存储引用数据类型数据,需要重写相应类的 equals 和 hashCode 方法。不然,不认为是重复数据,不会去重。