JAVA基础——集合浅析

Java  集合

什么时候数组会显得力不从心,没法满足需求,需要集合类呢?

  1. 不知道具体数据长度
  2. 需要自动排序
  3. 存储键值对

当然,上面的情况不是绝对的,只是数组比较难满足。这时集合类(也可称为容器类)就显示了它强大的功能。

集合类的分类(图片转自http://biancheng.dnbcw.info/1000wen/359774.html)

上图中不包含Queue内容,部分Map的实现类未给出。

常见使用的有List、Set、Map及他们的实现类。

List、Set、Map接口及各实现类的特性


接口


特性


实现类


实现类特性


成员要求


List


线性、有序的存储容器,可通过索引访问元素


ArrayList


数组实现。非同步。


Vector


类似ArrayList,同步。


LinkedList


双向链表。非同步。


Map


保存键值对成员


HashMap


基于哈希表的 Map 接口的实现,满足通用需求


任意Object对象,如果修改了equals方法,需同时修改hashCode方法


TreeMap


默认根据自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序


键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。


LinkedHashMap


类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序


与HashMap相同


IdentityHashMap


使用==取代equals()对“键值”进行比较的散列映射


成员通过==判断是否相等


WeakHashMap


弱键映射,允许释放映射所指向的对象


ConcurrentHashMap


线性安全的Map


Set


成员不能重复


HashSet


为快速查找设计的Set


元素必须定义hashCode()


TreeSet


保持次序的Set,底层为树结构


元素必须实现Comparable接口


LinkedHashSet


内部使用链表维护元素的顺序(插入的次序)


元素必须定义hashCode()

在满足要求的情况下,Map应尽量使用HashMap,Set应尽量使用HashSet。

    集合类的基本使用

    List

List基本操作

ArrayList和LinkedList的效率比较

ArrayList添加元素的效率

执行时间比较


执行次数(在0号位置插入)


ArrayList所用时间(ms)


LinkedList所用时间(ms)


10000


31


0


20000


141


0


40000


484


16


80000


1985


0


160000


7906


0


320000


31719


16


执行次数(在尾部插入)


ArrayList所用时间(ms)


LinkedList所用时间(ms)


10000


0


0


20000


15


0


40000


0


0


80000


0


0


160000


0


15


320000


0


16


循环输出次数(get(index)方法)


ArrayList所用时间(ms)


LinkedList所用时间(ms)


10000


93


204


20000


188


797


40000


328


2734


80000


688


13328


160000


1594


62313


320000


2765


太久了……

因为ArrayList底层由数组实现,在0号位置插入时将移动list的所有元素,在末尾插入元素时不需要移动。LinkedList是双向链表,在任意位置插入元素所需时间均相同。所以在List中有较多插入和删除操作的情况下应使用LinkedList来提高效率,而有较多索引查询的时候使用ArrayList(使用增强型的for循环或Iterator遍历LinkedList效率将提高很多)。

数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组相关。刚开始接触Java时也是一直使用数组写一些程序,后来越来越觉得数组这东西没法满足需求了,这时一位“前辈”对我说了一句:不会用集合类就等于没学过Java。然后才知道有集合类。

想想已经是3、4年前的事了,时间如白驹过隙啊。

什么时候数组会显得力不从心,没法满足需求,需要集合类呢?

  1. 不知道具体数据长度
  2. 需要自动排序
  3. 存储键值对

当然,上面的情况不是绝对的,只是数组比较难满足。这时集合类(也可称为容器类)就显示了它强大的功能。

集合类的分类(图片转自http://biancheng.dnbcw.info/1000wen/359774.html)

上图中不包含Queue内容,部分Map的实现类未给出。

常见使用的有List、Set、Map及他们的实现类。

List、Set、Map接口及各实现类的特性


接口


特性


实现类


实现类特性


成员要求


List


线性、有序的存储容器,可通过索引访问元素


ArrayList


数组实现。非同步。


Vector


类似ArrayList,同步。


LinkedList


双向链表。非同步。


Map


保存键值对成员


HashMap


基于哈希表的 Map 接口的实现,满足通用需求


任意Object对象,如果修改了equals方法,需同时修改hashCode方法


TreeMap


默认根据自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序


键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。


LinkedHashMap


类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序


与HashMap相同


IdentityHashMap


使用==取代equals()对“键值”进行比较的散列映射


成员通过==判断是否相等


WeakHashMap


弱键映射,允许释放映射所指向的对象


ConcurrentHashMap


线性安全的Map


Set


成员不能重复


HashSet


为快速查找设计的Set


元素必须定义hashCode()


TreeSet


保持次序的Set,底层为树结构


元素必须实现Comparable接口


LinkedHashSet


内部使用链表维护元素的顺序(插入的次序)


元素必须定义hashCode()

在满足要求的情况下,Map应尽量使用HashMap,Set应尽量使用HashSet。

    集合类的基本使用

    List

List基本操作

ArrayList和LinkedList的效率比较

ArrayList添加元素的效率

执行时间比较


执行次数(在0号位置插入)


ArrayList所用时间(ms)


LinkedList所用时间(ms)


10000


31


0


20000


141


0


40000


484


16


80000


1985


0


160000


7906


0


320000


31719


16


执行次数(在尾部插入)


ArrayList所用时间(ms)


LinkedList所用时间(ms)


10000


0


0


20000


15


0


40000


0


0


80000


0


0


160000


0


15


320000


0


16


循环输出次数(get(index)方法)


ArrayList所用时间(ms)


LinkedList所用时间(ms)


10000


93


204


20000


188


797


40000


328


2734


80000


688


13328


160000


1594


62313


320000


2765


太久了……

因为ArrayList底层由数组实现,在0号位置插入时将移动list的所有元素,在末尾插入元素时不需要移动。LinkedList是双向链表,在任意位置插入元素所需时间均相同。所以在List中有较多插入和删除操作的情况下应使用LinkedList来提高效率,而有较多索引查询的时候使用ArrayList(使用增强型的for循环或Iterator遍历LinkedList效率将提高很多)。

原文地址:https://www.cnblogs.com/huan-guo/p/8453997.html

时间: 2024-10-26 10:29:45

JAVA基础——集合浅析的相关文章

Java基础——集合(三)——泛型、增强for、工具类

         接上篇,<Java基础--集合(二)--迭代器.Map集合> 六.泛型 (1)定义: 泛型是一种把明确类型的工作放在了创建对象或者调用方法时候才去明确的特殊的类型. (2)格式: <数据类型> ArrayList<String> aList=new ArrayList<String>(); <String> 即表示的是泛型 (3)好处:(掌握) A:解决了黄色警告线问题 B:把运行期间的转换异常给提前到了编译期间 C:优化了程序

Java基础——集合(二)——迭代器、Map集合

接上篇,<Java基础--集合(一)--集合体系和Collection> 四.迭代器的使用 使用步骤: 1.通过集合对象获取迭代器对象. 2.通过迭代器对象判断. 3.通过迭代器对象获取. 迭代器原理 由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同. 这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种集合的时候,只要该集合内部实现这个接口即可. 迭代器源码 public interface Iterator { publicabstract boolean

黑马程序员——java基础——集合(Collection)

 黑马程序员--java基础--集合(Collection) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 集合框架的构成及分类,如下图: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象. 3.

java基础-集合笔记

Iterator(foreach) 遍历时只能通过iterator去删除(添加)元素,不能直接通过集合对象删除或添加元素 Set HashSet底层是一个HashMap HashSet添加元素,先判断hashCode,Set中没有相同的则直接添加,Set中有相同的元素,则进一步判断equals,不同则添加,相同则添加不成功 HashSet删除元素,先判断hashCode,相同则再判断equals,equals相同则删除该 List 1.元素是否相同是通过equals方法进行判断的 2.Array

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员---java基础--集合、数组、字符串的综合面试题

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 这道题综合了集合,数组,字符串,字符串缓冲区,自动装箱等知识点,你把这道题做会了,java基础你也就学的差不多了. 问题: 自定义一个段由小写字母组成的字符串统计每个字母出现的次数. 例如:abc,输出结果为:a(1)b(1)c(1) 代

Java 基础 - 集合

Collection              Collection 集合 在 java.util 包中, 其中 Collection 包含: List: 必须按特定的顺序容纳元素 Set: 不可包含任何重复的元素 注意: Map 不在 Collection 集合中. Collection的主要方法 Boolean add(Object): 如果没添加, 则返回 false(Set 常用) Boolean addAll(Collection) void clear(): 清除所有 Boolean

黑马程序员——java基础---集合框架

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.集合框架 概念:集合框架是Java中为了方便对集合进行存储.操作而形成的体系.集合是针对对象最常见的一种存储形式. 数组和集合类同是容器,区别在哪里?     相同点:               集合和数组都是容器,都可一存储对象(对象引用).     不同点:               数组长度固定,集合长度可变.               数组可以存储基本数据类型,集合却只能存储

Java基础——集合源码解析 List List 接口

今天我们来学习集合的第一大体系 List. List 是一个接口,定义了一组元素是有序的.可重复的集合. List 继承自 Collection,较之 Collection,List 还添加了以下操作方法 位置相关:List 的元素是有序的,因此有get(index).set(index,object).add(index,object).remove(index) 方法. 搜索:indexOf(),lastIndexOf(); 迭代:使用 Iterator 的功能板迭代器 范围性操作:使用 s