JavaSE 集合

本文深入解析Java集合框架,包括Set、List、Map的特性及应用,对比ArrayList、LinkedList、Vector的差异,阐述Iterator与ListIterator的工作原理,以及自定义类在HashSet与TreeSet中的存储规则。

Java集合体系:   

1.Set:无序、不可重复的集合        

2.List:有序、重复的集合            

3.Map:具有映射关系的集合

集合框架图

24192448_bEpy.jpg

简化图

 

24192448_8yMq.gif

Iterator:              

用于遍历(迭代访问)Collection集合中的元素

                             特性:

                                           Iterator仅用于遍历集合

                                           Iterator本身并不提供盛装对象的能力

                                            创建Iterator对象,必须有一个被迭代的集合

                                            遍历的同时可以修改对象

在利用迭代器迭代的过程中,又利用集合对象插入、修改、删除某个容器内的对象 就会出现问题!

List:

List是Collection的子接口
List存放的元素是有顺序的
List存放的元素可以重复
List中存放的元素都有一个整型的下标,可以根据下标访问元素。
List接口的类有ArrayList、LinkedList、Vector等

List接口还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法。
ListIterator接口在Iterator接口基础上增加了如下方法:

方法

说明

boolean hasPrevious()

返回该迭代器关联的集合是否还有上一个元素

Object previous()

返回该迭代器的上一个元素

void add()

在指定位置插入一个元素

 

ListIterator与Iterator比较:     

1.ListIterator增加了向前迭代的功能(Iterator只能向后迭代)     

2.ListIterator还可通过add方向List集合中添加元素(Iterator只能删除元素)

LinkedList:

特有方法:  

addFirst();在头部添加元素      addLast();在尾部添加元素

getFirst(); getLast(); 获取元素但不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();   removeLast(); 获取元素但是删除元素。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了替代方法

offerFirst(); offerLast();

peekFirst(); peekLast(); 获取元素,但是元素不被删除。如果集合中没有元素,会返回null

pollFirst(); pollLast(); 获取元素,但是元素被删除。如果集合中没有元素,会返回null

ArrayList和LinkedList、Vector的区别?

     1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
     2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
     3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据

Vector和ArrayList类似,但属于强同步类,即线程安全的

Set:

Set接口是Collection的子接口

相当于数学中的”集合”

Set中的元素不允许重复

添加到set的元素不会保存顺序

HashSet添加元素规则:

191322_9OvZ_3611296.png

1,每次存储对象的时候, 调用对象的hashCode()方法, 计算一个哈希值.

2,在集合中查找是否包含哈希值相同的元素.

3,如果没有哈希值相同元素, 直接存入. 如果有哈希值相同的元素,

4,逐个使用equals()方法比较 比较结果全为false就存入. 如果比较结果有true则不存.

 

如何将自定义类对象存入HashSet进行去重复?

类中必须重写hashCode()方法和equals()方法 equals()方法中比较所有属性

 

TreeSet:

TreeSet集合中的元素除了没有顺序和不能重复外,还会自然排序,这便是该集合的特点

Integer, String能排序

存储对象的时候, 可以排序, 但是需要实现Comparable接口。

如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口,重写compareTo()方法。 在方法内定义比较算法, 根据大小关系, 返回正数/负数/零,

在使用TreeSet存储对象的时候, add()方法内部就会自动调用compareTo()方法进行比较,

根据比较结果使用二叉树形式进行存储。

public int compareTo(Student o) {
        if (this.age > o.age) {
            return 1;
        } else if (this.age < o.age) {
            return -1;
        } else {
            return 0;
        }
    }                           重写comparable

调用Array.sort() 按照你所制定的规则排序

Comparable:

此接口强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

int compareTo(T o)

比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数

 

 

转载于:https://my.oschina.net/u/3611296/blog/1486514

