关于集合List和Set
List:可存入重复的值
ArrayList<E>:存储结构数组结构
按下标遍历元素效率较高,按下标查找元素效率较高,可以自动扩容
插入删除效率低,按元素内容查找效率低,线程不安全
创建时初始值默认大小为0,后续当调用增加方法时,默认大小扩到10,
之后再需要扩容时一般是之前的1.5倍(通过移位运算符>>计算得出的1.5倍),
但会去先确认这个扩完1.5倍大小时是否够用(比如说,之前的Arraylist大小是1,扩到1.5倍后还是1容量(1.5会取整成1),这时便会扩容成之前Arraylist容量+1的容量
但扩容时不会超过可扩容的最大容量(Integer.MAX_VALUE-8),
如果超过了这个数,则先去确认之前的Arraylist容量+1(即最小需要的容量)是否超过了
Int所能存储的最大大小,超过了的话会抛出OutOfMemoryError的异常,
否则在确认是否超过了(Integer.MAX_VALUE-8),超过了则返回int所能存储的最大数(2的32次方-1),否则返回(Integer.MAX_VALUE-8)。
Vector:存储结构为数组结构
按下标遍历元素效率较高,按下标查找元素效率较高,可以自动扩容
插入删除效率低,按元素内容查找效率低,线程安全
构造器可以传入初始容量大小(不传默认为0),容量增量(不传默认为0,即翻一番),和arraylist差不多,区别仅仅是增量,以及当为初始容量0时,扩增时是0+1而不是10.
LinkedList:存储结构为双向链表结构
增加删除快,查找慢,可以通过方法addFirst()和addLast()从两端往里存,跟栈的数据结构一样,先进后出
Set:不可存入重复的值
HashSet:散列存储(其实是基于hash表的方式进行存储)
通过add()方法存放,可以用迭代器iterator去取出。
Hashset<Integer> set=new HashSet<>();
Interator<Integer> in=set.interator();
System.out.println(In.next());
TreeSet:会根据存放的值进行排序存储.
如下是使用方法,通过这段代码便可得知TreeSet会根据存放的值进行排序存储的特性:
TreeSet<Integer>t=new TreeSet<>();
t.add(2);
t.add(3);
t.add(1);
for(Integer a:t){
System.out.println(a)
}
结果为:
1
2
3
但如果是想用TreeSet存放自己定义的类,那么此类需要实现Comparable<E>接口并实现Camparable的compareTo方法
原因也是因为TreeSet会根据存放的值进行排序存储,compareTo方法就是去定义要定义的类的排序的方法,如:
TreeSet<Person>p=new TreeSet;//用TreeSet存储Person类
Public class Person implement Camparable{
private int age;
//this与o进行比较,返回的数据:负数 表示this小;
//零表示相同,但由于Set的不可储存重复值的特性所以不会再进行存放
//正数则表示this大
public int compareTo(Person o){
if(this.age>o.age){//用age元素进行比较,年龄小的将在treeSet存储位置靠前
return 1;
}else if(this.age==0.age){
return 0;
}
return -1;
}
}
上一篇: 列表(list)和集合(set)
下一篇: Set和List集合
推荐阅读
-
Java集合基础知识 List/Set/Map详解
-
Java8利用stream的distinct()方法对list集合中的对象去重和抽取属性去重
-
python 集合 并集、交集 Series list set 转换的实例
-
Java语言基础之List集合以及Set集合的使用
-
Python中内置数据类型list,tuple,dict,set的区别和用法
-
Java8利用stream的distinct()方法对list集合中的对象去重和抽取属性去重
-
Java之List和Set
-
List、Set集合系列之剖析HashSet存储原理(HashMap底层)
-
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
-
python 集合 并集、交集 Series list set 转换的实例