开门见山地说吧,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-1
        for (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;
    }     @Override
    public 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;
    }     @Override
    public 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

Java集合类的那点通俗的认知的更多相关文章

  1. Java集合类--温习笔记

    最近面试发现自己的知识框架有好多问题.明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题.不管了,再巩固下基础知识总是没错的,反正最近空闲时间 ...

  2. 做JavaWeb开发不知Java集合类不如归家种地

    Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...

  3. 【转载】Java集合类Array、List、Map区别和联系

    Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...

  4. 摘抄转载前辈们的Java集合类总结

    本文摘自 Blue Sky:http://www.cnblogs.com/hubcarl JAVA 集合类介绍和使用 类关系示意图Iterable(接口) │ └--Collection (接口) ├ ...

  5. Java集合类简单总结(重学)

    java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...

  6. Java集合类中的哈希总结

    JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...

  7. Java集合类: Set、List、Map、Queue使用场景梳理

    本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料 http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E ...

  8. Java 集合类详解(含类图)

    0.参考文献 此图中蓝色为抽象类.深红色表示接口(Arrays除外).绿色表示具体容器类 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedLi ...

  9. Java集合类: Set、List、Map、Queue使用

    目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的 ...

随机推荐

  1. 部分手机浏览器存在将ajax请求当成广告过滤的情况,及解决方案

    我们发现h5页面在某些浏览器请求不到数据,经过排查,是浏览器的广告拦截模块搞的鬼. 通过删减参数,发现adtype和adnum参数去掉后,接口可以正常请求,开始以为是官方拦截关键词带有ad的参数,后来 ...

  2. git逻辑和基本命令

    提交和推送的区别 提交(commit):把您做的修改,保存到本地仓库中 推送(push):把您本地仓库的代码推送至服务器(一般是远程服务器及gitlab或github) 拉取和获取的区别 git  p ...

  3. html2canvas在Vue项目踩坑-生成图片偏移不完整

    背景 最近做一个Vue项目需求是用户长按保存图片,页面的数据是根据不同id动态生成的,页面渲染完生成内容图片让用户长按保存的时候,把整个页面都保存起来. 在项目遇到的坑是图片能生成,可是生成的图片总是 ...

  4. c# winform打印excel(使用NPOI+Spire.xls+PrintDocument直接打印excel)

    前言 c#做winform程序要求生成并打印Excel报告,为了不安装Office相应组件,我选择了NPOI来生成Excel报告,用winform的PrintDocument控件来触发打印操作,而难点 ...

  5. Android Keystore 对称-非对称加密

    Android数据加密: Anroid数据加密方式 Android 提供了 KeyStore 等可以长期存储和检索加密密钥的机制,Android KeyStore 系统特别适合于存储加密密钥. “An ...

  6. python学习:for循环

    for循环 for i in range(1,4): print("loop:",i) 输出100以内的奇数: for i in range(1,101): if i % 2 == ...

  7. ipset和iptables配合来自动封闭和解封有问题的IP

    iptables封掉少量ip处理是没什么问题的,但是当有大量ip攻击的时候性能就跟不上了,iptables是O(N)的性能.而ipset就像一个集合,把需要封闭的ip地址放入这个集合中,ipset 是 ...

  8. Spring中Model、ModelMap及ModelAndView之间的区别

    Spring中Model.ModelMap及ModelAndView之间的区别   1. Model(org.springframework.ui.Model)Model是一个接口,包含addAttr ...

  9. Update API

    Update API可以根据提供的脚本更新文档. 该操作从索引获取文档,运行脚本(脚本语言和参数是可选的),并返回操作的结果(也允许删除或忽略该操作). 使用版本控制来确保在“get”(查询文档)和“ ...

  10. swust oj 1052

    输出利用先序遍历创建的二叉树中的指定结点的双亲结点 1000(ms) 10000(kb) 2415 / 5575 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的双亲结点.约定二叉树结点数据为 ...