文档章节

List&Map&Set的操作和遍历

o
 osc_pn11u1x9
发布于 2018/08/06 10:05
字数 976
阅读 18
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

Java的三大集合即:Set、List、Map

  • Set:代表无序、不可重复的集合,常用的有HashSet(哈希表实现)、TreeSet(红黑树实现);
  • List:代表有序、可以重复的集合,比较常用的有ArrayList(数组实现)、LinkedList(链表实现);
  • Map:代表具有映射关系的集合,常用的有HashMap(哈希表实现)、TreeMap(红黑树实现);

Java5以后又增加了Queue体系集合,代表一种队列集合实现,这里先不介绍。

List的实现类原理比较简单,Map比较复杂,而Set其实是基于Map的一种实现。

下面从各个集合的基本操作介绍一下,分别选取HashSet、ArrayList、HashMap三个典型的实现类:

1. HashSet

/** 
 * HashSet的增删遍历
 * @author wangjun 
 * @email  scuwangjun@hotmail.com
 * @time   2018年4月6日 下午2:40:33 
 */
public class HashSetOperation {

    public static void main(String[] args) { //初始化 HashSet<String> set = new HashSet<>(); //增 set.add("key1"); set.add("key2"); set.add("key3"); //删 set.remove("key1"); //遍历1 //使用set.descendingIterator()方法可以反向遍历 System.out.println("HashSet遍历1,使用Iterator:"); Iterator<String> it = set.iterator(); while(it.hasNext()) { System.out.println(it.next()); } //遍历2 System.out.println("HashSet遍历2,使用for:"); for(String str: set) { System.out.println(str); } }

运行结果:

HashSet遍历1,使用Iterator:
key2
key3
HashSet遍历2,使用for:
key2
key3

2.ArrayList

/** 
 * ArrayList的增删查改,遍历
 * @author wangjun 
 * @email  scuwangjun@hotmail.com
 * @time   2018年4月6日 下午2:25:43 
 */
public class ArrayListOperation {

    public static void main(String[] args) { //初始化 List<String> list = new ArrayList<>(); //增 list.add("str1"); list.add("str2"); list.add("str3"); //删 list.remove(1); //查 System.out.println("list的第二个元素是:" + list.get(1)); //改 list.set(0, "str11"); System.out.println("最终的list:" + list.toString()); //遍历1,使用for System.out.println("LinkedList遍历1,使用for:"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } //遍历2,使用增强for System.out.println("LinkedList遍历1,使用增强for:"); for(String str: list) { System.out.println(str); } //遍历3,使用Iterator,集合类的通用遍历方式 System.out.println("LinkedList遍历3,使用Iterator:"); Iterator<String> it = list.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }

运行结果:

list的第二个元素是:str3
最终的list:[str11, str3]
LinkedList遍历1,使用for: str11 str3 LinkedList遍历1,使用增强for: str11 str3 LinkedList遍历3,使用Iterator: str11 str3

3.HashMap

/** 
 * hashMap的增删查改
 * 无序
 * key相当于set,不可重复
 * value相当于list,可重复
 * @author wangjun 
 * @email  scuwangjun@hotmail.com
 * @time   2018年4月6日 下午2:30:31 
 */
public class HashMapOperation {

    public static void main(String[] args) { //初始化 HashMap<String,String> map = new HashMap<>(); //增 map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); //删 map.remove("key2"); //查 System.out.println("key1对应的valve为:" + map.get("key1")); //改 map.replace("key3", "value33"); System.out.println("最终的map是:" + map.toString()); //遍历1,取出map中所有的key组成一个set System.out.println("HashMap遍历1,取出map中所有的key组成一个set:"); for(String key: map.keySet()) { System.out.println("key:" + key + ",value:" + map.get(key)); } //遍历2,取出key组成set后,通过Iterator遍历key System.out.println("HashMap遍历2,取出key组成set后,通过Iterator遍历key:"); Iterator<String> it = map.keySet().iterator(); while(it.hasNext()) { String key = it.next(); String value = map.get(key); System.out.println("key:" + key + ",value:" + value); } //遍历3,取出map中实际存储的数据结构--Map.Entry,在HashMap中使用的是Node静态内部类 //推荐这种,尤其是数据很大时 System.out.println("HashMap遍历3,通过Map.Entry:"); Set<Map.Entry<String, String>> entry = map.entrySet(); for(Map.Entry<String, String> entryItem: entry) { String key = entryItem.getKey(); String value = entryItem.getValue(); System.out.println("key:" + key + ",value:" + value); } //遍历4,只能遍历value,不能遍历key,相当于取出map中左右的value组成一个list System.out.println("HashMap遍历4,只遍历value:"); for(String value: map.values()) { System.out.println("value:" + value); } } }

运行结果:

key1对应的valve为:value1
最终的map是:{key1=value1, key3=value33} HashMap遍历1,取出map中所有的key组成一个set: key:key1,value:value1 key:key3,value:value33 HashMap遍历2,取出key组成set后,通过Iterator遍历key: key:key1,value:value1 key:key3,value:value33 HashMap遍历3,通过Map.Entry: key:key1,value:value1 key:key3,value:value33 HashMap遍历4,只遍历value: value:value1 value:value33

可以看到:

遍历Set一般常用2种方式;

遍历List一般常用3种方式;

遍历Map一般常用4种方式;

根据使用场景,选择合适的遍历方式。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Doubly Linked List&DLL(双向链表)

双向链表 优点 可以从两个方向遍历链表(从前到后,从后到前); 删除节点方面效率很高(不像单链表和循环链表需要遍历链表); 可以插入元素在给定节点之前(单链表和循环链表只能插在给定节...

osc_nzgeextl
2018/07/21
0
0
【原】javascript笔记之Array方法forEach&map&filter&some&every&reduce&reduceRight

做前端有多年了,看过不少技术文章,学了新的技术,但更新迭代快的大前端,庞大的知识库,很多学过就忘记了,特别在项目紧急的条件下,哪怕心中隐隐约约有学过一个方法,但会下意识的使用旧的...

osc_lnvseat3
2018/10/26
2
0
前端笔记之React(六)ES6的Set和Map&immutable和Ramda和lodash&redux-thunk

一、ES6的Set、Map数据结构 Map、Set都是ES6新的数据结构,都是新的内置构造函数,也就是说typeof的结果,多了两个: Set 是不能重复的数组 Map 是可以任何东西当做键的对象 ES6 提供了新的数...

osc_nnbkiac5
2019/08/02
5
0
JS 数据结构-Set 集合 创建Set 常用Set方法

Set   ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。   很多时候我们把Set叫做 集合,但是,Set可以是集合,集合不一定是Set。   特性:唯一性=...

osc_9hx9qg8o
2019/11/28
2
0
ES6中set的用法回顾

ES6中的set类似一个数组,但是其中的值都是唯一的,Set本身是一个构造函数,用来生成 Set 数据结构。 set函数可以接受一个数组作为参数,用来初始化: const set = new Set([1, 2, 3, 4, 4, ...

osc_wa4nx1sy
2019/02/12
2
0

没有更多内容

加载失败,请刷新页面

加载更多

SO_REUSEADDR和SO_REUSEPORT有何不同? - How do SO_REUSEADDR and SO_REUSEPORT differ?

问题: The man pages and programmer documentations for the socket options SO_REUSEADDR and SO_REUSEPORT are different for different operating systems and often highly confusing.......

法国红酒甜
50分钟前
28
0
asp.net core之SignalR

SignalR 是什么? ASP.NET Core SignalR 是一个开源的实时框架,它简化了向应用中添加实时 Web 功能的过程。 实时 Web 功能是服务器端能够即时的将数据推送到客户端,而无需让服务器等待客户端...

一介草民Coder
今天
24
0
如何通过日期属性对数组进行排序 - How to sort an array by a date property

问题: Say I have an array of a few objects: 说我有一些对象的数组: var array = [{id: 1, date: Mar 12 2012 10:00:00 AM}, {id: 2, date: Mar 8 2012 08:00:00 AM}]; How can I sort......

javail
今天
22
0
技术教程| 百度鹰眼历史轨迹查询:轨迹抽稀功能

本文作者:用****9 本篇教程中,我们将详细地说明鹰眼历史轨迹查询(gettrack接口)中,如何通过vacuate_grade选项对轨迹进行抽稀,以及不同的抽稀力度对轨迹产生的影响。 上一篇教程中,我们...

百度开发者中心
前天
24
0
Quartz的Misfire处理规则 错过任务执行时间的处理机制

调度(scheduleJob)或恢复调度(resumeTrigger,resumeJob)后不同的misfire对应的处理规则 CronTrigger withMisfireHandlingInstructionDoNothing ——不触发立即执行 ——等待下次Cron触发频率...

独钓渔
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部