Java集合(一)—容器了解

本文详细介绍了Java集合框架的组成部分,包括List、Set、Map等核心容器的特性与应用场景。对比了不同容器之间的优缺点,例如ArrayList与LinkedList的区别,以及如何根据实际需求选择合适的容器。

Java集合(一)—容器了解

一:集合框架

Java集合框架图

 

enter description here

 

 

Java集合简化图

 

enter description here

 

 

二:添加一组元素

在Java集合中的工具包中(Arrays,Collections)如上图所示,添加一组元素可以采用:

  1. Arrays.asList(args) args:数组或逗号分隔的列表 将结果转换为一个list对象(不能直接对其操作底层返回的仍是数组)
  2. Collection.addAll(args) args:只能是collection集合 (不灵活 )
  3. Collections.addAll(arg0 , arg1) arg0:添加到的collection集合 arg1:数组或逗号分隔的列表 (速度很快)

三:容器的打印

默认打印使用容器的toString方法。Collection打印结果为[ , , , , , ];Map打印结果为{ key1=value,key2=value, }

四:List

ArraList 、vectory和 LinkedList都继承List与Collection接口。
ArrayList:擅长随机访问,但是在List的中间插入和移除元素比较慢。
LinkedList:擅长顺序访问,在List中间进行插入和删除操作代价较低。但在随机访问方面相对较慢。

五:Set

Set保存不重复的元素。查找时Set中最重要的操作。HashSet对快速查找做了优化。

  1. HashSet: 用来快速查找,使用的是散列函数,提供最快的查询速度。存入hashset的元素必须定义hashCode()
  2. TreeSet: 将元素储存在红—黑树中,保持元素处于排序状态。元素必须实现Comparable接口。
  3. LinkedHshSet: 具有HashSet的查询速度,内部使用了链表来维护元素的插入顺序,以插入顺序保存元素。也必须定义HashCode方法。

六:Map

Map中的keySet()方法用于返回map中的所有键组成的Set。(通常用于遍历map集合)

  1. HashMap: 设计用来快速访问,基于散列表来实现的。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量负载因子,以调整容器的性能。
  2. LinkedHashMap: 速度只比HashMap慢一点;但是在迭代访问时速度要更快一些,因为使用链表维护了内部次序。迭代遍历它时,其顺序是插入顺序或最近最少使用的顺序(LRU)的次序。
  3. TreeMap: 基于红黑树的实现。查看键或键值对时,它们会被排序(根据Comparable或Comparator决定)。它的特点在于所有结果都是经过排序了的。它也是唯一一个返回衣蛾子树的map。
  4. WeakHashMap: 弱键映射,允许释放映射所指向的对象。
  5. ConcurrentHashMap: 一种线程安全的Map,不涉及同步加速。
  6. IdentityHashMap: 使用 == 代替 equals对“键”进行比较的散列映射。

七:其它

Queue

队列是一个先进先出的容器。LinkedList提供了方法支持队列的行为,并且它实现了Queue接口。

Queue<Integer> queue = new LinkedList<Integer>();
	queue.offer()          //讲一个元素插入队尾,或则返回false
	//在不移除的情况下返回队头
	queue.peek();        //队列为空时返回null
	queue.element();   //队列为空时抛出NoSuchElementException异常
	//将元素移除并返回队头
	queue.poll();          //队列为空时返回null
	queue.remove();    //队列为空时抛出NoSuchElementException异常
PriorityQueue

优先级队列声明下一个弹出元素是最需要的元素(优先级最高)

PriortyQueue<Integer> pq = new PriortyQueue<Integer>();

在PriortyQueue队列上使用offer()方法来插入对象时,这个对象会在队列中被排序。默认的排序将使用对象在队列中的自然顺序,但可以通过Comparator来修该这个顺序。PriortyQueue还可以保证当你调用peek()、poll()、和remove()方法时,获取的元素是队列中优先级最高的。

Stack

栈:指后进先出的容器。LinkedList具有能够实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。

八:迭代器(Iterator)

迭代器是一个对象,它的工作是遍历并选择序列中的对象。创建它的代价小,适用于Set及List集合(foreach语法也适用collection)。Java中的迭代器(Iterator)只能单向移动,且只能用来:

  1. 使用Iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
  2. 使用next()获得容器的下一个元素
  3. 使用hasNext()检查序列中是否还有元素
  4. 使用remove()将迭代器新近返回的元素删除(在调用remove()方法前必须先调用next()方法)
List<String> list = new ArrayList<String>();
Iterator<String>  it = list.iterator();
while(it.hasNext()){
	String s =it.next();
	System.out.println("s :"+s);
}

ListIterator

ListIterator是Iterator的子类型,只能用于各种List类的访问。
特点:

  1. 可以双向移动
  2. 还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引
  3. 并且可以使用set()方法替换它访问过的最后一个元素
List<String> list = new ArrayList<String>();
Iterator<String>  it = list.ListIterator();
while(it.hasNext()){
	String s =it.next();
	System.out.println("s :"+s);
	it.set("用于替换");
}

转载于:https://my.oschina.net/PrivateO2/blog/1575795

### Java 集合容器的使用原理 #### 什么是Java集合框架? Java集合框架是个用于表示和操作数据组的标准库,它提供了多种接口和类来存储、检索以及管理组对象。这些容器可以动态调整大小并提供灵活的数据结构支持[^1]。 #### 主要分类 Java集合主要分为两大类别:Collection 和 Map 接口下的子集。 - **Collection** 是单列数据的顶级父接口,其下又细分为 List, Set 及 Queue。 - **List**: 存储有序可重复元素,典型代表有 ArrayList 和 LinkedList。 ```java List<String> list = new ArrayList<>(); list.add("Element"); System.out.println(list.get(0)); // 输出 "Element" ``` - **Set**: 不允许存储重复元素,常用 HashSet 或 TreeSet 实现去重功能。 ```java Set<Integer> set = new HashSet<>(); set.add(1); set.add(2); boolean isAdded = set.add(1); // 返回 false 表明未成功添加因为已存在该元素 ``` - **Queue**: 提供先进先出(FIFO)队列行为,PriorityQueue 支持优先级排序。 ```java Queue<Character> queue = new PriorityQueue<>(); queue.offer('a'); char firstChar = queue.poll(); // 移除并返回 'a' ``` - **Map** 则用来保存键值对映射关系,其中 HashMap 和 ConcurrentHashMap 是两种重要变体[^2]。 - **HashMap**: 非线程安全的基础哈希表实现,在多线程环境下可能导致数据不致问题。 ```java Map<String, Integer> map = new HashMap<>(); map.put("key", 100); int value = map.get("key"); // 获取对应 key 的 value 值 ``` - **ConcurrentHashMap**: 线程安全版本适合高并发场景应用。JDK7采用分段锁机制提升效率;而到了JDK8则改用了CAS算法配合红黑树优化内部结构以进步增强性能表现。 #### 性能考量最佳实践 当选用具体类型的集合时需考虑实际应用场景的要求如访问速度、内存占用量等因素从而做出合理决策。例如对于频繁读取但很少修改的操作建议使用不可变或者只读视图形式呈现给外部调用者降低潜在风险同时提高运行效能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值