开门见山地说吧,Java 提供了一套完整的集合类(也可以叫做容器类)来管理一组长度可变的对象(也就是集合的元素),其中常见的类型包括 List、Set、Queue 和 Map。从我个人的编程经验来看,List 的实现类 ArrayList 和 Map 的实现类 HashMap 使用频率最高,其它实现类只能望其项背了。

List、Set 和 Queue 都是 Collection 的子接口,但各有各的好。List 按照插入的顺序保存元素,Set 不会有重复的元素,Queue 通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。

Map 与 Collection 最大的不同就在于,它是一组“键值对”,可以快速地通过键来查找值;Collection 是没有键的,因此需要按照某种规则来查找值(这里说的值就是元素)。

怎么使用集合类呢?示例如下:

public class Wanger {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("李孝利");System.out.println(list.get(0));Map<String, String> map = new HashMap<String, String>();map.put("lixiaoli", "李孝利");System.out.println(map.get("lixiaoli"));}
}

01、ArrayList 和 LinkedList

通常情况下,ArrayList 是我们在选择 List 的时候的首选。别问我为什么,就好像你问我为什么 1+1 = 2 ?我回答不上来啊。

有人会问,如果我的应用操作偏向于插入和删除,而不是随机访问,我还要选用 ArrayList 吗?我知道 LinkedList 在处理插入和删除的时候更高效,而 ArrayList 更适合随机访问。

那么我的回答是,你已经知道了答案,就做出自己的选择吧。

List 的应用经常会涉及到一些经典的排序算法,我们不妨来重温一下冒泡排序,冒泡排序的规则是:假如有 N 个数,是无序的;从第一个数开始和后面 N-1 的数比较,发现有比自己小的就交换位置;从第二个数开始和后面 N-2 的数比较,同样发现有比自己小的就交换位置;直到 N-1 结束。

来看程序清单1-1:

public class BubbleSort {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();Collections.addAll(list, 2, 1, 5, 4, 9, 8, 6, 7, 10, 3, 3);// 从第1个数开始比较,直到N-1for (int i = 0; i < list.size(); i++) {// 从第i+1开始,和i位置的数进行比较for (int j = i + 1; j < list.size(); j++) {// 记录原来的数int temp = list.get(j);// 如果i位置的数大,就和j位置的数进行交换if (list.get(i) > temp) {list.set(j, list.get(i));list.set(i, temp);}}}System.out.println(list);}
}

Collections 类是操作 Collection 的一个工具集,提供了很多可以操作和返回 Collection 的静态方法,非常好用。Collections.addAll() 方法可以将所有指定元素添加到指定 Collection 中,可以分别指定要添加的元素,就像 Collections.addAll(list, 2, 1, 5); 这样;或者将要添加的元素指定为一个数组;此方法的行为与 list.addAll(Arrays.asList(elements)) 的行为是相同的,但在大多数实现下,此方法运行起来可能要快得多。

list.set(int index, E element) 用于指定元素替代此列表中指定位置上的元素,非常便捷。

02、HashMap

HashMap 是最常见的 Map 实现,应用非常的广泛;支持 null 键和 null 值,是绝大部分利用键值对存取场景的首选;比如,查询数据库的时候经常使用 HashMap 来进行灵活的(可选择一个表的部分列,而不是所有列)列名和列值的绑定。

HashMap 的值中还可以存放新的键值对,就像下面的这张示意图。

03、PriorityQueue

考虑这样一种场景,王二现在是一个写作大咖了,不再只是一个会写代码的程序员了。有一天,他和几个热情的读者相遇在厕所的门口,为了表示对王二的尊重,读者们觉得礼让王二先去解决问题是必要的。

PriorityQueue 是一种优先级队列(Priority 即为优先的意思),可以应用于这种场景。代码示例如下:

public class WriterAndReader implements Comparable<WriterAndReader> {static PriorityQueue<WriterAndReader> queue = new PriorityQueue<WriterAndReader>();private String name;public WriterAndReader(String name) {this.name = name;}@Overridepublic int compareTo(WriterAndReader o) {// o为之前的if (this.getName().equals("王二")) {return -1;}return this.getName().compareTo(o.getName());}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return this.getName();}public static void main(String[] args) {// 第一次,没有发生比较,因为只有一个queue.add(new WriterAndReader("读者2"));// 第二次,与第一次放入的比较,发现读者1比读者2小queue.add(new WriterAndReader("读者1"));// 第三次,与读者1进行比较,发现王二小;queue.add(new WriterAndReader("王二"));while (!queue.isEmpty()) {System.out.println(queue.poll());}}
}

PriorityQueue 既然要排出优先级,那么就要有一定的规则,排列的对象就要实现 Comparable 接口。

建议在学习的时候 debug 一下,你会发现 queue 的变化非常的有意思;每次 add 添加或者 poll 取出时就会执行对应的 compareTo。

PriorityQueue 常用的功能函数如下:

方法名 功能描述
add(E e) 添加元素
clear() 清空
contains(Object o) 检查是否包含当前参数元素
offer(E e) 添加元素
peek() 读取元素,(不删除)
poll() 取出元素,(删除)
remove(Object o) 删除指定元素
size() 返回长度

上一篇:Java 数组,看这篇就够了

下一篇:HashMap,难的不在Map,而在Hash

微信搜索「沉默王二」公众号,关注后回复「免费视频」获取 500G 高质量教学视频(已分门别类)。

Java 集合类入门篇相关推荐

