TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素的大小关系,然后将元素按照升序排列,这就是自然排序 。如果试图将一个对象添加到TreeSet集合中,则该对象必须实现Comparable接口,否则会抛出异常 。当一个对象调用方法与另一个对象比较时,例如obj1.compareTo(obj2),如果该方法返回0,则两个对象相等;如果返回一个正数,则obj1大于obj2;如果返回一个负数,则obj1小于obj2 。
Java常用类中已经实现了Comparable接口的类有以下几个:
♦ BigDecimal、BigDecimal以及所有数值型对应的包装类:按照它们对应的数值大小进行比较 。
♦ Charchter:按照字符的unicode值进行比较 。
♦ Boolean:true对应的包装类实例大于false对应的包装类实例 。
♦ String:按照字符串中的字符的unicode值进行比较 。
♦ Date、Time:后面的时间、日期比前面的时间、日期大 。
对于TreeSet集合而言,它判断两个对象是否相等的标准是:两个对象通过compareTo(Object obj)方法比较是否返回0,如果返回0则相等 。
♦ 定制排序
【不得不学的java集合框架】想要实现定制排序,需要在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由Comparator对象负责集合元素的排序逻辑 。
综上:自然排序实现的是Comparable接口,定制排序实现的是Comparator接口 。(具体代码实现会在后续章节中讲解)
4)EnumSet类
EnumSet是一个专为枚举类设计的集合类,不允许添加null值 。EnumSet的集合元素也是有序的,它以枚举值在Enum类内的定义顺序来决定集合元素的顺序 。
5)各Set实现类的性能分析
HashSet的性能比TreeSet的性能好(特别是添加,查询元素时),因为TreeSet需要额外的红黑树算法维护元素的次序,如果需要一个保持排序的Set时才用TreeSet,否则应该使用HashSet 。
LinkedHashSet是HashSet的子类,由于需要链表维护元素的顺序,所以插入和删除操作比HashSet要慢,但遍历比HashSet快 。
EnumSet是所有Set实现类中性能最好的,但它只能 保存同一个枚举类的枚举值作为集合元素 。
以上几个Set实现类都是线程不安全的,如果多线程访问,必须手动保证集合的同步性,这在后面的章节中会讲到 。
3. List集合
List集合代表一个有序、可重复集合,集合中每个元素都有其对应的顺序索引 。List集合默认按照元素的添加顺序设置元素的索引,可以通过索引(类似数组的下标)来访问指定位置的集合元素 。
实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack 。
1)ArrayList
ArrayList是一个动态数组,也是我们最常用的集合,是List类的典型实现 。它允许任何符合规则的元素插入甚至包括null 。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小 。随着容器中的元素不断增加,容器的大小也会随着增加 。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作 。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率 。
ArrayList擅长于随机访问元,同时ArrayList是非同步的 。
2)LinkedList
LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用 。
LinkedList的实现机制与ArrayList的实现机制完全不同,ArrayLiat内部以数组的形式保存集合的元素,所以随机访问集合元素有较好的性能;LinkedList内部以链表的形式保存集合中的元素,所以随机访问集合中的元素性能较差,但在插入删除元素时有较好的性能 。
3)Vector
与ArrayList相似,但是Vector是同步的 。所以说Vector是线程安全的动态数组 。它的操作与ArrayList几乎一样 。
4)Stack
Stack继承自Vector,实现一个后进先出的堆栈 。Stack提供5个额外的方法使得Vector得以被当作堆栈使用 。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置 。Stack刚创建后是空栈 。
5)Iterator接口和ListIterator接口
Iterator是一个接口,它是集合的迭代器 。集合可以通过Iterator去遍历集合中的元素 。Iterator提供的API接口如下:
♦ boolean hasNext():判断集合里是否存在下一个元素 。如果有,hasNext()方法返回 true 。♦ Object next():返回集合里下一个元素 。♦ void remove():删除集合里上一次next方法返回的元素 。
推荐阅读
- 怎样科学的鉴别茶叶
- java对MongoDB数据库操作
- 浏览器是如何解析JavaScript的?
- JavaScript中几个常用函数的代码实现
- Java中String类的常用方法详解
- GC 一篇文章彻底了解Java垃圾收集机制
- Java编程中如何正确的将byte「」数组转化为String类型?
- 利用JavaScript实现滚屏显示
- java连接Mysql数据库遇到的bug
- java:究竟什么是可重入锁?
