Java集合类和容器类
1.集合类和容器类的继承关系图:
说明:上图来自互联网,如有侵权,请告之,我将注明原始作者或删除该图。
上图只列出了图中类的一些主要继承和实现关系,并不精确,只表示了大概的关系,有些父接口并没有在图中画出,以及有写继承关系跨过了中间的某些类,图中让它直接继承了间接父类。
2.对各个集合类的一些说明:
1.Collection是集合的父类,但是JDK不提供直接继承自Collection的集合类让用户使用,而是提供继承自Collection子接口List和Set的集合类让用户使用。
2.List和Set的区别,List提供了随机访问的方法,内部元素是有序的,并且允许为空;而实现Set接口的类,内部元素是无序的,并且最多只能有一个null元素,并且放入Set中的元素必须不相等,就是要满足e1.equals(e2)==false,另外必须小心操作可变对象,当Set中的可变对象被操作后使得Set中有两个元素满足了e1.equals(e2)==true时就会发生一些问题。
3.ArrayList类。ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
4.LikedList。它内部的结构是基于链表的。LinkedList实现了List接口,允许null元素。此外LinkedList实现了Deque<E>, Queue<E>接口,提供额外的get,remove,insert方法在LinkedList的首部或尾部。所以LinkedList可以用来实现队列操作。它也是非同步的。
5.Vector。它与ArrayList非常相似,但是Vector是同步的。
6.HashSet。它内部是使用Hash表来存放元素的,通过HashMap来实现的。元素是无序的。
7.TreeSet。它内部结构是基于红黑树的,内部元素是有序的。插入、删除等操作是
3.对各个容器类的一些说明:
1.容器的父接口是Map,它提供了键值对的数据结构。
2.HashMap。跟HashSet相似,它也是基于Hash函数的,所以作为HashMap的键值的类,必须重写hash和equals方法。它是非同步的,允许null的key和null的value。
3.Hashtable。它也是实现Map的一个子类,它跟HashMap非常相似,但是Hashtable是同步的,并且不允许有null的key和null的value。
4.TreeMap。内部结构是基于红黑树的,内部的键值集合是有序的,可以进行基于有序的相关操作,其他操作跟HashMap相似。
5.WeakHashMap。该类与HashMap相似,只是它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
4.Collections类:
1.这是一个工具类,它的静态方法一般用来处理集合容器类,或者用来生产集合容器类。Collections.synchronizedXXX()方法可以从非同步的集合容器类获得同步的集合容器类。
5.Arrays类:
1.Arrays类提供了很多处理数组相关的静态方法,如数组的查找、比较、排序等操作。另外该类还提供了一个静态方法,将数组转换成List,该方法就是
Arrays.asList(T ... array);
6.同步的集合类以及容器类(Synchronized):
1.一般的集合类和容器类都是非同步的(除了Vector和Hashtable以及它们的子类),如果用在多线程环境下必须自己写有关同步的代码。JDK中为我们提供了与一般集合容器类相应的同步类,SynchronizedCollection<E>、SynchronizedList<E>、SynchronizedMap<E>、SynchronizedSet<E>、SynchronizedSortedSet<E>、SynchronizedMap<E>,这些类都是Collections类中的静态内部类,通过Collections.synchronizedXXX()方法就可以获得相关的同步集合容器类,并且得到的同步类与作为参数的非同步类共享数据空间,当在同步类中对集合或者容器做出修改,在非同步的类中能同步感受到。例如:
List< String> list = new LinkedList<>();list.add("one");List<String> list1 = Collections.synchronizedList(list);list1.remove(0);System.out.println(list.size());
上述代码输出结果为0.
7.并发的集合类以及容器类:
1.同步集合或容器中,基本上在内部是使用synchronized来实现的,而且一个类中所有的方法使用的是同一个锁对象,在很多这会造成性能上的问题。另外,有一些复合操作,需要保持原子性,如获取最后一个元素(代码见下面),而同步类这时候就做不到了,所以这时候要考虑使用并发类了,并发类位于java.util.concurrent中。
/**
*获取最后一个元素
*/
public static Object getLast(Vector list) { int lastIndex = list.size() - 1; return list.get(lastIndex);
}
2.并发容器有ConcurrentHashMap,它采用更细粒度的锁,被称为分段锁,允许一定数量的线程并发的修改它,能够提供高并发的性能。
3.还有一些有用的适用于某些并发场合的集合类,CopyOnWriteArrayList等。
4.在这里只要Java中存在同步集合容器和并发集合容器类就可以了,当遇到多线程的情况或者要求并发的情况下,再去找相关的合适的同步或并发的集合容器类。
Java集合类和容器类相关推荐
- c++ 将集合set的数据输出到数组中_Java集合类(容器类)简介:(摘抄)
Java集合可用于存储数量不等的对象,并可以实现常用的数据结构(如栈.队列等待),还可以用于保存具有映射关系的关联数组.Java集合就一种容器,可以把多个对象放进容器中,Java集合可以记住容器中的对 ...
- Java集合类: Set、List、Map、Queue区别及应用
Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量.一旦在数组初始化时指定了这个数组长度,这个数 ...
- Java数组与容器类分析资料--数组、List和Set、Map等
2019独角兽企业重金招聘Python工程师标准>>> Java容器分析--数组 数组是Java语言内置的类型,除此之外,Java有多种保存对象引用的方式.Java类库提供了一套相当 ...
- java集合类(简介)
JAVA集合类(介绍) 在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现,我在使用和面试的时候频频遇到这样的"抉择" ...
- Java集合排序及java集合类详解
Java集合排序及java集合类详解 (Collection, List, Set, Map) 摘要内容 集合是Java里面最常用的,也是最重要的一部分.能够用好集合和理解好集合对于做Java程序的开 ...
- Java集合类的基本接口
java 集合类的基本接口:collection 和 map 什么是接口:在软件中接口是一种规范和标准,他们可以约束类的行为,是一些方法特征的集合,但是没有方法的实现,接口其实上也可以看做是一个特殊的 ...
- Java 集合类详解
0.参考文献 http://blog.csdn.net/liulin_good/article/details/6213815 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比 ...
- java集合类深入分析之TreeMap/TreeSet篇
2019独角兽企业重金招聘Python工程师标准>>> 简介 TreeMap和TreeSet算是java集合类里面比较有难度的数据结构.和普通的HashMap不一样,普通的HashM ...
- 【JAVA集合类(大公司面试喜欢问的) 】
看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要 ...
最新文章
- [导入]Vista的translator.gadget(117.64 KB)
- 特斯拉超级充电桩亮相:充电5分钟能跑百公里
- 迫于误解压力,RMS从自由软件基金会与MIT离职
- linux操作系统信号捕捉函数之回调函数小结
- 通过微型计算机的电流,单板微型计算机控制的电流型变频调速系统
- Docker GitLab镜像部署
- 网易考拉的服务架构如何从单体应用走向微服务化? | 技术头条
- 怎样正确的理解和解决 ORA-01843:not a valid month
- android 图片编辑 画圈,Android种图片圆形化的三种方式
- 软件测试--04测试用例/测试方法
- 2020-8-5 Codeforces摸鱼报告
- WEBFORM--第一讲
- 萌新做点小玩意儿DAY-2 五子棋AI拓展思想
- windows下安装MinGW及C++的环境配置
- ceph peering流程分析
- 【TypeScript】使用CRA创建支持TS的React项目(从踩坑到放弃)
- CAT-6:六类/增强六类双绞线标准
- PHP连接操作sqlserver
- 【darknet源码解析-24】shortcut_layer.h 和 shortcut_layer.c 解析
- C++的 remove函数