<think>好的,我现在需要处理用户的问题,他想了解Java SE中的集合框架使用指南。首先,我得回忆一下用户之前提供的引用内容,引用[1]里提到了HashSet、LinkedHashSet和TreeSet的区别,以及它们的存储顺序。引用[2]则涉及Iterator接口和Map的部分信息。用户现在需要的是一个使用指南,所以应该涵盖集合框架的主要接口和实现类,以及如何选择和使用它们。 首先,我应该从集合框架的整体结构入手,分清楚层次结构。Java集合框架主要分为Collection和Map两个根接口,Collection下又有List、Set、Queue等子接口,而Map是独立的。需要详细说明每个接口的特点和常用实现类。 接下来,对于每个接口,比如List,要比较ArrayList、LinkedList和Vector的区别,包括它们的线程安全、性能特点。Set部分已经引用了HashSet、LinkedHashSet和TreeSet,可能需要再补充它们的应用场景和使用注意事项。Map接口的话,HashMap、LinkedHashMap、TreeMap以及HashTable和ConcurrentHashMap的区别也很重要,特别是线程安全和排序特性。 然后,需要提到工具类Collections和Arrays,它们提供的排序、查找等方法,以及如何通过它们来操作集合。此外,迭代器Iterator和ListIterator的使用也是关键点,用户可能关心如何遍历集合以及并发修改异常的问题。 性能分析方面,要根据不同数据结构的底层实现,比如数组、链表、红黑树等,说明它们的增删改查时间复杂度,帮助用户选择合适的集合类。例如,ArrayList的随机访问快,但插入删除慢;LinkedList相反。 线程安全部分,需要明确哪些集合是线程安全的,比如Vector、HashTable,以及如何通过Collections工具类将非线程安全的集合转换为线程安全的。另外,Java 5之后引入的并发包中的类如ConcurrentHashMap也是重点。 最后,要给出选择集合的指南,根据是否需要有序、唯一性、线程安全等因素来推荐合适的实现类。可能还需要提醒使用泛型来保证类型安全,避免运行时错误。 现在需要检查是否有遗漏的部分,比如Queue接口,但用户提供的引用里没有提到,可能需要简要说明。另外,要确保回答结构清晰,分点列出,每个部分都有小标题,方便用户阅读。同时,按照用户的要求,行内公式用$...$,但可能数学公式不多,不过如果有排序算法之类的可以提及,比如快速排序的时间复杂度是$O(n \log n)$。 还要注意生成相关问题,根据用户之前的示例,可能的问题包括不同集合的选择、线程安全处理、性能比较、排序方法等。需要确保问题相关且有助于用户进一步学习。 现在开始组织内容,确保每个部分简明扼要,重点突出,避免过于冗长。同时引用用户提供的引用内容,比如在讲Set的时候引用[1],在讲Iterator的时候引用[2]。最后检查LaTeX格式是否正确,比如时间复杂度用$O(n)$这样的格式。</think>### Java SE 集合框架使用指南 Java集合框架是处理对象集合的核心工具库,包含接口、实现类及算法。以下是关键组成部分及使用建议: --- #### 一、核心接口实现类 1. **Collection接口** - **List(有序可重复)** - `ArrayList`:基于动态数组,随机访问快($O(1)$),插入删除慢($O(n)$)[^1] - `LinkedList`:基于双向链表,插入删除快($O(1)$),随机访问慢($O(n)$) - `Vector`:线程安全的动态数组,性能较低(已逐渐被替代) - **Set(无序唯一)** - `HashSet`:基于哈希表,元素无序($O(1)$查询)[^1] - `LinkedHashSet`:维护插入顺序的哈希表(适合需要顺序的场景)[^1] - `TreeSet`:基于红黑树,元素按自然顺序或自定义顺序排列($O(\log n)$操作)[^1] - **Queue(队列)** - `LinkedList`:可作普通队列 - `PriorityQueue`:基于堆的优先级队列 2. **Map接口(键值对)** - `HashMap`:哈希表实现,键无序($O(1)$查询) - `LinkedHashMap`:维护插入顺序或访问顺序 - `TreeMap`:基于红黑树,按键排序 - `HashTable`:线程安全但性能低(建议用`ConcurrentHashMap`替代) --- #### 二、工具类算法 - **`Collections`工具类** 提供排序、查找、同步化等方法: ```java List<Integer> list = new ArrayList<>(); Collections.sort(list); // 排序 Collections.synchronizedList(list); // 转换为线程安全集合 ``` - **`Arrays`工具类** 用于数组操作: ```java int[] arr = {3,1,4}; Arrays.sort(arr); // 数组排序 ``` - **迭代器`Iterator`** 遍历集合的标准方式,避免并发修改异常[^2]: ```java Iterator<String> it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } ``` --- #### 三、性能选择建议 1. **选择依据** - **是否需要唯一性** → 选择`Set`或`Map` - **是否需要顺序** → `List`或`LinkedHashSet`/`LinkedHashMap` - **是否需要排序** → `TreeSet`/`TreeMap` - **线程安全需求** → `ConcurrentHashMap`、`CopyOnWriteArrayList` 2. **时间复杂度对比** | 操作 | ArrayList | LinkedList | HashMap/TreeMap | |----------------|-----------|------------|-----------------| | 随机访问 | $O(1)$ | $O(n)$ | $O(1)$/$O(\log n)$ | | 插入/删除(中间)| $O(n)$ | $O(1)$ | - | --- #### 四、线程安全处理 - **同步包装器**:通过`Collections.synchronizedXXX()`转换非线程安全集合 - **并发集合**:优先使用`java.util.concurrent`包中的类(如`ConcurrentHashMap`) --- #### 五、最佳实践 1. 使用泛型明确集合类型:`List<String> list = new ArrayList<>();` 2. 避免在遍历时修改集合(除非使用迭代器的`remove()`方法)[^2] 3. 需要频繁增删时优先选`LinkedList`,需要快速查询时选`ArrayList` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值