欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java集合类的那点通俗的认知

程序员文章站 2022-06-28 11:30:46
文/沉默王二 开门见山地说吧,Java提供了一套完整的集合类(也可以叫做容器类)来管理一组长度可变的对象(也就是集合的元素),其中常见的类型包括List、Set、Queue和Map。从我个人的编程经验来看,List的实现类ArrayList和Map的实现类HashMap使用频率最高,其它实现类只能望 ......

Java集合类的那点通俗的认知文/沉默王二

开门见山地说吧,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的值中还可以存放新的键值对,就像下面的这张示意图。

Java集合类的那点通俗的认知在这里插入图片描述

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的内部类真的那么难以理解?
java接口的实例应用:致敬我的偶像——何塞·穆里尼奥