Set集合 |
Set集合像一个罐子,里面的数据不能重复。相比于其它类型,Set集合更像数学上的“集合”。
(1)HashSet
HashSet按Hash算法来存储集合中的元素,具有很好的存取和查找性能。是使用较多的一个集合类。
那Hash算法是什么?hashcode是什么?
Hash算法是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。hashcode就是一个签名,当两个对象的hashcode一样时,两个对象就有可能一样。如果不一样的话,两个对象就肯定不一样。比如香蕉和苹果对象的hashcode值一样,但它俩属于两个对象。
特点:
- HashSet的一大特点是快速查找。
- 不是同步的,如果多个线程要同时对Hashset集合进行修改,可能产生问题。所以要通过代码保证其同步。
- 集合元素值可以是null
(2)TreeSet
TreeSet采用红黑树的结构来存储数据,而且树的结点是有顺序的,从上到下,从左到右,依次递增。这也说明了TreeSet集合的特点:可以确保集合元素处于排序状态。
常用方法:
//定义一个TreeSet类型的集合,并向其中添加4个Integer对象:1268
TreeSet a=new TreeSet();
a.add(1);
a.add(2);
a.add(6);
a.add(8);
//输出集合里的第一个元素。如果是输出最后一个,用last()方法。
a.first();
//返回大于等于2小于7的子集。如果单纯小于7—headSet(7);如果单纯大于等于2—tailSet(2)。
a.subSet(2,7);
排序规则:
- 自然排序
这是TreeSet默认采用的排序方法。其有两个要求:
a、如果试图把一个类的对象添加到TreeSet集合中,则该对象的类必须实现Comparable接口。
class People extends Comparable{}
在main函数中,实现添加进集合的方法:a.add(new People());
b、一个TreeSet集合里的元素是同一个类的对象。因为当向一个TreeSet集合中添加元素时,会对其数据类型与其它元素的数据类型进行比较,相同才能放入。
- 定制排序
此排序就是根据自己的需要对元素进行排序,比如对元素进行降序排列、让元素按照Student对象的name属性来进行排序等。
(3)EnumSet
EnumSet是一个专为枚举类设计的集合类,其内部以位向量的形式存储,是Set实现类中性能最好的。其内不允许加入null元素。
(4)Set实现类的性能比较
- 异:
HashSet比TreeSet的性能高,因为它不用维护集合元素的次序。所以,无特殊要求时,选用HashSet。
当需要一个保持排序的Set集合时,选用TreeSet。
当需要保存同一个枚举类的枚举值时,可选用EnumSet。
- 同:
这三个实现类都是线程不安全的。为了避免出现线程同步问题,可在Set集合创建时,加入synchronizedSortedSet方法。
List集合 |
List集合像一个数组,能记录每次添加集合的顺序,且长度可变。如果访问的话,可依据索引来访问。其特点是:允许添加重复元素,默认按元素的添加顺序设置元素的索引。
常用方法:
//定义一个ArrayList类型的集合,并向其中添加3个元素
List a=new ArrayList();
a.add(new String("红色"));
a.add(new String("绿色"));
a.add(new String("黄色"));
//输出集合,结果为[红色,绿色,黄色]
System.out.println(a);
//将新字符串对象插入到第二个位置
a.add(1,new String("粉色"));
//删除第三个元素
a.remove(2);
//判断指定元素在List集合中的位置
System.out.println(a.indexOf(new String("绿色")));
//将第二个元素替换成新的字符串
a.set(1,new String("黑色"));
//将a集合的第二个元素(包括)到第三个元素(不包括)截取成字符串
System.out.println(a.subList(1,2));
//使用目标类型为Comparator的Lambda表达式对List集合排序
a.sort((01,o2)->((String)o1).lenght() - ((String).o2).length());
//使用目标类型为UnaryOperator的Lambda表达式来替换集合中所有元素,使每个字符串的长度作为新的集合元素
a.replaceAll(ele->((string)ele).length());
ArrayList
代表长度可以变化的数组。其是链表,拥有链表的特点:优势是可对元素进行快速的随机访问,劣势是插入和删除元素速度较缓慢。其是线程不安全的。