2019独角兽企业重金招聘Python工程师标准>>>

JAVA 集合类介绍和使用

类关系示意图

Iterable(接口)

└--Collection (接口)

├-List(接口)

│ ├-LinkedList  不同步  (构造同步:List list = Collections.synchronizedList(new LinkedList(...));)

│ ├-ArrayList   不同步

│ └-Vector      同步

│ └--Stack     同步

└-Set

├--EnumSet

├--HashSet --LinkedHashSet

└--TreeSet

Map

├--Hashtable

├--HashMap --LinkedHashMap

└--WeakHashMap

Map接口:

|

+ -- WeakHashMap: 以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。此实现不是同步的。

|

+ -- TreeMap:该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。此实现不是同步的。

|

+ -- HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。此实现不是同步的。

|

+-- SortedMap: 进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序。对有序映射的 collection 视图(由 entrySet、keySet 和 values 方法返回)进行迭代时,此顺序就会反映出来。要采用此排序方式,还需要提供一些其他操作(此接口是 SortedSet 的对应射)。

Collection接口:

|

+ -- Set接口:一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

|      |

|      + -- HashSet:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。此类为基本操作提供了稳定性能,此实现不是同步的。

|      |

|      + -- LinkedHashSet:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。此实现不是同步的。

|      |

|      + -- TreeSet:基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。此实现为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。此实现不是同步的。

|

+ -- List接口:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

|

+ -- ArrayList:List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector 类,除了此类是不同步的。)每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。此实现不是同步的。

|

+ -- LinkedList:List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。提供先进先出队列操作(FIFO)。此实现不是同步的。

|

+ -- Vector:Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。此实现是同步的.

Collection接口

  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接口

  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,remove,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 类

  Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

*/

package myapp.data;

import myapp.model.Article;

import java.text.DateFormat;

import java.text.ParseException;

import java.util.*;

import java.util.Map.Entry;

public class CollectionMethodTest {

private static List<Article> list=new ArrayList<Article>(6);

public static void initialize() throws ParseException{

DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);

list.add(new Article(1,"NBA1","Carl1","NBA Start1",df.parse("2010-01-1"),1));

list.add(new Article(2,"NBA2","Carl2","NBA Start2",df.parse("2010-01-2"),2));

list.add(new Article(3,"NBA3","Carl3","NBA Start3",df.parse("2010-01-3"),3));

list.add(new Article(4,"NBA4","Carl4","NBA Start4",df.parse("2010-01-4"),4));

list.add(new Article(5,"NBA5","Carl5","NBA Start5",df.parse("2010-01-5"),5));

list.add(new Article(6,"NBA6","Carl6","NBA Start6",df.parse("2010-01-6"),6));

}

//列表通常允许重复的元素 ,允许NULL元素,有序

//原型:public interface List<E> extends Collection<E>

//常用实现类:    AbstractList, ArrayList, LinkedList, Stack, Vector

public void listTest(){

}

//HashMap:允许使用 null 值和 null 键,不同步,实现了Map接口和AbstractMap抽象类

//原型:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

public void hashMapTest(){

System.out.println("--------HashMap遍历------");

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

for(Article a : list){

map.put(a.getId(), a.getTitle()+a.getContent());

}

//得到map的所有的键

Set<Integer> keys=map.keySet();

//得到map的所有的值

Collection<String> values=map.values();

//返回包含在此映射中的映射关系的 Set 视图。

Set<Map.Entry<Integer, String>> setEntry=map.entrySet();

//使用Iterator遍历器遍历

System.out.println("--------使用Iterator遍历器遍历------");

Iterator<Entry<Integer,String>> it = setEntry.iterator();

while(it.hasNext()){

Entry<Integer,String> e = it.next();

System.out.println("Id:"+e.getKey()+" Description:"+e.getValue());

}

//使用for遍历

System.out.println("--------使用for遍历------");

for(Entry<Integer,String> e:setEntry){

System.out.println("Id:"+e.getKey()+" Description:"+e.getValue());

}

}

//Set:一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素

//原型:public interface Set<E> extends Collection<E>

//实现类:    AbstractSet, EnumSet, HashSet, LinkedHashSet, TreeSet、 JobStateReasons,CopyOnWriteArraySet

public void setTest(){

Set<String> set=new HashSet<String>();

set.add("No1");

set.add("No2");

set.add("No3");

}

}

转载于:https://my.oschina.net/lenolong/blog/648262

