容器的分类

集合(Set/HashSet)

集合中的元素是没有顺序的,而且不可以重复。这意味着,集合只能遍历而无法通过索引访问指定元素,并且如果重复添加相同值将不会增大集合。因为Set只是接口,所以实际用的是它的一个派生类HashSet。
集合的常用方法如下:
add : 添加元素
clear : 清空容器
contains : 判断容器中是否存在该元素
iterator : 获取第一个元素的指针
isEmpty : 判断容器是否为空
remove : 删除元素
size : 获取容器大小

队列(ArrayList)

队列与集合恰恰相反,队列中的元素是有顺序的,而且允许重复,所以队列可以使用索引来访问指定元素(类似数组的下标)。
队列的常用方法包括上面集合列出的几个,下面列出有变更或者添加的方法:
add : 提供了两个方法。默认在队列末尾添加元素;如果指定了索引位置,则在指定位置末尾添加元素
get : 获取指定位置的元素
indexOf : 获取指定元素的第一个索引位置
lastIndexOf : 获取指定元素的最后一个索引位置
remove : 提供了两个方法。除了删除元素之外,还可以删除指定位置的元素
set : 替换指定位置的元素
subList : 截取从开始位置到结束位置之间的子队列

链表(LinkedList)

链表又称双端队列(类似C++的deque),如其名字所言,每个元素都有由三块区域组成,一块指向前一个元素,一块指向后一个元素,最后一块才是保存的对象。所以对于需要快速操作首尾元素,应该使用链表,如果需要快速操作随机元素,应该使用队列。
链表的常用方法包括上面队列列出的几个,下面列出添加的方法
addFirst/addLast : 添加到开头/添加到末尾
getFirst/getLast : 获取首元素/获取末元素
removeFirst/removeLast : 删除首元素/删除末元素
offer/offerFirst/offerLast : 以deque方式添加元素,与之相对的是,add是以list方式添加元素
peek/peekFirst/peekLast : 获取但不移除此队列的首尾元素,默认获取首元素
poll/pollFirst/pollLast : 获取并移除此队列的首尾元素,默认获取并移除首元素
pop : 出栈第一个元素,即以stack方式删除元素
push : 入栈指定元素,即以stack方式添加元素
我们看到,链表实现了好几种添加和删除方法,它们的区别总结如下:
以列表方式(list)操作元素:add添加,remove删除
以双端队列方式(deque)操作元素:offer添加,poll删除
以堆栈方式(stack)操作元素:push添加,pop删除

向量(Vector)

向量非常类似队列,但队列是异步的,而向量是同步的。具体的说,当一个向量的指针Iterator正在使用时,另一个线程改变了向量的状态(比如添加或删除了一些元素),这时调用指针的方法将抛出异常(ConcurrentModificationException)。
向量的常用方法与队列是一样的,虽然看源码会发现其他几个名字带element的函数,可是这几个函数的用法等同于队列的对应函数,所以就不一一列举了。

堆栈(Stack)

堆栈是从向量派生而来,它实现一个后进先出的堆栈。
堆栈的常用方法比向量多了三个,分别是peek(获取首元素)、pop(出栈)、push(入栈),看起来Stack类似一个堆栈方式的链表。

映射(Map/HashMap)

映射保存的是键值对(即key—value)的映射关系,一个映射中不能包含相同的key,每个key只能映射一个value。但Map只是接口,实际中常用的是它的一个派生类HashMap。类似的,队列、链表、向量都是派生自List接口。
映射的常用方法如下:
clear : 清空容器
containsKey : 判断容器中是否存在该键(key)的元素
containsValue : 判断容器中是否存在该值(value)的元素
get : 根据指定键获得元素的值
isEmpty : 判断容器是否为空
keySet : 获取容器中键的集合
put : 设置键值对的映射关系。如原来没有该键,则添加元素;如果原来存在该键,则替换元素
remove : 删除指定键对应的元素
size : 获取容器的大小
values : 获取容器中值的集合

哈希表(Hashtable)

哈希表也是从Map派生而来,与HashMap不同,HashMap是异步的,而HashTable是同步的。因为同步需要花费机器时间,所以HashTable的执行效率要低于HashMap,向量和队列的情况与之类似。
哈希表的常用方法与映射是一样的,就不一一列举了。

容器的遍历操作

指针遍历

以上容器都支持以指针为基础的遍历操作,其中指针遍历又分为显式指针和隐式指针,区别在于显式指针需要实例化Iterator的一个对象,而隐式指针不需要。
以队列为例,显式指针和隐式指针的遍历代码如下:

ArrayList<String> array = new ArrayList<String>();
array.add("111");
array.add("222");
array.add("333");
//显式指针
Iterator<String> it_array = array.iterator();
while(it_array.hasNext()){System.out.println("it_array.next()="+(String)it_array.next());
}
//隐式指针
for (String item_array : array) {System.out.println("item_array="+item_array);
}

集合、链表、向量、堆栈的指针遍历与队列类似,把ArrayList替换为相应的容器名称就好。
映射的指针遍历有些特别,因为Iterator只支持单参数,而映射有两个参数,所以只能把每个映射元素的入口传给Iterator,这就引入了Map.Entry的概念。具体的遍历代码如下:

HashMap<String, String> map = new HashMap<String, String>();
map.put("111", "000");
map.put("222", "000");
map.put("333", "000");
//显式指针
Set<Map.Entry<String, String>> entry_set = map.entrySet();
Iterator<Map.Entry<String, String>> it_map = entry_set.iterator();
while(it_map.hasNext()){//注意这里要先把入口取出来,这样才能分别getKey和getValueMap.Entry<String, String> item_next = it_map.next();System.out.println("item_next key="+item_next.getKey());System.out.println("item_next value="+item_next.getValue());
}
//隐式指针
for (Map.Entry<String, String> item_map : map.entrySet()) {System.out.println("item_map key="+item_map.getKey());System.out.println("item_map value="+item_map.getValue());
}

哈希表的指针遍历操作与映射类似。

索引遍历

除了指针遍历操作,队列、链表、向量、堆栈还支持索引遍历,具体代码如下:

//索引遍历
for (int i=0; i<array.size(); i++) {System.out.println(String.format("array[%d]=%s", i, array.get(i)));
}

向量因为内部元素是无序的,所以不支持索引遍历。

键集合遍历

映射和哈希表除了指针遍历,还支持键集合的遍历。即先获取容器中的键集合,然后对键集合进行指针遍历分别取出该键对应的值,具体代码如下:

Set<String> key_set = map.keySet();
for (String item_key : key_set) {System.out.println("item_key="+item_key+", item_value="+map.get(item_key));
}

点此查看Android开发笔记的完整目录

Android开发笔记(二十六)Java的容器类相关推荐

  1. Android开发笔记(十六)秋千摇摆动画SwingAnimation

    上节博主介绍了AlphaAnimation和淡入淡出动画的使用,其实AlphaAnimation只是四种补间动画中的一种.那么为了加深对其他补间动画的理解,我想说说旋转动画RotateAnimatio ...

  2. 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍 第一个DirectX 11 Demo的创建

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  3. 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍第一个DirectX 11 Demo的创建

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7688515 作者:毛星云    邮箱: h ...

  4. 【Visual C++】游戏开发笔记二十六 DirectX 11各组件的介绍第一个DirectX 11 Demo的创建...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7688515 作者:毛星云 邮箱: happ ...

  5. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  6. Android开发笔记(一百六十二)蓝牙设备的连接与配对

    蓝牙是一种短距离无线通信技术,它由爱立信公司于1994年创制,原本想替代连接电信设备的数据线,但是后来发现它也能用于移动设备之间的数据传输,所以蓝牙技术在手机上获得了长足发展. 因为手机内部的通讯芯片 ...

  7. Android开发笔记(一百六十六)H5通过WebView录像上传

    前面的博文< Android开发笔记(一百五十二)H5通过WebView上传图片>介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页.既然如此,那么再探讨一下如何实现这个摄像上传 ...

  8. Android开发笔记(一百六十五)利用红外发射遥控电器

    红外遥控是一种无线控制技术,它具有功耗小.成本低.易实现等诸多优点,因而被各种电子设备特别是家用电器广泛采用,像日常生活中的电视遥控器.空调遥控器等等基本都采用红外遥控技术. 不过遥控器并不都是红外遥 ...

  9. Android开发笔记(一百六十九)利用BottomNavigationView实现底部标签栏

    在Android Studio上创建官方默认的首屏标签页面很方便,首先右击需要添加标签栏的模块,在弹出的右键菜单中依次选择"New"--"Activity"-- ...

  10. Android开发笔记(一百六十八)为应用绑定通知渠道并展示消息角标

    为了分清消息通知的轻重缓急,从Android8开始新增了通知渠道,并且必须指定通知渠道才能正常推送消息.一个应用允许拥有多个通知渠道,每个渠道的重要性各不相同,有的渠道消息在通知栏被折叠成小行,有的渠 ...

最新文章

  1. 如何删除链表的最后一个节点_面试:删除链表的节点
  2. centos6.5 yum安装mysql_CentOS 6.5使用yum安装MySQL快速上手必备
  3. java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...
  4. Apache VFS:基本介绍
  5. [LeetCode] 547. Friend Circles Java
  6. caffe学习:Crop 层
  7. CSS3新增选择器:伪元素选择器
  8. 任正非:不要过度消费客户及民众对我们的同情与支持
  9. 登陆模板_曝北京国安克星将登陆中超,3年进84球,可成中超新政引援模板
  10. java web基础 --- URL重定向Filter
  11. QuartusII9.0--项目文件的新建
  12. Python 编程的最好搭档—VSCode 实用指南
  13. X86服务器CPU的作用,为什么需要基于x86架构的至强处理器?
  14. 实验三 mysql数据库与表的创建_实验二 数据库和表的创建与管理
  15. 【小米8手机的状况】
  16. GAN实战——书法字体生成练习赛开始报名啦!
  17. 全面解读量化中性策略
  18. 汇编语言--test和cmp区别
  19. c++类与对象(多文件编程!)(编写一个有关股票的程序,其中有两个类:一个是深圳类shen_stock,另一个是上海类shang_stock。)
  20. Python中字符串的一些操作

热门文章

  1. python 数据写入json文件时中文显示Unicode编码问题
  2. 第二天matplotlib绘图
  3. @Autowired的作用
  4. eyoucms内容添加发布
  5. 第三:GitHub的使用(超详细)
  6. apch连接mysql数据库连接_配置phpmyadmin连接远程 MySQL数据库
  7. [JS进阶] HTML5 之文件操作(file)
  8. servlet过滤器入门
  9. #6277. 数列分块入门 1
  10. Python类对象的运算符add重载