Java中的集合概述

Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map。

由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类。

1.HashMap、Hashtable和TreeMap

(1)java.lang.Object

继承者 java.util.AbstractMap<K,V>

继承者 java.util.HashMap<K,V>

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

(2)java.lang.Object

继承者 java.util.Dictionary<K,V>

继承者 java.util.Hashtable<K,V>

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable

(3)java.lang.Object

继承者 java.util.AbstractMap<K,V>

继承者 java.util.TreeMap<K,V>

public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable

其中,HashMap不是线程
安全的;HashTable是线程安全的,其线程安全是通过sychronize实现的。基于该原因,HashMap效率高于HashTable。

HashMap的键可以为null,HashTable不可以。

在多线程环境下,HashMap配合Collections工具类使用来实现线程安全;还可以选择ConcurrentHashMap,该类的线程安全是通过Lock的方式实现的,所以效率高于Hashtable。

数组,链表,哈希表,三者各有优劣。数组使用连续的内存空间,查找速度快,增删慢;链表充分利用了内存,存储空间是不连续的,首尾各存储上下一个节点的信息,所以寻址较慢,即查找速度慢,但是增删快;哈希表综合了前二者的优点,一个哈希表,由数组和链表组成。假设一条链表有1000个节点,现在要查找最后一个节点,就得从第一个遍历到最后一个;如果用哈希表,将这条链表分为10组,用一个容量为10的数组来存储这10组链表的头结点(a[0] = 0 , a[1] = 100 , a[2] = 200 …以此类推),这样的话就明显提高了寻址效率。

HashMap就是基于上述哈希表原理实现的寻址,Hashtable同理,只不过做了同步处理。

HashMap输出是无序的,这个无序不是说每次遍历的结果顺序不一样,而是说与插入顺序不一样

另外,TreeMap是按键排序的,默认升序,所以可以通过TreeMap来实现。TreeMap的排序是在底层基于比较器(Comparator接口的int compare(T o1,T o2),Comaparable接口的int compareTo(T o))实现的。

HashMap实现线程同步的方式有两种,一种是:

       Map<Integer , String> hs = new HashMap<Integer , String>();

        hs = Collections.synchronizedMap(hs);

  另一种是:

    ConcurrentHashMap<Integer , String> hs = new ConcurrentHashMap<Integer , String>();

  2.List接口及其子类ArrayList,LinkedList,Vector,Stack。

public interface List<E> extends Collection<E>

(1)java.lang.Object

继承者 java.util.AbstractCollection<E>

继承者 java.util.AbstractList<E>

继承者 java.util.ArrayList<E>

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

(2)java.lang.Object

继承者 java.util.AbstractCollection<E>

继承者 java.util.AbstractList<E>

继承者 java.util.AbstractSequentialList<E>

继承者 java.util.LinkedList<E>

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable

(3)java.lang.Object

继承者 java.util.AbstractCollection<E>

继承者 java.util.AbstractList<E>

继承者 java.util.Vector<E>

public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

(4)java.lang.Object

继承者 java.util.AbstractCollection<E>

继承者 java.util.AbstractList<E>

继承者 java.util.Vector<E>

继承者 java.util.Stack<E>

public class Stack<E> extends Vector<E>

其中,ArrayList和Vector本质都是用数组实现的,而LinkList是用双链表实现的。所以,Arraylist和Vector在查找效率上比较高,增删效率比较低;LinkedList则正好相反。

ArrayList是线程不安全的,Vector是线程安全的,在效率没有ArrayList高。实际使用中,一般也不怎么用Vector,可以自己做线程同步,也可以用Collections配合ArrayList实现线程同步。

在排序上,List是使用Collections类的sort方法,构造Comparator或者让List中的对象实现Comparable都可以。

Stack继承自Vector,在用法、线程安全方面的跟Vector都差不多,有几个地方需要注意,一是add()和push(),stack是将最后一个element作为栈顶的,add()返回boolean,就是添加成功了没有,push()返回的是添加的元素,一般推荐使用push;二是peek()和pop(),这两个方法都能得到栈顶元素,区别是peek()只是读取,对原栈没有什么影响,pop()从字面上就能理解为“出栈”,所以原栈的栈顶元素就没了。

3.Set接口及其子类HashSet,TreeSet。

public interface Set<E> extends Collection<E>

(1)java.lang.Object

继承者 java.util.AbstractCollection<E>

继承者 java.util.AbstractSet<E>