Java集合类和HashMap遍历相关推荐

  1. JAVA笔记- JAVA集合类之HashMap集合

    1- Map接口概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同: Collection中的集合,元素是孤立存在的(理解为单身),向集 ...

  2. Java集合类之Map的HashMap之常用方法的使用

    Java集合类之Map的HashMap之常用方法的使用 任务描述 使用 HashMap 集合操作菜单 相关知识 1.什么是 HashMap HashMap 是 Map 接口的实现类,它存储的内容是键值 ...

  3. Java HashMap遍历的两种方式

    今天来搞一次HashMap 遍历的操作方式: 经过测试,方式一的效率要远高于方式二.,1000000条测试数据,第一种大概耗时20多秒,第二种耗时大概40多秒.所以,建议以后使用第一种方式. 直接上代 ...

  4. [Java] HashMap遍历的两种方式

    Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: Map map = new HashMap ...

  5. Java中HashMap遍历的两种方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  6. 关于java的集合类,以及HashMap中Set的用法!

    來源:http://hi.baidu.com/fyears/blog/item/52329711622e007ccb80c465.html 关于java的集合类,以及HashMap中Set的用法! 2 ...

  7. Java HashMap 遍历方式性能探讨

    转载自 Java HashMap 遍历方式性能探讨 关于HashMap的实现这里就不展开了,具体可以参考JDK7与JDK8中HashMap的实现 JDK8之前,可以使用keySet或者entrySet ...

  8. Java 集合List、Set、HashMap操作一(Array转List、Set排序、HashMap遍历、Set遍历、List遍历、HashMap大小长度、List打乱顺序)

    数组转集合(Array转List) import java.util.*; import java.io.*;public class ArrayToCollection{public static ...

  9. hashmap java 便利_java HashMap 循环遍历map的方法

    java HashMap 循环遍历map的方法(转) import java.util.ArrayList; import java.util.HashMap; import java.util.It ...

  10. Java 基础——HashMap 遍历方式

    目录 1.使用迭代器 (Iterator) EntrySet 的方式进行遍历 2.使用迭代器 (Iterator) KeySet 的方式进行遍历 3.使用 foreach EntrySet 的方式进行 ...

最新文章

  1. 微信小程序开发实战(三)自定义UI样式---增加减少按钮
  2. 【库】/lib64/libc.so.6: version `GLIBC_2.14' not found问题
  3. MySQL二级比office二级_如何快速拿到计算机office二级
  4. 如何使用Squid服务来构建=》传统和透明代理服务器,通俗易懂!
  5. Mongodb 笔记01 MongoDB 简介、MongoDB基础知识、启动和停止MongoDB
  6. 递归问题(代码、分析、汇编)
  7. ADO.NET,浅显
  8. java 条件 等待_java – 如何唤醒等待相同条件的所有线程?
  9. 【华为云技术分享】【DevCloud· 敏捷智库】物理看板和电子看板该如何选择?(内附下载材料)
  10. 基本概念学习--TaskList(任务列表)
  11. Centos操作系统
  12. Burp Suite —— 验证码识别、切换IP
  13. 关于tomcat启动出现To prevent a memory leak, the JDBC Driver has been forcibly unregistered.问题
  14. Knowledge Distillation via Route Constrained Optimization
  15. iOS应用出现未验证应用的问题排查
  16. 深度学习在OCR中的应用
  17. 实体消歧方法(1)__BOOTLEG
  18. android压力测试命令monkey详解,android压力测试命令monkey详解(示例代码)
  19. 王选-“从Dijkstra谈帅才的洞察力”[转]
  20. 普通最小二乘法回归 - OLS (ordinary least square)

热门文章

  1. Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结
  2. Atitit.在线充值功能的设计
  3. atitit.404错误的排查流程总结vOa6
  4. DELL LATITUDE E5510 笔记本电脑屏幕闪烁问题的解决.
  5. 机器学习笔记(七):线性回归 | 凌云时刻
  6. 机器学习笔记(四):kNN算法 | 凌云时刻
  7. 为了永不停机的计算服务 | 凌云时刻
  8. 龙斗士显示网络和服务器,龙斗士热点问题_百田网帮助中心
  9. 【定位问题】基于matlab GUI SLAM模拟地图构建和定位【含Matlab源码 1120期】
  10. 【图像分割】基于matlab遗传算法道路图像分割【含Matlab源码 779期】