java基础——Collection

一、类集框架

    类集框架,是一组类和接口,存在于java.util中,主要用于存储和管理对象。

    JAVA2之前,Java提供了一些专门的类如:DictionaryVectorStackProperties存储和操作对象组。尽管这些类非常有用,但是它们缺少一个集中,统一的主题。举例:Vector的方法与Properties的方法不同。这些专门的类都都有各自专门的方法,没有被设计成易于扩展和能适应新的环境的形式。

类集框架特点:

         1.最底层存在Collection接口,在Collection接口中统一封装了实现类需要实现的方法。

         2.是高性能的。对基本类集(动态数组、链接表、树、散列表)的实现是高效的,很少需要人工去对这些“数据引擎”编写代码。

         3.框架允许不同类型的类集以相同的方式和高度互操作方式工作。

         4.类集必须是容易扩展、修改的。

所以,类集框架被设计成包含一组标准的接口。对这些接口提供了标准的实现类。

 

                                                               

二、框架详细介绍

1.Collection接口:是构造类集框架的基础。它声明所有类集都将拥有的核心方法。所有的类集实现Collection。

add:可以将对象加入到类集。这个方法带一个Object类型参数。因为Object是所有类的超累,所以任何类型的对象可以被存储在一个类型中。但是,不能直接存储类型int,char,double等(上篇博客提到的主数据类型)的值。如果要使用这些类型,则使用对象,比如new Integer(1);

iterator:该方法返回一个实现Iterator接口的对象,称作迭代器。用以方便的实现容器内元素的遍历操作。

Iterator it =collection.iterator();//得到一个迭代器

Boolean isExist =it.hasNext();//判断右边右边是否有元素。

object  obj = it.next();//返回右边右边的元素,并将游标移动到下一个位置

it.remove();//删除右边左边的元素。在执行完next之后该操作只能操作执行一次

 注意:容器类对象在调用remove、contains等方法时需要比较对象是否相等。这会涉及到对象类型的equals方法和hashcode方法。对于自定义的类型,需要重写equalshashcode方法以实现自定义的对象相等规则。相等的对象应该具有相等的hashcode

 

2.List接口:

           List是有序的Collection,使用此接口能精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素。List允许有相同的元素。

ArrayList类:

          实现了动态地增加和减少数组的元素,灵活设置数组的大小。每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。

LinkedList类:

          是一种双向的链式结构。相对ArrayList而言,LinkedList的插入和删除元素相对方便,但速度较慢。

vector类:

          ArrayList和vector操作接口基本一致,区别在于内部的实现上。ArrayList采用异步处理的方式,相对于Vector的同步方式,速度比较快。但Vector是线程安全的。

 

ArrayList接口、LinkedList接口、Vector类对比:

 http://blog.youkuaiyun.com/xujiaolf/article/details/35227525

3.Set接口

          Set是一种不包含重复的元素的Collection。

HashSet:

          泛型类必须覆写来自Object类的hashCode(),equals(Objectobj)方法;将根据hashCode,equals判断是否重复从而不保存重复的元素;

TreeSet:

        前提,泛型类必须实现Comarable接口,元素是否重复根据compareTo方法定义的规则判断,重复的元素添加将失败!

示例链接:http://hi.baidu.com/amenmen/item/85a3bef304b3d415ce9f3236

 

4.Map接口

             Map没有继承Collection接口,在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。

HashMap:

         它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为Null。非同步的。

TreeMap:

        能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。

Hashtable:

         与HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。

总结:

HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。

 

示例:

Java:HashMap,TreeMap,Hashtable一些简单介绍;

http://hi.baidu.com/personnel/item/3a8081941271dbd91a49df29

Java中HashMap和TreeMap的区别深入理解:

http://www.jb51.net/article/32652.htm

 

参考:

java_Collection_介绍: http://blog.sina.com.cn/s/blog_3fb3625f0101aref.html

Java Collection: http://skyuck.iteye.com/blog/526358

 

