java_Set,List,Map,Vector,ArrayList的区别
- 格式:doc
- 大小:48.50 KB
- 文档页数:12
java中常用的数据结构
Java中常用的数据结构有:
1. 数组(Array):一组具有相同类型的数据元素的集合,通
过索引来访问元素。
2. 链表(LinkedList):由若干个节点组成,每个节点包含数
据和指向下一个节点的指针。
3. 栈(Stack):一种后进先出(LIFO)的数据结构,只允许
在栈顶进行插入和删除操作。
4. 队列(Queue):一种先进先出(FIFO)的数据结构,只允
许在队头和队尾进行插入和删除操作。
5. 集合(Set):一种不允许重复元素的数据结构,常见的实
现类有HashSet和TreeSet。
6. 列表(List):一种有序的数据结构,允许重复元素,常见
的实现类有ArrayList和LinkedList。
7. 字典(Map):一种键值对的数据结构,以键作为唯一标识
符来存储和访问元素,常见的实现类有HashMap和TreeMap。
8. 堆(Heap):一种可以快速找到最大值(或最小值)的数
据结构,常用于优先队列的实现。
9. 树(Tree):一种层次关系的数据结构,包含根节点、子节
点和叶子节点等。
10. 图(Graph):由节点和节点之间的关系(边)组成的数据结构,常用于描述网络等复杂关系。
这些数据结构在Java中都有对应的类或接口,可以根据具体
的需求选择合适的数据结构来使用。
Java中常用的容器类有哪些?它们有什么特点?2023年的今天,Java作为一门跨平台的面向对象编程语言,在软件开发领域继续得到广泛的应用。
而在Java中,容器类是不可或缺的一部分,它们为程序员提供了方便易用的数据结构和算法,进而帮助他们快速实现各种功能。
本文将详细介绍Java中常用的容器类,并探讨它们的特点和使用方式。
1. ListList是Java中最基本的容器类之一,它也是最常用的容器之一。
List容器可以按顺序存储一组对象,并允许有重复元素。
List容器提供了一系列的操作方法,包括增加、删除、获取、修改等操作。
在Java中,常见的List容器包括ArrayList、LinkedList和Vector 等。
- ArrayListArrayList是用数组实现的List容器。
它的优点是支持随机访问,插入和删除元素时效率高,而缺点则是在删除元素时需要移动数组的其他元素。
因此,ArrayList适合用于索引域比较小的场合。
- LinkedList相比ArrayList,LinkedList则是通过双向链表的方式实现的容器。
LinkedList支持插入和删除元素时具有较高的效率,而随机访问效率较低。
因此,当需要频繁地进行插入和删除操作时,LinkedList 可以提供更好的性能。
- VectorVector是一个同步的List容器,在多线程环境中更加稳定。
Vector与ArrayList类似,也是用数组实现的容器,并且支持随机访问。
2. SetSet是另一种常用的容器类,它用于存储一组无序的元素。
Set容器具有不允许有重复元素的特点,并提供一系列的操作方法,包括增加、删除、包含等操作。
在Java中,常见的Set容器包括HashSet、LinkedHashSet和TreeSet等。
- HashSetHashSet是使用哈希表实现的Set容器,它具有快速查找元素的特点。
HashSet容器不允许重复元素,因此它适合用于元素去重的场合。
泛微软件测试面试题1.Java容器框架有哪些?Java容器框架中有两个名称分别为Collection和Set的接口2.list,map,set,array,它们有什么区别(推荐学习:java实习生面试题)List接口主要有三个实现类:LinkedList,ArrayList,Vector.LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector 是基于线程安全的,效率低。
1)Set接口主要有两个实现类:HashSet(底层由HashMap实现)和LinkedHashSet2)Map接口主要实现类:HashMap,HashTable和LinkedHashMapHashMap非线程安全,高效,支持NULL;HashTable线程安全,低效,不支持NULLArray:数组,可以存储对象和基本数据类型,长度固定。
List:元素有序,可重复.Set:元素无序,不重复,无索引。
Map:双列集合,用于存放键值对。
键值是唯一的,不可重复。
3.collection与collections有什么不同a.javutil.Collection是一个集合接口。
它提供了对集合对象进行基本操作的通用接口方法。
Collection接口在Java类库中有很多具体的实现。
Collection 接口的意义是为各种具体的集合提供了最大化的统一操作方式。
b.java.util.Collections是一个包装类。
它包含有各种有关集合操作的静态多态方法。
此类不能实例化,就像一个工具类,服务于Java的Collection框架。
4.string,stringbuilder,stringbuffer有什么区别程序中用到的字符串可以分为两大类:一类是创建之后不会再做修改和变动的字符串变量;另一种是创建之后允许再做修改的字符串变量。
第1篇一、Java基础知识1. 请简述Java的基本特点。
解析:Java具有“一次编写,到处运行”的特点,具有跨平台性;具有简单易学、面向对象、分布式、解释型、健壮性、安全性、体系结构中立、多线程、动态性等特点。
2. 什么是JVM?请简述JVM的作用。
解析:JVM(Java虚拟机)是运行所有Java应用程序的虚拟机。
它的作用是执行Java字节码,为Java程序提供运行环境,保证Java程序跨平台运行。
3. 请简述Java中的四种访问控制符及其作用。
解析:- public:表示公开的访问控制符,可以在任何地方访问。
- private:表示私有的访问控制符,只能在类内部访问。
- protected:表示受保护的访问控制符,可以在类内部和子类中访问。
- default(无修饰符):表示默认的访问控制符,只能在本包内访问。
4. 什么是封装?请举例说明。
解析:封装是将类的属性和行为封装在一起,对外只提供有限的接口。
例如,一个学生类,包含姓名、年龄、性别等属性,以及学习、休息等方法。
5. 什么是继承?请举例说明。
解析:继承是子类继承父类的方法和属性。
例如,一个动物类,包含行走、吃食等方法,一个猫类继承自动物类,则猫类具有行走、吃食等方法。
6. 什么是多态?请举例说明。
解析:多态是指同一个方法在不同对象上有不同的行为。
例如,一个形状类,包含计算面积的方法,一个圆形和正方形类继承自形状类,计算面积的方法在圆形和正方形类中有不同的实现。
7. 什么是接口?请举例说明。
解析:接口是一种规范,定义了类应该具有的方法,但不提供具体实现。
例如,一个Comparable接口,定义了compareTo方法,用于比较两个对象的大小。
8. 什么是泛型?请举例说明。
解析:泛型是一种类型参数化技术,可以在编译时进行类型检查,提高代码的安全性。
例如,一个List<T>泛型集合,可以存储任意类型的元素。
二、Java集合框架1. 请简述Java集合框架中的常用类及其特点。
Java中常用的集合类有哪些?它们的使用场景是什么?Java作为目前最为流行的编程语言之一,其优越的面向对象编程思想和强大的类库使其成为了广大编程爱好者和专业开发者的首选语言之一。
在Java开发中,常用的集合类具有广泛的应用场景,可以大大简化我们代码的编写和维护。
在本篇文章中,我们将介绍Java中常用的集合类有哪些,它们的使用场景是什么,以及如何选择合适的集合类来应对各种场景。
一、Java中常用的集合类Java中常用的集合类包括List、Set、Map等,具体如下:1.ListList是Java中最基础和最常用的集合类之一,它是一个有序的集合,可以存储重复的元素。
List提供了一系列的方法用来操作列表中的元素,如添加、删除、获取、修改等。
常见的List有ArrayList 和LinkedList。
2.SetSet是Java中的另一个基础集合类,它是一个无序的集合,不允许存储重复的元素。
Set提供了一系列的方法用来操作集合中的元素,如添加、删除、获取等。
常见的Set有HashSet、TreeSet。
3.MapMap是Java中常用的映射关系集合,它存储键值对,支持通过键来访问值。
Map提供了一系列的方法用来操作映射关系,如添加、删除、获取、修改等。
常见的Map有HashMap、TreeMap、ConcurrentHashMap等。
二、Java中常用集合类的使用场景不同的集合类有不同的使用场景,我们需要根据具体的业务需求来选择合适的集合类。
下面我们来介绍几种常见的使用场景及其对应的集合类。
1.需要随机访问元素的情况:ArrayListArrayList是Java中常用的集合类之一,它支持随机访问,通过索引访问元素的时间复杂度为O(1),是处理元素数量较大的情况下的较好选择。
2.需要频繁插入或删除元素的情况:LinkedListLinkedList是另一个常用的集合类,它支持快速的插入和删除操作,通过节点互相关联实现。
Java核⼼数据结构(List、Map、Set)原理与使⽤技巧JDK提供了⼀组主要的数据结构实现,如List、Set等常⽤数据结构。
这些数据都继承⾃java.util.Collection接⼝,并位于java.util包内。
⼀、List接⼝最重要的三种List接⼝实现:ArrayList、Vector、LinkedList。
它们的类图如下:可以看到,3种List均来⾃AbstratList的实现。
⽽AbstratList直接实现了List接⼝,并扩展⾃AbstratCollection。
ArrayList和Vector使⽤了数组实现,可以认为,ArrayList封装了对内部数组的操作。
⽐如向数组中添加、删除、插⼊新的元素或数组的扩展和重定义。
对ArrayList或者Vector的操作,等价于对内部对象数组的操作。
ArrayList和Vector⼏乎使⽤了相同的算法,它们的唯⼀区别可以认为是对多线程的⽀持。
ArrayList没有对⼀个⽅法做线程同步,因此不是线程安全的。
Vector中绝⼤多数⽅法都做了线程同步,是⼀种线程安全的实现。
因此ArrayList和Vector的性能特性相差⽆⼏。
LinkedList使⽤了循环双向链表数据结构。
LinkedList由⼀系列表项连接⽽成。
⼀个表项总是包含3个部分:元素内容、前驱表项和后驱表项。
如图所⽰:LinkedList的表项源码:private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}⽆论LinkedList是否为空,链表都有⼀个header表项,它既是链表的开始,也表⽰链表的结尾。
java中的常⽤集合类整理⽬录Collection接⼝集合的遍历:iterator 接⼝集合的遍历:增强for循环List接⼝ArrayListSet接⼝Map接⼝HashMapLinkedHashMapTreeMapPropertiesCollections⼯具类总结集合、数组都是对多个数据进⾏存储操作(主要是内存层⾯存储)的结构,简称Java容器。
数组的特点1.数组初始化以后,长度确定不可变2.数组定义好,其元素的类型确定不可变(可能有多态性)3.数组中提供的⽅法有限,对于添加、删除、插⼊数据等操作不⽅便。
4.获取数组中实际元素的个数是没有办法的。
5.数组存储数据的特点是有序、可重复的。
Java集合可分为Collection和Map两种体系,集合存储的优点是解决数组存储数据⽅⾯的弊端。
Collection接⼝:单列数据,⽤来存储⼀个⼀个的对象List接⼝:元素有序,可重复的集合 --> '动态'数组Set接⼝ :元素⽆序、不可重复的集合Map接⼝:双列数据,保存有映射关系(键值对)的集合Collection接⼝向collection接⼝的实现类的对象中添加数据obj时,要求obj所在类要重写equals⽅法。
Abstract Methodsadd(Object e):将元素e添加到集合中size():获取添加的元素个数addAll(Collection coll):将形参coll集合的元素添加到当前集合中clear():清空集合元素,集合仍然存在,只是集合⾥没有元素isEmpty():判断当前集合是否为空contains(Object obj):判断当前集合中是否包含obj,是否包含是通过调⽤obj的equals判断containsAll(Collection coll):判断形参coll中的所有元素是否都存在当前集合中。
remove(Object obj):移除某个元素,同样通过equals寻找移除的元素removeAll(Collection coll):从当前集合中移除coll集合中所有的元素,需要调⽤equals函数retainAll(Collection coll):求两个集合的交集,结果为修改当前集合后的集合。
list和map的底层原理List和Map是在编程中常用的数据结构,它们在底层实现上有着不同的原理和特点。
本文将分别介绍List和Map的底层原理,并对它们进行比较和分析。
一、List的底层原理List是一种有序的集合,它允许重复元素。
在Java中,常见的List 实现类有ArrayList和LinkedList。
这两种实现方式在底层原理上存在一些差异。
1. ArrayList:ArrayList基于数组实现,它在内存中是一块连续的内存空间。
当我们向ArrayList中添加元素时,它会根据需要动态扩容,并将元素存储在连续的内存空间中。
ArrayList支持快速的随机访问,但在插入和删除元素时效率较低,需要进行元素的位移操作。
2. LinkedList:LinkedList基于链表实现,它由一系列的节点组成,每个节点包含了元素本身以及指向下一个节点的指针。
当我们向LinkedList中添加元素时,它会创建新的节点并将其链接到链表的末尾。
LinkedList支持高效的插入和删除操作,但在随机访问时效率较低,需要遍历链表找到目标位置。
二、Map的底层原理Map是一种键值对的映射结构,它不允许重复的键,但允许重复的值。
在Java中,常见的Map实现类有HashMap和TreeMap。
1. HashMap:HashMap基于哈希表实现,它使用了哈希函数将键映射到存储位置,当我们插入或获取元素时,HashMap会根据键的哈希值快速定位到对应的存储位置。
HashMap支持快速的插入、删除和获取操作,但不保证元素的顺序。
2. TreeMap:TreeMap基于红黑树实现,它将键按照一定的顺序进行排序并存储在树结构中。
当我们插入或获取元素时,TreeMap 会根据键的排序规则在树中进行查找。
TreeMap支持按照键的顺序遍历元素,但插入、删除和获取操作的效率较低。
三、List和Map的比较分析1. 存储特性:List按照元素的插入顺序存储,允许重复元素;Map 按照键值对的方式存储,不允许重复的键。
详解Java中list,set,map的遍历与增强for循环详解Java中list,set,map的遍历与增强for循环Java集合类可分为三⼤块,分别是从Collection接⼝延伸出的List、Set和以键值对形式作存储的Map类型集合。
关于增强for循环,需要注意的是,使⽤增强for循环⽆法访问数组下标值,对于集合的遍历其内部采⽤的也是Iterator的相关⽅法。
如果只做简单遍历读取,增强for循环确实减轻不少的代码量。
集合概念:1.作⽤:⽤于存放对象2.相当于⼀个容器,⾥⾯包含着⼀组对象,其中的每个对象作为集合的⼀个元素出现3.java的容器有集合类和数组,不同之处是区别及其常⽤实现类List接⼝:列表有序元素可重复实现类:ArrayList:动态数组列表LinkedList:双向链表Set接⼝:集⽆序,元素不可重复实现类:HashSet:散列集TreeSet:树集内部排序Map接⼝:以键值对的⽅式存储数据数据-键不允许重复实现类:HashSet:散列集TreeSet:树集内部排序JDK1.0出现的集合类都是线程安全的,但效率低JDK1.2出现的集合类都不是线程安全的,但效率⾼代码⽰例如下:import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Set;public class ListAndSet{public static void main(String[] args) {setTest();listTest();}// 遍历Set集合private static void setTest() {Set<string> set = new HashSet<string>();set.add("A");set.add("B");set.add("C");set.add("D");set.add("E");//set集合遍历⽅法1:使⽤iteratorIterator<string> it = set.iterator();while (it.hasNext()) {String value = it.next();System.out.println(value);}//set集合遍历⽅法2:使⽤增强for循环。
set --其中的值不允许重复,无序的数据结构list --其中的值允许重复,因为其为有序的数据结构map--成对的数据结构,健值必须具有唯一性(键不能同,否则值替换)List按对象进入的顺序保存对象,不做排序或编辑操作。
Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。
Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。
如果添加元素的顺序对你很重要,应该使用 LinkedHashSet或者LinkedHashMap.List的功能方法实际上有两种List: 一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。
List : 次序是List最重要的特点:它保证维护元素特定的顺序。
List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。
)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。
ArrayList : 由数组实现的List。
允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。
ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。
因为那比LinkedList开销要大很多。
LinkedList : 对顺序访问进行了优化,向List中间插入与删除的开销并不大。
随机访问则相对较慢。
(使用ArrayList代替。
)还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
vector和list的区别是什么
对于学c语言的同学来说,vector和list这两个东西经常会搞错。
下面是店铺为大家准备的vector和list的区别是什么,希望大家喜欢!
vector和list的区别一:
vector是顺序表,表示的是一块连续的内存,元素被顺序存储;list 是双向连接表,在内存中不一定连续。
vector和list的区别二:
当数值内存不够时,vector会重新申请一块足够大的连续内存,把原来的数据拷贝到新的内存里面;list因为不用考虑内存的连续,因此新增开销比vector小。
vector和list的区别三:
list只能通过指针访问元素,随机访问元素的效率特别低,在需要频繁随机存取元素时,使用vector更加合适。
vector和list的区别四:
当向vector插入或者删除一个元素时,需要复制移动待插入元素右边的所有元素;因此在有频繁插入删除操作时,使用list更加合适。
vector和list的区别五:
vector在每次扩张容量的时候,将容量扩展2倍,这样对于小对象来说,效率是很高的。
list中的对象是离散存储的,随机访问某个元素需要遍历list。
在list中插入元素,尤其是在首尾插入元素,效率很高,只需要改变元素的指针。
List、Set、Map有什么异同(详解)引⾔:Java集合框架提供了⼀套性能优良、使⽤⽅便的接⼝和类,它们位于java.util包中Java集合框架(常⽤接⼝):Collection 接⼝存储⼀组不唯⼀,⽆序的对象(⽗类接⼝)List 接⼝存储⼀组不唯⼀,有序(插⼊顺序)的对象Set 接⼝存储⼀组唯⼀,⽆序的对象Map接⼝存储⼀组键值对象,提供key到value的映射⼀、List接⼝List是⼀个继承于Collection的接⼝,即List是集合中的⼀种。
List是有序的队列,List中的每⼀个元素都有⼀个索引;第⼀个元素的索引值是0,往后的元素的索引值依次+1。
和Set 不同,List中允许有重复的元素。
实现List接⼝的集合主要有:ArrayList、LinkedList、Vector、Stack。
1.可以允许重复的对象。
2.可以插⼊多个null元素。
3.是⼀个有序容器,保持了每个元素的插⼊顺序,输出的顺序就是插⼊的顺序。
4.常⽤的实现类有 ArrayList、LinkedList 和 Vector。
ArrayList 最为流⾏,它提供了使⽤索引的随意访问,⽽LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
ArrayListArrayList是⼀个动态数组,也是我们最常⽤的集合。
它允许任何符合规则的元素插⼊甚⾄包括null。
每⼀个ArrayList都有⼀个初始容量:private static final int DEFAULT_CAPACITY = 10;随着容器中的元素不断增加,容器的⼤⼩也会随着增加。
在每次向容器中增加元素的同时都会进⾏容量检查,当快溢出时,就会进⾏扩容操作。
所以如果我们明确所插⼊元素的多少,最好指定⼀个初始容量值,避免过多的进⾏扩容操作⽽浪费时间、效率。
size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运⾏。
Java集合的写法1. 介绍Java集合是Java编程语言中的一种数据结构,用于存储和操作对象的集合。
它提供了一组接口和类,用于实现常见的数据结构,如列表、集合、映射等。
使用Java集合,开发人员可以方便地进行数据的存储、检索、添加、删除和操作。
在Java中,集合框架是基于三个主要接口构建的:Collection、List和Set。
其中,Collection接口是其他两个接口的父接口,而List和Set分别表示有序和无序的集合。
2. Java集合框架分类Java集合框架可以分为以下几类:2.1 ListList接口表示有序的集合,允许重复元素。
常用的List实现类有ArrayList、LinkedList和Vector。
2.1.1 ArrayList的写法List<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");2.1.2 LinkedList的写法List<String> list = new LinkedList<>();list.add("Apple");list.add("Banana");list.add("Orange");2.1.3 Vector的写法List<String> list = new Vector<>();list.add("Apple");list.add("Banana");list.add("Orange");2.2 SetSet接口表示无序的集合,不允许重复元素。
常用的Set实现类有HashSet、LinkedHashSet和TreeSet。
Java有序集合详解
Java有序集合
List
ArrayList
ArrayList集合底层采⽤了数组这种数据结构。
ArrayList集合是⾮线程安全的。
LinkedList
LinkedList集合底层采⽤了双向链表数据结构。
Vector
vector集合底层采⽤了数组这种数据结构
vector集合是线程安全的。
vector所有的⽅法都有synchronized关键字修饰,所以线程安全,但是效率较低,现在保证线程安全有别的⽅案,所有Vector使⽤较少。
Set
HashSet
实际上HashSet集合在new的时候,底层实际上new了⼀个HashMap集合,向HashSet集合中存储元素,实际上是存储到HashMap集合中了,HashMap集合是⼀个哈希表数据结构
TreeSet
TreeSet 集合底层实际是TreeMap。
new TreeSet集合的时候,底层实际上new了⼀个TreeMap集合。
往TreeMap集合中放数据的时候,实际上是将数据放在TreeMap集合中,
TreeMap集合底层采⽤了⼆叉树数据结构。
java list和set使用场景Java中的List和Set是两种常用的集合类型,它们各自有着不同的使用场景和特点。
本文将分别介绍List和Set的使用场景,并对其进行详细解析。
一、List的使用场景List是一种有序的集合,可以存储重复的元素。
List的使用场景如下:1. 数据存储:List可以用来存储一组有序的数据,比如存储学生成绩、员工工资等。
List中的元素可以按照插入的顺序进行访问,也可以根据索引进行随机访问。
2. 数据检索:List提供了丰富的方法来检索、访问和修改集合中的元素。
可以根据索引、元素值或自定义条件来进行检索。
3. 数据排序:List可以对集合中的元素进行排序,通过调用Collections.sort(List)方法可以对List进行升序排序。
4. 数据操作:List提供了一系列方法来操作集合中的元素,比如添加元素、删除元素、替换元素等。
5. 数据重复:List允许存储重复的元素,因此适用于需要存储重复数据的场景。
二、Set的使用场景Set是一种不允许存储重复元素的集合,它保证了集合中的元素是唯一的。
Set的使用场景如下:1. 数据去重:Set可以用来去除重复的数据,比如从一个数组或List中去除重复元素。
2. 数据筛选:Set可以用来筛选出满足特定条件的元素,比如筛选出一组不重复的IP地址或手机号码。
3. 数据集合:Set可以用来将多个集合合并成一个集合,并且保证合并后的集合中没有重复的元素。
4. 数据判断:Set提供了判断元素是否存在于集合中的方法,可以快速判断一个元素是否在集合中。
5. 数据去序:Set中的元素是无序的,因此适用于不关心元素顺序的场景。
三、List和Set的区别List和Set在使用上有一些区别,主要体现在以下几个方面:1. 元素顺序:List是有序的,可以根据元素的插入顺序进行访问;而Set是无序的,不保证元素的顺序。
2. 元素重复:List允许存储重复的元素;而Set不允许存储重复的元素,保证集合中的元素是唯一的。
java集合知识点总结集合是JAVA中非常重要的一种数据结构,它是对象的有序集合。
它提供了一系列的API用来操作集合,开发者可以用来存取、添加、移除、排序、搜索数据,可以大大简化编程的工作量。
JAVA中有很多不同的集合类,如ArrayList、Vector、LinkedList、HashSet、HashMap、TreeSet等,它们有着不同的特性,下面着重总结一下它们各自的知识点:1. ArrayList:ArrayList使用可变数组存储数据,是最常用的List实现类,它的性能优于Vector,且不支持线程安全操作,它允许null值和重复数据。
2. Vector:Vector是线程安全的,它内部也使用可变数组存储数据,但它与ArrayList实现机制不同。
它是同步的,允许null值和重复数据,其扩容机制是可以控制的。
3. LinkedList:LinkedList是双向链表,它不支持索引查询操作,所以更适合实现队列、栈等数据结构,同时它也是不同步的,允许null值和重复数据。
4. HashSet:HashSet是基于HashMap实现的,它不允许存放重复的元素,因为它的底层使用的是HashMap,所以它的性能很快,HashSet也不同步,不支持索引,允许null值。
5. HashMap:HashMap可以将键映射到值,它是由Hashtable派生而来的不同步的Map,这个数据结构允许键和值都是null。
6. TreeSet:TreeSet是基于TreeMap实现的,它将元素存放到二叉树结构中,TreeSet不支持索引查询,它是同步的,不允许重复元素,但是可以允许null值。
上述就是java中各种集合类的基础知识点,只有深入学习了解了这些基础知识点,才能够更好地应用它们解决实际开发中的问题。
集合类初始化时需要指定容量大小,大小越小则需要拓展的次数越多,程序效率越低,反之,大小越大,则拓展的次数越少,效率越高。
├List│├LinkedList│├ArrayList│└Vector│└Stack└SetMap├Hashtable├HashMap└WeakHashMapCollection接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。
一些Collection允许相同的元素而另一些不行。
一些能排序而另一些不行。
Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection 的“子接口”如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。
后一个构造函数允许用户复制一个如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。
典型的用法如下:Iterator it = collection.iterator(); // 获得一个迭代子while(it.hasNext()) {Object obj = it.next(); // 得到下一个元素}由Collection接口派生的两个接口是List和Set。
List接口List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。
用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
Java的集合对象都有哪些?
排序:Comparable Comparator Collections.sort()
ArrayList:底层用数组实现的List
特点:查询效率高,增删效率低轻量级线程不安全
LinkedList:底层用双向循环链表实现的List
特点:查询效率低,增删效率高
Vector: 底层用数组实现List接口的另一个类
特点:重量级,占据更多的系统开销线程安全
Set:无顺序的,元素不可重复(值不相同)
遍历:迭代
排序:SortedSet
HashSet:采用哈希算法来实现Set接口
唯一性保证:重复对象equals方法返回为true
重复对象hashCode方法返回相同的整数
不同对象哈希码尽量保证不同(提高效率)
SortedSet:对一个Set排序
TreeSet:在元素添加的同时,进行排序。
也要给出排序规则
唯一性保证:根据排序规则,compareTo方法返回为0,就可以认定两个对象中有一个是重复对象。
Map:元素是键值对key:唯一,不可重复value:可重复
遍历:先迭代遍历key的集合,再根据key得到value
HashMap:轻量级线程不安全允许key或者value是null
Hashtable:重量级线程安全不允许key或者value是null Properties:Hashtable的子类,key和value都是String
SortedMap:元素自动对key排序
TreeMap:
集合是指一个对象可以容纳了多个对象(不是引用),这个集合对象主要用来管理维护一系列相似的对象。
JAVA的容器---List,Map,SetCollection├List│├LinkedList│├ArrayList│└Vector│└Stack└SetMap├Hashtable├HashMap└WeakHashMapCollection接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。
一些Collection允许相同的元素而另一些不行。
一些能排序而另一些不行。
Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。
后一个构造函数允许用户复制一个Collection。
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。
典型的用法如下:Iterator it = collection.iterator(); // 获得一个迭代子while(it.hasNext()) {Object obj = it.next(); // 得到下一个元素}由Collection接口派生的两个接口是List和Set。
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。
用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
LinkedList类LinkedList实现了List接口,允许null元素。
此外LinkedList提供额外的get,rem ove,insert方法在LinkedList的首部或尾部。
这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。
如果多个线程同时访问一个List,则必须自己实现访问同步。
一种解决方法是在创建List时构造一个同步的List:List list = Collections.synchronizedList(new LinkedList(...));ArrayList类ArrayList实现了可变大小的数组。
它允许所有元素,包括null。
ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。
但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。
其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。
这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。
当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Vector类Vector非常类似ArrayList,但是Vector是同步的。
由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Stack继承自Vector,实现一个后进先出的堆栈。
Stack提供5个额外的方法使得Vector 得以被当作堆栈使用。
基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。
Stack刚创建后是空栈。
Set接口Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
请注意:必须小心操作可变对象(Mutable Object)。
如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
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。
添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
Hashtable通过initial capacity和load factor两个参数调整性能。
通常缺省的load factor 0.75较好地实现了时间和空间的均衡。
增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:Hashtable numbers = new Hashtable();numbers.put(“one”, new Integer(1));numbers.put(“two”, new Integer(2));numbers.put(“three”, new Integer(3));要取出一个数,比如2,用相应的key:Integer n = (Integer)numbers.get(“two”);System.out.println(“two = ” + n);由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。
hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。
如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get 方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode 方法,而不要只写其中一个。
Hashtable是同步的。
HashMap类HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。
,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例。
因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
WeakHashMap类WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
总结如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList 换成LinkedList时,客户端代码不用改变。
这就是针对抽象编程。
Java 集合类m ap set list arraylist hashmap hashtable(转)Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList 只增加50%的大小,这样,ArrayList就有利于节约内存空间。
Hashtable和HashMap它们的性能方面的比较类似Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。
ArrayList和LinkedList对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。
(1)从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能。