java容器类知识点详细总结

1.java容器分类图

2.容器类接口和抽象容器类

2.1 说明

容器接口是容器的基础。使用接口可以将容器的实现与容器接口分开,因而可以使用相同的方法访问容器而不需关心容器具体的数据结构。

同理,Iterator接口也使用户能够使用相同的方法访问不同的容器类。

2.2 容器接口(Collection,Map,Iterator)

1)collection接口

boolean add(Object obj): 添加对象,集合发生变化则返回true
Iterator iterator():返回Iterator接口的对象
int size()
boolean isEmpty()
boolean contains(Object obj)
void clear()
<T> T[] toArray(T[] a)

2)Map接口(存放键值对,Map中的值也可以是一个容器)

Object get(Object key)
Object put(Object key, Object value)
Set keySet() : returns the keys set Set<K> keySet()
Set entrySet(): returns mappings set Set<Map.Entry<K,V>> entrySet()
containsKey()
containsValue() 

3)Iterator接口

Object next()
boolean hasNext()
void remove()

注意:remove函数不能连续执行多次,否则返回IllegalStateException

( if the next method has not yet been called, or the remove method has already been called after the last call to the next method.)

通常用法:

Iterator it=collection.iterator();
    while(it.hasNext())
    {
     Object obj=it.next();
    //do something
    }

2.3 子接口(List,Set,ListIterator,SortedMap,SortedSet)

1)List(有顺序可以重复,有顺序所以操作时可以在方法中加入索引参数,如下:)

boolean add(E element)
void add(int index, E element)
E set(int index, E element)
E get(int index);

2)Set(无顺序不可以重复,无序因而不能通过索引操作对象)

3)ListIterator(Iterator for List,List是双向表,因而在Iterator上增加了一些新的方法,允许traverse the List in either direction)

boolean hasPrevious();
E previous();
int previousIndex()

4) SortedMap

说明:保证按照键的升序排列的映射,可以按照键的自然顺序( Comparable 接口)进行排序, 或者通过创建有序映射时提供的比较器进行排序

(A Map that further provides a total ordering on its keys. The map is ordered according to the natural ordering of its keys, or by a Comparator typically provided at sorted map creation time)

public interface SortedMap<K,V>extends Map<K,V>
Comparator comparator()
Object firstKey()
Object lastKey()

5)SortedSet 

主要用于排序操作,实现此接口的子类都是排序的子类

public interface SortedSet<E>extends Set<E>
  * Comparator comparator()
  * E first() :返回第一个元素
  * E last()
* SortedSet<E> headSet(E toElement): 返回less than toElement
  * SortedSet<E> tailSet(E fromElement)
  * SortedSet<E> subSet(E fromElement) 

2.4抽象容器类

1)说明:使用抽象容器类可以方便的定义类,而不用在每个类中都实现容器接口container 中的所有的方法

2)包含:

* AbstractCollection     public abstract class AbstractCollection<E>extends Objectimplements Collection<E>
  * AbstractList public abstract class AbstractList<E>extends AbstractCollection<E>implements List<E>
  * AbstractSet        public abstract class AbstractSet<E>extends AbstractCollection<E>implements Set<E>
  * AbstactMap public abstract class AbstractMap<K,V>extends Object implements Map<K,V>
  * AbstractSequentialList public abstract class AbstractSequentialList<E> extends AbstractList<E>

3.具体容器类
3.1概括

1)collection: ArrayList,LinkedLsit,Vector,Stack

TreeSet,HashSet,LinkedHashSet

2) Map: HashMap,LinkedHashMap,WeakHashMap, TreeMap, HashTable, IdentityHashTable(其中key的比较是通过==而不是equals)

3.2常用的容器类

1)ArrayList 与 LinkedList(均非同步,多线程时需要考虑线程安全问题),Vector(同步),Stack

1. List 接口支持通过索引的方法来访问元素:ArrayList 随机访问快改慢;LinkedList改快随机访问慢;Vector实现了同步,因而比ArrayList慢

2. LinkedList使用双向链表实现LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

3. ArrayList没有定义增长算法,当需要插入大量元素是,可调用ensureCapacity方法提高添加效率

4. Vector类似与ArrayList,但是是同步的,多线程安全(另外一点区别是ArrayList扩容时默认增长一半,Vector增长一倍)。无论是单线程还是多线程,Vector都比ArrayList慢

5. Stack继承自Vector,实现一个后进先出的堆栈