  1. JAVA中整型常量的长度,Java基础入门篇(三)——Java常量、变量,

    Java基础入门篇(三)--Java常量.变量, 一.Java常量 (一)什么是常量 常量指的是在程序中固定不变的值,是不能改变的数据.在Java中,常量包括整型常量.浮点型常量.布尔常量.字符常量等 ...

  2. Java爬虫入门篇---Jsoup工具

    Java爬虫入门篇---Jsoup工具 前言 准备工作 获取文本数据 获取页面中所有的图片 前言 pythoy的scrapy框架是大名鼎鼎,Jsoup则为Java框架的爬虫 准备工作 1.下载jsou ...

  3. javascript java html_JS入门篇(二):在html中如何使用Javascript

    原标题:JS入门篇(二):在html中如何使用Javascript (1)java的使用 HTML 中的脚本必须位于 <> 与 > 标签之间.脚本可被放置在 HTML 页面的 和 部 ...

  4. 穿越 java | 快速入门篇 - 第1节 计算机基础知识

    主题:计算机基础知识 开发环境 更多干货 定义 作用 组成元件 CPU 内存 cpu里的高速缓存 BIOS软件(基础输入输出系统) CMOS芯片 机械硬盘 组成 数据存取过程 文件编码 ASCII G ...

  5. Java框架入门篇——Spring

    文章目录 前言 1.Spring是什么? 2.Spring 的优点? 3.Spring的IoC理解 4.Spring的AOP理解 5.BeanFactory和ApplicationContext有什么 ...

  6. 深读源码-java集合类总结篇

    概览 我们先来看一看java中所有集合的类关系图. 这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃. 我们下面主要分成五个部分来逐个击破. List List中的元素 ...

  7. java查询日期类的表,JAVA菜鸟入门篇 - 时间处理相关类实例:打印该月日期表 (29)...

    利用前面我们所学习有关时间处理类,Date.DateFormat.SimpleDateFormat以及Calendar和GregorianCalendar类 编写一个按照用户定义格式(格式:2015- ...

  8. java基础入门篇1

    1.java开发运行环境 1.1java编译运行过程:------常见面试题 1)编译期:.java源文件,经过编译,生成.class字节码文件 2)运行期:JVM加载.class并运行.class( ...

  9. java基础入门篇(1)

    目录 java语言本身的特性 java的文件拓展名 jvm虚拟机的编译与解释器 字节码与机器码的区别辨析 性质本身 进制角度 转化流程 java语言本身的特性 跨平台性:java语言诞生之初就有一句口 ...

  10. Java基础入门篇之For循环

    一.for循环语句 1.在java中一般用在次数确定情况下.如果要进行重复性指令执行,可以用for循环.基本语法如下所示: for(初始化表达式:循环条件:操作表达式){ c1:执行语句 ...... ...

最新文章

  1. sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系
  2. 分享下自己写的一个微信小程序请求远程数据加载到页面的代码
  3. 为什么要引入模式概念来设计软件
  4. Xcode Git 使用
  5. 十五天精通WCF——第十一天 如何对wcf进行全程监控
  6. 漫步最优化一——引言
  7. ubuntu服务器设置_Ubuntu服务器设置–安全最佳实践
  8. 常见的SQL面试题:经典50例
  9. stm32变量放在flash_STM32 使用 Flash 存储数据时的一种管理办法
  10. 白噪声的matlab程序,matlab产生白噪声信号
  11. 【转载】COMSOL Multiphysics 5.3a 安装教程
  12. 常见视频接口知识点汇总(精华)
  13. csgo fps不稳定和服务器,win10玩csgofps不稳定怎么办
  14. https://github.com/qiangqiang666/demo
  15. 百度3D地球,高清地图!地形混合!
  16. python创建一个简单的游戏
  17. 自然语言处理系列之:中文分词技术
  18. 全国天气预报信息 API 接口
  19. java用wasd_涨知识:游戏默认WASD原来是这么来的
  20. js文件防止浏览器缓存

热门文章

  1. 二维矩阵顺时针旋转90度
  2. 川西云南行散记之五《稻城-亚丁-洛绒牛场》
  3. python股票回测_用Python徒手撸一个股票回测框架搭建【推荐】
  4. git commit --amend 的使用记录
  5. 区块链+农业开启智能化生产时代 解决世界性食品及粮食安全问题
  6. 【知识向】——计算机基础知识总结及相关
  7. 应届生求职应聘简历PPT模板
  8. numpy.ones用法
  9. ubuntu18.04安装dash-to-dock出错的问题
  10. 【牛客练习赛41 E.球的体积并】球的体积并模板