JAVA常见的集合类
关系的介绍:
- Set(集):集合中的元素不按特定方式排序,并且没有重复对象。他的有些实现类能对集合中的对象按特定方式排序。
- List(列表):集合中的元素按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象。
- Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。他的有些实现类能对集合中的键对象进行排序。
简单的区别:Set和List都是继承与Collection,set元素无序且不重复,list有序且允许重复。map存储的是键值对。这三个都是定义了集合接口类,具体使用还是需要实现类的实例。


基本接口和类型:
Iterator接口
该接口允许遍历集合中的所有元素,一共有三个方法:
- public boolean hasNext():判断是否还有下一个元素。
- public Object next():取得下一个元素,注意返回值为 Object,可能需要类型转换。如果不再有可取元素,则抛出NoSuchElementException异常。在使用该方法之前,必须先使用hasNext()方法判断。
- public void remove():删除当前元素,很少用。
Collection接口
该接口是Set和List的父接口,主要提供了下面的方法:
- public boolean add(Object?o):往集合中添加新元素。添加成功,返回true,否则返回false。
- public Iterator iterator():返回Iterator对象,这样就可以遍历集合中的所有元素了。
- public boolean contains(Object?o):判断集合中是否包含指定的元素。
- public int size():取得集合中元素的个数。
- public void clear():删除集合中的所有元素。
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。
Java SDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
遍历Collection中的每一个元素:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
Set集合
主要有如下两个实现:HashSet和TreeSet
HashSet:按照哈希算法来存取集合中的对象,具有很好的存取性能。当HashSet向集合中加入一个对象时,会调用对象的hashCode()方法获取哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。(限定存放的位置其实也是为了更高效的查找对象)
LinkedHashSet:除了使用HashCode来决定元素位置之外,同时还是用了链表来维护元素的次序(Linked),因此对其插入元素时,看起来是有序的;
TreeSet:实现了SortedSet接口,可以对集合中的元素排序(支持自然排序和定制排序,实现Comparator接口的compare()方法来自定义一套比较大小的逻辑)。
List集合
List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行取得/删除/插入操作。
List还提供一个listIterator()方法,返回一个ListIterator接口对象,和Iterator接口相比,ListIterator添加元素的添加,删除,和设定等方法,还能向前或向后遍历。
List接口的实现类主要有ArrayList,LinkedList,Vector,Stack等。
1 ArrayList类:
实现了可变大小的数组。ArrayList没有同步。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
主要方法:
- public boolean add(Object?o):添加元素
- public void add(int index, Object element):在指定位置添加元素
- public Iterator iterator():取得Iterator对象便于遍历所有元素
- public Object get(int?index):根据索引获取指定位置的元素
- public Object set(int index,Object element):替换掉指定位置的元素
排序方法:
- Collections.sort(List list):对List的元素进行自然排序(升序方式),此时list中的对象必须实现了Comparable接口
- Collections.sort(List list, Comparator comparator):对List中的元素进行客户化排序 。sort()方法只是将Comparator接口中的compare()方法比较结果为-1的放前面,0的放中间,1的放后面
2 LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(...));
Map
- Map是一种把键对象和值对象进行映射的集合,它的每一个元素都包含一对键对象和值对象。
- 向Map添加元素时,必须提供键对象和值对象。键对象不能重复,但值对象可以重复。
- 从Map中检索元素时,只要给出键对象,就可以返回对应的值对象。
1 HashMap
HashMap按照哈希算法来存取键对象,有很好的存取性能。和HashSet一样,要求当两个键对象通过equals()方法比较为true时,这两个键对象的hashCode()方法返回的哈希码也一样。
2 TreeMap
TreeMap实现了SortedMap接口,能对键对象进行排序。同TreeSet一样,TreeMap也支持自然排序和客户化排序两种方式。
方法列表
- public Object put(Object key, Object value):插入元素
- public Object get(Object?key):根据键对象获取值对象
- public Set keySet():取得所有键对象集合
- public Collection values():取得所有值对象集合
- public Set entrySet():取得Map.Entry对象集合,一个Map.Entry代表一个Map中的元素
总结

