笔记29 | 整理Java的容器类

地址

前人栽树:http://blog.csdn.net/aqi00/article/details/50419268 后人乘凉:http://blog.csdn.net/xiangyong_1521/article/details/78456133

目录

  • 集合(Set/HashSet)
  • 队列(ArrayList)
  • 链表(LinkedList)
  • 向量(Vector)
  • 堆栈(Stack)
  • 映射(Map/HashMap)
  • 哈希表(Hashtable)
  • 容器的遍历操作


1.集合(Set/HashSet)简介

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


2.队列(ArrayList)

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


3.链表(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删除


4.向量(Vector)

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


5.堆栈(Stack)

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


6.映射(Map/HashMap)

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


7.哈希表(Hashtable)

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


8.容器的遍历操作

8.1.a. ArrayList

ArrayList<Integer> i = new ArrayList<Integer>();
        i.add( 1);
        i.add( 2);
        i.add( 3);
        i.add( 4);
        i.add( 5);
        i.add( 6);
        i.add( 7);
        i.add( 8);

        //循环遍历  
        for (Integer ii : i) {
            Log.i("md", "循环遍历: "+ii);
        }

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

8.1.b. logcat

01-01 01:55:49.909: I/md(6335): 循环遍历: 1
01-01 01:55:49.909: I/md(6335): 循环遍历: 2
01-01 01:55:49.909: I/md(6335): 循环遍历: 3
01-01 01:55:49.909: I/md(6335): 循环遍历: 4
01-01 01:55:49.909: I/md(6335): 循环遍历: 5
01-01 01:55:49.912: I/md(6335): 循环遍历: 6
01-01 01:55:49.912: I/md(6335): 循环遍历: 7
01-01 01:55:49.912: I/md(6335): 循环遍历: 8
01-01 01:55:50.050: I/md(6335): 索引遍历  :array[0]=1
01-01 01:55:50.051: I/md(6335): 索引遍历  :array[1]=2
01-01 01:55:50.054: I/md(6335): 索引遍历  :array[2]=3
01-01 01:55:50.055: I/md(6335): 索引遍历  :array[3]=4
01-01 01:55:50.057: I/md(6335): 索引遍历  :array[4]=5
01-01 01:55:50.060: I/md(6335): 索引遍历  :array[5]=6
01-01 01:55:50.061: I/md(6335): 索引遍历  :array[6]=7
01-01 01:55:50.062: I/md(6335): 索引遍历  :array[7]=8

8.2.a. LinkedList

LinkedList<Integer> i = new LinkedList<Integer>();
        for (int j = 0; j < 10; j++) {
            i.add(j);
        }
        Log.i("md", "增加前:"+i);
        i.add(0,520);
        i.add(3,7788);
        i.add(6,333);
        Log.i("md", "增加后:"+i);

8.2.b. logcat

01-01 01:58:36.133: I/md(6395): 增加前:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
01-01 01:58:36.133: I/md(6395): 增加后:[520, 0, 1, 7788, 2, 3, 333, 4, 5, 6, 7, 8, 9]

8.3.a HashMap

HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < 10; i++) {
            map.put(i, i+10);
        }
        Log.i("md", "增加前:"+map);
        map.put(51, 520);
        Log.i("md", "增加后:"+map);

        Set<Integer> key_set = map.keySet();  
        for (Integer item_key : key_set) {  
            Log.i("md","item_key="+item_key+", item_value="+map.get(item_key));
        }

8.3.b. logcat

01-01 02:00:27.676: I/md(6477): 增加前:{0=10, 1=11, 2=12, 3=13, 4=14, 5=15, 6=16, 7=17, 8=18, 9=19}
01-01 02:00:27.678: I/md(6477): 增加后:{51=520, 0=10, 1=11, 2=12, 3=13, 4=14, 5=15, 6=16, 7=17, 8=18, 9=19}
01-01 02:00:27.680: I/md(6477): item_key=51, item_value=520
01-01 02:00:27.680: I/md(6477): item_key=0, item_value=10
01-01 02:00:27.681: I/md(6477): item_key=1, item_value=11
01-01 02:00:27.682: I/md(6477): item_key=2, item_value=12
01-01 02:00:27.682: I/md(6477): item_key=3, item_value=13
01-01 02:00:27.683: I/md(6477): item_key=4, item_value=14
01-01 02:00:27.683: I/md(6477): item_key=5, item_value=15
01-01 02:00:27.684: I/md(6477): item_key=6, item_value=16
01-01 02:00:27.685: I/md(6477): item_key=7, item_value=17
01-01 02:00:27.686: I/md(6477): item_key=8, item_value=18
01-01 02:00:27.687: I/md(6477): item_key=9, item_value=19

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【编程基础】c printf知多少

printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,在打印整数是使用%d符号,在打印字符是用%c 符号.这些符号被称为...

3295
来自专栏青玉伏案

窥探Swift之数组与字典

说到数组和字典,只要是编过程的小伙伴并不陌生。在Swift中的数组与字典也有着一些让人眼前一亮的特性,今天的博客就来窥探一下Swift中的Array和Dicti...

1929
来自专栏Android群英传

Kotlin Primer·类与对象(上)

782
来自专栏Laoqi's Linux运维专列

正则三剑客-grep

先来普及一下基础知识! ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。 $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。 . 匹配一个非换...

2486
来自专栏老马说编程

(91) Lambda表达式 / 计算机程序的思维逻辑

在之前的章节中,我们的讨论基本都是基于Java 7的,从本节开始,我们探讨Java 8的一些特性,主要内容包括: 传递行为代码 - Lambda表达式 函数式...

1828
来自专栏老九学堂

【必读】超全的C语言基础知识大全

我们用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,加深小伙伴们对C语言的认识。

1062
来自专栏Linyb极客之路

浅谈Java中的hashcode方法

哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:

411
来自专栏老九学堂

【必读】C语言基础知识大全

C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。 例1:计算两个整数之和的c程...

2978
来自专栏技术换美食换不换

regular expression

A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。

753
来自专栏有趣的Python

2-Java基础语法-常量与变量

_hello 合法; Void 合法(区分大小写,和void不一样); abc$123 合法; abc 123 非法(包含空格)

591

扫码关注云+社区