<think>好的,用户想知道如何对collection进行sort操作。首先,我需要根据用户提供的引用信息来整理答案。用户引用了四个资料,分别提到了Java中的Collections.sort方法、Comparator的使用、MongoDB中的排序以及Arrays.sort和Collections.sort的实现原理。 首先,应该分步骤回答。常见的型有List、Set、Map,但Set和Map本身无序,可能需要转为List再排序。对于List,可以直接用Collections.sort,或者List自己的sort方法。这里需要提到两种方式:自然排序(实现Comparable接口)和自定义排序(使用Comparator)。比如引用[1]和[2]中提到的,合中的对象需要可比较,或者在sort方法中传入Comparator。 然后,用户可能需要具体的例子,比如对整数列表排序,或者自定义对象的排序。比如引用[2]中的例子,使用Comparator来根据外部列表order进行排序,这里要注意代码中的错误,比如i2.compareTo(i2)可能是笔误,应该是i1和i2的比较,但回答中需要正确展示。 另外,MongoDB中的排序操作也需要提到,如引用[3]中的sort方法,按照字段升序或降序排列。这可能属于数据库层面的排序,和Java合的排序不同,但用户的问题可能涉及不同场景,所以需要涵盖。 最后,关于实现原理,如引用[4]提到的Timsort和归并排序,可以简要说明Collections.sort的底层算法,但用户主要问题是如何操作,这部分可以作为补充信息。 需要确保回答结构清晰,分步骤说明不同的情况和用法,并提供代码示例。同时,注意LaTeX格式的应用,比如变量用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,更多是代码块。 检查是否有遗漏,比如Set和Map的排序处理,可能需要将Set转为List,或者对Map的键值进行排序。另外,要区分Java合排序和数据库查询中的排序,如MongoDB的例子,可能需要分开说明。 总结回答结构: 1. 自然排序(实现Comparable) 2. 自定义排序(使用Comparator) 3. 不同型的处理(List直接排序,Set转List,Map处理键值对) 4. 数据库中的排序(MongoDB为例) 5. 实现原理的简要说明 确保每个部分都有对应的引用标注,如[^1]、[^2]等。代码示例需要正确,比如引用[2]中的Comparator例子,修正可能的错误。例如,在引用[2]的代码中,return i2.compareTo(i2)应该是i1.compareTo(i2)或者其他正确比较,需要调整。</think>### 如何对 Collection 进行排序操作? 对合进行排序的核心方法是通过实现**自然排序**(对象实现 `Comparable` 接口)或**自定义排序**(使用 `Comparator` 接口)。以下是具体步骤和示例: --- #### 1. **自然排序(实现 `Comparable` 接口)** 若合中的对象实现了 `Comparable` 接口(如 `Integer`、`String`),可直接调用 `Collections.sort()` 方法[^1]: ```java List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5); Collections.sort(numbers); // 默认升序排序 System.out.println(numbers); // 输出 [1, 1, 3, 4, 5] ``` --- #### 2. **自定义排序(使用 `Comparator` 接口)** 当需要按非自然顺序排序时,可通过 `Comparator` 定义规则[^2]: ```java List<MediaPojo> medias = getMediaList(); // 按外部列表 order 中的文件名顺序排序 List<String> order = Arrays.asList("video", "audio", "image"); Collections.sort(medias, new Comparator<MediaPojo>() { public int compare(MediaPojo o1, MediaPojo o2) { Integer i1 = order.indexOf(o1.getMediaName()); Integer i2 = order.indexOf(o2.getMediaName()); return i1.compareTo(i2); // 按 order 列表中的索引排序 } }); ``` --- #### 3. **不同型的处理** - **List**:直接使用 `Collections.sort()` 或 `list.sort()`。 - **Set**:需先转为 `List`(因 `Set` 无序): ```java Set<Integer> set = new HashSet<>(Arrays.asList(5, 2, 9)); List<Integer> list = new ArrayList<>(set); Collections.sort(list); ``` - **Map**:按键或值排序(需转为 `List<Entry>`): ```java Map<String, Integer> map = new HashMap<>(); List<Map.Entry<String, Integer>> entries = new ArrayList<>(map.entrySet()); entries.sort(Map.Entry.comparingByValue()); // 按值升序 ``` --- #### 4. **数据库中的排序(以 MongoDB 为例)** 在查询时指定排序字段[^3]: ```python # 按 age 升序排列 sorted_by_age = db['users'].find().sort('age', 1) # 按 age 降序排列 sorted_by_age_desc = db['users'].find().sort('age', -1) ``` --- #### 5. **实现原理** - **Java 合排序**:`Collections.sort()` 底层使用改进的 **Timsort 算法**(结合归并排序和插入排序)[^4]。 - **性能**:时间复杂度为 $O(n \log n)$,适合大规模数据。 ---
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值