如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
参考:https://www.cnblogs.com/liqiu/p/3302607.html
-----------------------------------------------------------------------------------------------------
arraylist和linklist的对比:
- 时间:linklist不支持高效随机元素访问,对于二分这些算法效率很低,即index取值操作差;而arraylist不支持高效中间插入insert()和删除delete()元素,但对于add(),两者都是差不多的;
- 空间:linklist的entry引入了额外的开销;而arraylist开销体现在列表结尾预留的空间,通常每一次扩充会增加50%容量。
JAVA常见的集合类的更多相关文章
- Java 常见异常及处理方案
Java 常见异常处理方案 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error: ...
- Java常见的几种内存溢出及解决方法
Java常见的几种内存溢出及解决方法[情况一]:java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一 ...
- Java常见Exception物种
Java常见Exception物种 1.ClassNotFoundException 2.IOException 3.NoSuchFieldException 4.NoSuchMethodExcept ...
- java常见文件操作
收集整理的java常见文件操作,方便平时使用: //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if ( ...
- java常见字符串的操作
/** * java常见字符串的操作 */ public class Test7 { public static void main(String args[]){ StringBuffer sBuf ...
- Java常见开发规范
1 背景概述 作为程序员大军中的一员,笔者工作于沈阳数通畅联软件技术有限公司.在任职工作的第一天就听领导强调开发规范的重要性,但是笔者心里还想为什么开发规范是最重要的,难道是不应该是实现功能就万事大吉 ...
- Java常见异常(Runtime Exception )小结(转)
原文链接:Java常见异常(Runtime Exception )小结 Java异常体系结构呈树状,其层次结构图如图 1所示: 本文重在Java中异常机制的一些概念.写本文的目的在 ...
- Java常见的同步和异步的区别、特点、联系
Java常见的同步和异步的区别.特点.联系 同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以避免出现死锁,读脏数据的发生,一般 ...
- Java常见错误列表
Java常见错误列表: 找不到符号(symbol) 类X是public的,应该被声明在名为X.java的文件中 缺失类.接口或枚举类型 缺失X 缺失标识符 非法的表达式开头 类型不兼容 非法的方法声明 ...
随机推荐
- Go语言【第八篇】:Go语言变量作用域
Go语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围,Go语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量: 函数外定义的变量称为全局变量: 函数 ...
- 楼房 洛谷1382 && codevs2995
P1382 楼房 题目描述 地平线(x轴)上有n个矩(lou)形(fang),用三个整数h[i],l[i],r[i]来表示第i个矩形:矩形左下角为(l[i],0),右上角为(r[i],h[i]).地平 ...
- (八)Redis事务与连接操作
事务: multi # 标记一个事务块的开始.事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由EXEC命令原子性地执行 exec # 执行所有事务块内的命令 descard # 取消事务,放 ...
- CenOS 定时任务,at和crontab
1.一次性定时任务,只执行一次 语法:# at [参数] [时间] at> 执行的指令 退出at命令 ctrl+d 1.1 mini安装版本可能没有预装at 安装at yum -y instal ...
- 【Ubuntu】编写一个c语言代码
安装 sudo apt-get build-depgcc coding:http://www.cnblogs.com/zero1665/archive/2009/11/03/1595510.html ...
- cf 460 E. Congruence Equation 数学题
cf 460 E. Congruence Equation 数学题 题意: 给出一个x 计算<=x的满足下列的条件正整数n的个数 \(p是素数,2 ≤ p ≤ 10^{6} + 3, 1 ≤ a ...
- POJ.1061 青蛙的约会 (拓展欧几里得)
POJ.1061 青蛙的约会 (拓展欧几里得) 题意分析 我们设两只小青蛙每只都跳了X次,由于他们相遇,可以得出他们同余,则有: 代码总览 #include <iostream> #inc ...
- call和apply第一个参数为null/undefined,函数this指向全局对象
call和apply第一个参数为null/undefined,函数this指向全局对象,在浏览器中是window,在node中是global 在严格模式中(ie 6/7/8/9 除外),传入null/ ...
- [APIO2017]商旅
link 这题卡我精度,调了一晚上才调对,因为没有想到图还可以不连通 其实可以预处理出好多东西,距离($dis(u,v)$),买卖物品(从$u$到$v$买卖物品的最大利润,例($max{S_{u,i} ...
- 四连测Day1
题目:链接: https://pan.baidu.com/s/163ycV64ioy7uML7AvRDTGw 密码: p86i T1: 倍增求LCA,minn数组记录最小值 #include<i ...