Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
├HashSet
│ └LinkedHashSet
└SortedSet
└TreeSet
List接口:
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够用索引来访问List中的元素,List允许有相同的元素。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack
LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或者双向队列(deque)。
LinkedList没有同步方法。 如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决办法是在创建List时构造一个同步的List:
List list=Collections.synchronizedList(new LinkedList(…));
LinkedList:链表实现,增删快,查询慢
ArrayList类
ArrayList实现了可变大小的数组,它允许所有元素,包括null。ArrayList没有同步。
数组实现,查询快,增删慢,线程不安全,轻量级;下标也是从0开始
和LinkedList一样,ArrayList也是非同步的(unsynchronized).
Vector类
Vector是同步的。
数组实现,线程安全,重量级
Stack类
Stack继承自Vector,实现后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个远在在堆栈中的位置。Stack刚创建后是空栈。
Set接口
Set是一种不包含重复元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2) = false,Set最多有一个null。
Set实现的基础是map(hashmap)
Hashset:
Hashset的存储方式是把hashmap中的key作为set的对应存储项。
LinkedHashset:是Hashset一个子类,一个链表
Treeset:Sortedset的子类,它不同于hashset的根本就是treeset是有序的。是通过sortedmap来实现的。
Map
├Hashtable
├HashMap
└WeakHashMap
Map接口
Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以当作一组key集合,一组value集合,或者一组key-value映射。
HashTable类
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
HashTable是同步的。
HashMap类
HashMap是非同步的,并允许nul,即null value,null key
WeakHashMap类
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被gc回收。
总结:
如果涉及到堆栈,队列等操作,应该考虑用List,对于快速插入、删除元素,应该使用LinkedList,如果是需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境运行,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
特别要注意对哈希表的操作,作为key的对象要正确复写equals和hashcode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要可以将ArrayList换成LinkedList时,客户端代码不用改变。
同步性:
Vector是同步的,是线程安全的,而ArrayList是异步的,是非线程安全。同步的要求会影响执行的效率,所以如果不需要线程安全的集合那么使用ArrayList。
数据增长:
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合的对象。当向这两种类型中增加元素的时候,如果元素的数据超出了内部数组目前的长度塔门都需要扩展内部数组的长度。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最好你获取的这种集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
相关推荐
java练习题--容器使用练习
Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- IOC容器 ---- 代码 Spring5 框架 ---- ...
java教程-使用Docker容器安装系统配置及Docker容器的使用方式
Java-Spring-SpringIoC容器-SpringIoC的学习 SpringIoC容器的学习笔记 主要介绍了IoC容器工作原理以及如何配置IoC容器 通过标签和注解配置容器
Java基础 反射篇 反射的思想及作用 反射的基本使用 获取类的 Class 对象 构造类的实例化对象 获取一个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过...
- JAVA容器类 - Java锁汇总 ## 数据库 - MySQL - MySQL数据库开发规范 ## 计算机网络 - 计算机网络 ## 算法 - 数据结构与算法 - LeetCode解题总结 - 海量数据处理总结 ## 操作系统 - 操作系统 - Linux...
_Java-集合容器-2.List及其实现类.ppt
java8 看不到源码 oracle-java8-ant 在容器 sunithar/oracle-java8(带有 Java8 的 Ubuntu 16.04 LTS ...的容器。...oracle-java8-ant ...oracle-java8-ant ...oracle-java8-ant ...作为基础镜像的人都可以使用这个容器
java8 看不到源码 oracle-java8-ant-wiremock 在容器 sunithar/oracle-java8-ant(带有 Java8 和 Ant 的 Ubuntu ...的容器。...oracle-java8-ant-wiremock ...oracle-java8-ant-wiremock ...作为基础镜像的人都可以使用这个容器
java8 看不到源码docker-java8-jenkins-maven-git-nano 该存储库提供了 Dockerfile,该文件从 Ubuntu 14.04 LTS 以及 Oracle Java 8、Jenkins 1.574、Maven 3、Git 和 Nano 构建持续集成容器。 设置一个装有 jenkins...
java8 看不到源码Java8 @32bit Docker 容器 Dockerfile 用于使用 Java8 JRE 创建 32 位 Docker 容器。 docker 容器可以从 . 你可以简单地运行它 docker run -i cortinico/java8-32bit bash 如何在容器内运行 JAR 要...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
JAVA 容器类应用JAVA 容器类应用JAVA 容器类应用JAVA 容器类应用JAVA 容器类应用JAVA 容器类应用JAVA 容器类应用
java面试 java面试_leetcode面试题解之第11题盛最多水的容器_编程
Java基础-Java容器-并发编程-SSM框架-JVM-MySQL-Tomcat-Linux-Redis等等等 (๑•̀ㅂ•́)و✧
Java容器学习笔记: 容器概览, 容器中的设计模式, 容器源码分析 - List, 容器源码分析 - Map, 容器源码分析 - 并发容 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...
二、 Java语法基础 5 数据类型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 20 四、 面向对象★★★★★ 21 五、 封装(面向对象特征之一)★...
SkyWalking适用于分布式系统的应用程序性能监控工具,专为微服务、云原生和基于容器 (Kubernetes) 的架构而设计。 SkyWalking在8.8.0版本以后将agent进行了单独拆分,因此若要使用8.8.0版本以后的,需要下载apm和...
Java容器提供了一种统一的方式来组织和管理多个对象,使得开发者能够更加方便地对这些对象进行操作和处理。 Java容器主要分为两大类:Collection 和 Map。 Collection: Collection表示一组对象,它的主要子接口...
Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发容器之ConcurrentHashMap;Java——并发...