Set集合
HashSet是set集合最常见的实现类,他按照hash算法存储集合的元素,因此具有很大存取和查找性能。
HashSet 集合判断两个元素相等的标准是两个对象通过equalsQ方法比较相等,并且两个对象的hashCode(方法返回值也相等。
重写HashCode()方法的基本规则:
1.在程序运行过程中,同一个对象多次调用hashCode()方法应该返回相同的值。
2.当两个对象通过equals(方法比较返回true时,这两个对象的hashCode(方法应返回相等的值。
3.对象中用作equals(方法比较标准的实例变量,都应该用于计算hashCode值。
把可变对象添加到HashSet 中之后,尽量不要去修改该集合元素中参与计算hashCode()、equals()的实例变量,否则将会导致HashSet无法正确操作这些集合元素。
LinkedHashSet 集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。
TreeSet是SortedSet接口的实现类,TreeSet 可以确保集合元素处于排序状态。
TreeSet 还提供了如下几个额外的方法。
1.自然排序
TreeSet通过compareTO(Object obj)来比较元素大小实现升序排列
Comparable接口里的compare To(Object obj)方法返回一个整数实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小。如果该方法返回0,则表明这两个对象相等;如果该方法返回一个正整数,则表明前面的大于后面的;如果该方法返回一个负整数,则表明前面的小于后面的。
实现Comparable接口的常用类 comparetor比较的一定是两种相同类型的数据,所以要求集合里的其他对象和该对象是同一个类的实例
TreeSet可以删除没有被修改的实例,但是一旦可变元素实例被修改,它和被修改后与它相同的元素都不能被删除。
2.定制排序
Comparator接口里的int compare(T o1, T o2)方法用于比较o1和o2的大小:如果该方法返回正整数,则表明o1大于o2;如果该方法返回0,则表明o1等于o2;如果该方法返回负整数,则表明ol小于o2。
如果需要实现定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。由于Comparator是一个函数式接口,因此可使用Lambda表达式来代替Comparator对象。
EnumSet是一一个 专为枚举类设计的集合类,EnumSet 中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序。
EnumSet在内部以位向量的形式存储,EnumSet集合不能加入null元素,但是可以判断和删除null元素
EnumSet提供一下的几种方法创建对象
HashSet性能比TreeSet性能好,但是TreeSet有次序,EnumSet性能最好,但是只能保存同一个枚举类的枚举值,局限性较大。
List集合
List是Collection的子接口,可以用Collection的全部方法,同时它又是有序集合,增加了一些自己的方法
List和数组很像,也可以用for循环来遍历集合
List添加字符串时会新new一个字符串对象存进去,而不是原字符串
Java 8为List 集合增加了sort()和 replaceAllQ)两个 常用的默认方法,其中sort)方法需要-一个Comparator对象来控制元素排序,程序可使用Lambda表达式来作为参数;而replaceAll(方法则需要一个UnaryOperator来替换所有集合元素,UnaryOperator也是一-个 函数式接口,因此程序也可使用Lambda表达式作为参数。
与Set只提供了一个iterator(方法不同,List 还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator 接口继承了Iterator 接口,提供了专门操作List的方法。ListIterator增加了向前迭代的功能(Iterator 只能向后迭代),而且ListIterator还可通过add0方法向List集合中添加元素( Iterator 只能删除元素)。
新加的方法如下
迭代时先正向迭代再反向迭代。
ArrayList和Vector是List类的典型实现,他们的长度默认为10,长度不够会自动加,除此之外,ArrayList和Vector还提供了如下两个方法来重新分配Object[]数组。
1.void ensureCapacity(int minCapacity):将ArrayList 或Vector集合的Object[]数组长度增加大于或等于minCapacity值。
2.void trimToSize():调整ArrayList或Vector集合的Object[]数组长度为当前元素的个数。调用该方法可减少ArrayList或Vector集合对象占用的存储空间。
Vector的缺点很多,尽量少用Vector,ArrayList的线程不安全当多个线程访问同一个ArrayList集合时,如果有超过- -个线程修改了ArrayList 集合,则程序必须手动保证该集合的同步性;但Vector集合则是线程安全的,无须程序保证该集合的同步性。因为Vector是线程安全的,所以Vector的性能比ArrayList的性能要低。Vector还有一个子类Stack,和栈一样,他有以下几个操作
但是它的性能也比较差,不推荐使用。
Arrays.ArrayList是一一个固定长度的List 集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。