6.若需要实现同步可以调用Collections工具类的synchronizedList方法,如下:

List list = Collections.synchronizedList(new ArrayList());
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
或者:
List list = Collections.synchronizedList(new LinkedList());

7.定义如下:(注意LinkedList实现了Deque)

public class ArrayList<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, Serializable
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable

  

2)TreeSet, HashSet, LinkedHashSet(HashSet,TreeSet不是线程安全的)

1. TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态,效率很高,可提高程序的效率;TreeSet通过compareTo或者compare排序,因而只要值相等即使equals不等(不同对象)也不能加到集合中(fails to obey Set interface)

2. HashSet,效率很高,和TreeSet不同的是通过比较对象的equals区分不同对象,这样不同的对象可以不被重复的加入到集合中。

hashCode()函数不好确定,对象默认的hashCode函数试对象的内存地址值,hashCode函数的好坏是HashSet性能的关键。

3. LinkedHashSet,和HashSet相同,同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

4. Set可以插入null,最多一个null

3) HashMap(非同步), HashTable(线程安全), TreeMap, WeakHashMap

1.HashTable与HashMap区别:(详情请查看HashTable与HashMap)

  • Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
  • Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的
  • Hashtable中,key和value都不允许出现null值;HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应 的值为null
  • HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

2. WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,WeakHashMap使用元素的引用而不是值作为key,也就是说必须在引用相同(a==b)的情况下才能找到相关的值。另外,如果一个key不再被外部所引用,那么该key可以被GC回收。

3. TreeMap是SortedMap接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字, 根据使用的构造方法不同,可能会按照键的类的自然顺序进行排序

4.定义如下:

public class Hashtable extends Dictionary implements Map, Cloneable, Serializable
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, Serializable

4.容器类使用补充

1)使用抽象编程思想,创建时使用父类引用指向子类对象,返回时返回抽象接口

2)如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。

3)如果程序在单线程环境中使用非同步的类,其效率较高

4)可以使用Collections 工具类中unmodifiableList/unmodifiableMap/unmodifiableSet/unmodifiableSortedMap/unmodifiableSortedSet等创建不能修改的List,Map,List等

5)可以使用Collections工具类中Collections.synchronizedList(new ArrayList())等实现同步