继承者 java.util.HashSet<E>

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable

(2)java.lang.Object

继承者 java.util.AbstractCollection<E>

继承者 java.util.AbstractSet<E>

继承者 java.util.TreeSet<E>

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable

总的来说,Set集合类的特点是可以去重,它们的内部实现都是基于Map的,用的是Map的key,而Map的key是不可以重复的。既然要去重,就需要比较,而比较是基于hascode()方法和equals()方法的。

原文地址:https://www.cnblogs.com/lizhangyong/p/8150975.html

时间: 2024-11-03 22:19:16

Java中的集合概述的相关文章

Java中的集合框架(上)

Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的条目: 3.有的集合接口,提供了一系列排列有序的元素,并且 可以在序列中间快速的插入或删除有关的元素. 4.有的集合接口,提供了映射关系,可以通过 关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型. 与数组的对比一为何选择集合而不是数组 1.数组的长度固定,集合长度可变 2.数

java中的集合框架

由于数组具有属性单一,长度不可改变的缺点,于是在程序中我们使用集合来代替它. 集合中不可放入基本数据类型,基本数据类型都是通过自动拆包和自动装箱功能才能放入和取出集合. 分类:Collection接口和Map接口 Collection:存放单一值元素,又可分为list接口类型和set接口类型 list接口类型:存放元素是有序的可重复的,可通过循环来取出其中的元素,实现类ArrayList() set接口类型:hash值排列,存放元素是无序不可重复的,通过指针取出其中元素,实现类HashSet()

菜鸟日记之 java中的集合框架

java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterator接口所以具有了iterator()方法 ,该方法返回一个Iterator<T>,这个接口具有 HasNext (),next(),remove()3个方法可以在实现类里完成实现. hasNext():判断是否有下一个元素 cusor是当前的操作下标 next():读取下一个元素 remove(

java中的集合操作类(未完待续)

申明: 实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点 废话 其实我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList<XXXXX>(); 但是我仅仅只是了解,list这个类是一个可变长用来存储的对象实例的类,我甚至觉得这个List对象可以理解成数组,但是却又与java中咱们正常理解的数组很多的不同,比如说,他的长度可以随着需要自动增长,比如说,实例化一个List类就和咱们声明数组的时候是不一样的! 今天的实习生活

java中TreeSet集合如何实现元素的判重

1 /* 2 看一下部分的TreeSet源码.... 3 public class TreeSet<E> extends AbstractSet<E> 4 implements NavigableSet<E>, Cloneable, java.io.Serializable 5 { 6 private transient NavigableMap<E,Object> m; 7 //NavigableMap继承SortedMap, 二者都是接口,在TreeMa

java中list集合的内容,如何使用像数据库中group by形式那样排序

java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    money(名称)  (金额) 来源A   100来源B   200来源C   300来源B   6600来源A   99800<数据1> 最后想实现的是:如果假设这些数据在数据库中,那么通过 select name,sum(money) from Table group by name 该语句得到的Li

java中各种集合的用法和比较

一,java中各种集合的关系图 Collection       接口的接口     对象的集合 ├ List             子接口         按进入先后有序保存   可重复 │├ LinkedList    接口实现类     链表     插入删除   没有同步   线程不安全 │├ ArrayList     接口实现类      数组     随机访问   没有同步   线程不安全 │└ Vector        接口实现类       数组              

Java 中的集合接口——List、Set、Map

Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组跟集合有什么区别: 数组:长度固定,遍历速度快 可以存储基本类型和引用类型: 集合:长度不固定,只能存储引用类型对象: 从数组跟集合的特点我们很明显的看出,数组有一定的局限性,如果我们需要不定期的往我们的数据中存储数据,数组就满足不了我们的要求. Java集合框架提供了一套性能优良.使用方便的接口和

JAVA笔记整理(九),JAVA中的集合

在工作中,我们经常需要将多个对象集中存放,可以使用数组,但是数组的长度一旦固定之后是不可变的,为了保存数量确定的数据,我们可以使用JAVA中的集合. 在我看来,JAVA中的集合可以看作是一个特殊的数据库,可以针对这个数据库进行数据的增删查改,可以查看数据库的大小,查看数据库是否为空等等. JAVA中的集合是由Collection和Map两个接口派生出来的,正因为是两个接口,所以只能通过其子类来将其实例化,下图为常用集合: Collection是List.Queue和Set接口的父接口,Map是H