collection接口
collection接口是层次接口中的根接口,构成collection的单位成为元素。collection接口通常不能直接使用,但该接口提供了添加元素,删除元素,管理数据的方法,由于list接口与set接口都继承了collection接口,因此这些方法对list集合与set集合哦通用的
list集合
List集合为列表类型,以线性方式存储对象。List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。用户可以通过使用索引来访问List集合中的元素。
ArrayList支持可随需要而增长的动态数组。在Java数组中,长度是固定的,因此在数组被创建后,不能修改长度,这意味着开发者需要实现知道数组的长度。但在一般情况下,只有在运行时才知道数组长度。为了解决这个问题,ArrayList因此而生。
Output:
list1初始长度为:0
list1加入元素后的大小:7
list1元素为:[A, B2, B, C, D, E, F]
list1删除元素后的大小:5
list1元素为:[B2, B, D, E, F] // 需要移动数据,使得B2作为index=0的元素。
注意,list1开始为空,随着元素的加入,大小增加。当每个元素被删除时,大小会每次变小。
底层是使用数组实现,所以查询速度快,增删速度慢
4.LinkedList集合
除了LinkedList继承的方法以外,它本身还定义了一些有用的方法。
addFirst()可以在列表头增加元素
addLast()可以在列表尾部增加元素
getFirst()可以获取第一个元素
removeFirst()可以删除第一个元素
removeLast()可以删除最后一个元素
getFirst() 返回此列表的第一个元素
getLast() 返回此列表的最后一个元素
LinkedList:是基于链表结构实现的,所以查询速度慢,增删速度快,提供了特殊的方法,对头尾的元素操作(进行增删查)
使用LinkedList实现栈
import java.util.LinkedList;
public class MyStack {
private LinkedList<String> linkList = new LinkedList<String>();
// 压栈
public void push(String str){
linkList.addFirst(str);
}
// 出栈
public String pop(){
return linkList.removeFirst();
}
// 查看
public String peek(){
return linkList.peek();
}
// 判断是否为空
public boolean isEmpty(){
return linkList.isEmpty();
}
}
public class Test {
public static void main(String[] args) {
StackTest stack = new StackTest();
stack.push("first");
stack.push("second");
stack.push("third");
stack.push("forth");
stack.push("fifth");
// 取出
while (!stack.isEmpty()){
String pop = stack.pop();
System.out.println(pop);
}
}
}
Output
fifth
fourth
third
second
first
也可实现队列。
5.ArrayList与LinkedList
ArrayList和LinkedList顾名思义,ArrayList是Array(动态数组)的数据结构,相当于动态数组;LinkedList是Link(链表)的双向数据结构,也可当作堆栈、队列、双端队列。
对于随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据(可以在上述ArrayList代码中体现)。
两者缺点都为线性不安全
ArrayList和LinkedList线程不安全,在多线程中不建议使用。
set集合
Set
对象是值的合集(collection)。集合(set)中的元素只会出现一次,即集合中的元素是唯一的。你可以按照插入顺序迭代集合中的元素。插入顺序对应于 add() 方法成功将每一个元素插入到集合中(即,调用 add()
方法时集合中不存在相同的元素)的顺序。
规范要求集合的实现是“对合集中的元素的平均访问时间与集合中元素的数量呈次线性关系”。因此,它可以在内部表示为哈希表(查找的时间复杂度为 O(1))、搜索树(查找的时间复杂度为 O(log(N)))或任何其他的时间复杂度低于 O(N) 的数据结构。
值的相等
值的相等是基于零值相等算法的。(曾使用会将 0
和 -0
视为不同值的同值算法。参见浏览器兼容性。)这意味着 NaN 和 undefined 会被视为是相同的值(即使 NaN !== NaN
),而所有其他的值则基于 ===
运算符的语义进行相等比较。
性能
has 方法检查某个值是否在集合中,其采用的方式的平均时间比逐个测试先前添加到集合中的元素更快。特别是当一个数组的长度(length
)等于集合的大小(size
)时,这比 Array.prototype.includes 方法的平均速度更快。
2.Map集合常用实现类
2.1 HashMap
HashMap底层采用哈希表的数据结构,非线程安全的。
2.2 HashTable
HashTable底层采用哈希表的数据结构,线程安全的,效率太低,使用较少,现在控制线程安全有其他的方式。
2.2.1 Properties
Properties是HashTable下的一个实现类,由于继承了HashTable,所以Properties也是线程安全的,Properties的key和value只支持String数据类型。
2.3 SortedMap
SortedMap继承Map,所以SortedMap也有无序不可重复的特点,但SortedMap集合中key的元素可以自动按照大小排列,称为可排列集合。
2.3.1 TreeMap
TreeMap是SortedMap的实现类,底层采用二叉树的数据结构,无序不可重复,但存入key的元素会按照大小排列。