6) 可以使用Arrays.equal()判断两个数组是否相等

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java 容器类源码详解 Set

    前言 Set 表示由无重复对象组成的集合,也是集合框架中重要的一种集合类型,直接扩展自 Collection 接口.在一个 Set 中,不能有两个引用指向同一个对象,或两个指向 null 的引用.如果对象 a 和 b 的引用满足条件 a.equals(b),那么这两个对象也不能同时出现在集合中. 通常 Set 是不要求元素有序的,但也有一些有序的实现,如 SortedMap 接口.LinkedHashSet 接口等. 概述 Set 的具体实现通常都是基于 Map 的.因为 Map 中键是唯一的,

  • Java开发中的容器概念、分类与用法深入详解

    本文实例讲述了Java开发中的容器概念.分类与用法.分享给大家供大家参考,具体如下: 1.容器的概念 在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体 2.容器与数组的关系 之所以需要容器: ① 数组的长度难以扩充 ② 数组中数据的类型必须相同 容器与数组的区别与联系: ① 容器不是数组,不能通过下标的方式访问容器中的元素 ② 数组的所有功能通过Arraylist容器都可以实现,只是实现的方式不

  • Java容器类源码详解 Deque与ArrayDeque

    前言 Queue 也是 Java 集合框架中定义的一种接口,直接继承自 Collection 接口.除了基本的 Collection 接口规定测操作外,Queue 接口还定义一组针对队列的特殊操作.通常来说,Queue 是按照先进先出(FIFO)的方式来管理其中的元素的,但是优先队列是一个例外. Deque 接口继承自 Queue接口,但 Deque 支持同时从两端添加或移除元素,因此又被成为双端队列.鉴于此,Deque 接口的实现可以被当作 FIFO队列使用,也可以当作LIFO队列(栈)来使用

  • java容器类知识点详细总结

    1.java容器分类图 2.容器类接口和抽象容器类 2.1 说明 容器接口是容器的基础.使用接口可以将容器的实现与容器接口分开,因而可以使用相同的方法访问容器而不需关心容器具体的数据结构. 同理,Iterator接口也使用户能够使用相同的方法访问不同的容器类. 2.2 容器接口(Collection,Map,Iterator) 1)collection接口 boolean add(Object obj): 添加对象,集合发生变化则返回true Iterator iterator():返回Iter

  • Java基本知识点之变量和数据类型

    Java中的变量和基本数据类型: 写完第一个java程序之后,我们对Java也有了初步的了解,现在我们再来继续认识一下Java中的基本知识点--变量和数据类型. 那么我们该怎样来认识变量和数据类型呢,在这里,我们首先来认识一下内存,我们日常生活中的计算机体系中内存主要分为内存储器和外存储器,比如说我们平常看我们电脑配置的时候,都会看到8G+256G这样的标志,其中的8G就是所说的内存储器(RAM),而256G也就是外存储器,诸如磁盘,u盘,光盘等,这里我们就不详细的研究了.我们定义的变量占用的就

  • Java容器类的深入理解

    Java容器类包含List.ArrayList.Vector及map.HashTable.HashMap ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而ArrayList和HashMap并不是线程安全的.因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于ArrayList和HashMap.Collection├List       接口│├LinkedList       链表

  • Java Proxy机制详细解读

    动态代理其实就是java.lang.reflect.Proxy类动态的根据您指定的所有接口生成一个class byte,该class会继承Proxy类,并实现所有你指定的接口(您在参数中传入的接口数组):然后再利用您指定的classloader将 class byte加载进系统,最后生成这样一个类的对象,并初始化该对象的一些值,如invocationHandler,以即所有的接口对应的Method成员. 初始化之后将对象返回给调用的客户端.这样客户端拿到的就是一个实现你所有的接口的Proxy对象

  • Java继承概念详细解读

    继承与合成基本概念 继承:可以基于已经存在的类构造一个新类.继承已经存在的类就可以复用这些类的方法和域.在此基础上,可以添加新的方法和域,从而扩充了类的功能. 合成:在新类里创建原有的对象称为合成.这种方式可以重复利用现有的代码而不更改它的形式. 1.继承的语法 关键字extends表明新类派生于一个已经存在的类.已存在的类称为父类或基类,新类称为子类或派生类.例如: class Student extends Person { } 类Student继承了Person,Person类称为父类或基

  • Java操作Redis详细介绍

    1. 简介 Redis 是一个开源(BSD许可)的,内存中的key-value存储系统,它可以用作数据库.缓存和消息中间件. 2. 对key的操作 首先要建立连接Jedis jedis = new Jedis("127.0.0.1", 6379),然后就可以对string,set,zset,hash进行操作了. //对key的测试 public void keyTest() { System.out.println(jedis.flushDB()); //清空数据 System.out

  • Java中超详细this与super的概念和用法

    前言:理论和代码必须结合起来才能真正的掌握 一.this 概念:this代表着当前对象的引用,也是当前函数所属对象的引用.直白的说,哪个对象调用了当前函数,this就代表哪个对象. 常见的用法(理论不理解就先参考下面案例) 最常见的情况是是对象的一个属性或被构造器的参数屏蔽时,如果需要调用屏蔽的属性,this就代表哪个对象 this只能在方法内使用,表示正在调用方法的那个对象,但是,如果在方法内调用同一个类的另一个方法,就不必使用this,直接调用即可,this关键字是能省则省 this和sta

  • 详解Java注解知识点

    一.注解是什么 Java 注解用于为 Java 代码提供元数据,看完这句话也许你还是一脸懵逼,用人话说就是注解不直接影响你的代码执行,仅提供信息.接下我将从注解的定义.元注解.注解属性.自定义注解.注解解析JDK 提供的注解这几个方面再次了解注解(Annotation) 二.jdk支持的注解有哪些 2.1 三种常用的注解: @SuppressWarnings 该注解的作用是阻止编译器发出某些警告信息.它可以有以下参数: deprecation :过时的类或方法警告. unchecked:执行了未

  • Java Swing最详细基础知识总结

    一.简介 Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕显示元素.它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT.它们是JFC的一部分.它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们.这意味着你可以在任意平台上使用JAVA支持的任意面板.轻量级

  • Java基础之详细总结五种常用运算符

    一.算术运算符 算术运算符的符号通常为:加(+).减(-).乘(*).除(/).取余(%).自增(++).自减(--). 使用int类型的变量和int类型的变量做除法,得到的结果还是int类型: 使用double类型的常量和 int类型的常量做除法,会得到double类型的结果:在使用强制类型double转换可以得到double类型 System.out.println(7 / 2);//3.0 System.out.println((double)(7 / 2)); // 3.0 System

随机推荐