Java Collection集合用法详解

目录
  • 1.集合的主要体系及分支
    • 1.1Collection集合及实现类
  • 2.List集合(List是带有索引的,所以多注意索引越界等问题)
    • 2.1 List的实现类
  • 3.Set集合
    • 3.1HashSet(Set的实现类)
    • 3.2TreeSet集合(Set的实现类)
  • 4.集合的高频面试题
    • 4.1Arraylist 与 LinkedList 异同
    • 4.2ArrayList 与 Vector 区别
  • 集合框架底层数据结构总结
    • 1.Collection

1.集合的主要体系及分支

1.1Collection集合及实现类

1.概述:首先Collection是属于单列集合的顶层接口,表示为一组对象。其类型为引用数据类型,具体创建对象,通过多态的形式进行。
2.主要常用方法(E这种是指泛型类型,可以为任何引用类型):

3.Collection集合的遍历(Iterator迭代器,集合的专用遍历方式)
概述:

2.List集合(List是带有索引的,所以多注意索引越界等问题)

1.概述:有序集合,且允许有重复的元素,使用者可以精确的控制每个元素的插入位置,并且可以快速访问。
特点:有序(存储与取出顺序一致),且元素可以重复。

2.常用方法:

3.List的列表迭代器(Listlterator)

用法:可以按照任意方向进行遍历,并在迭代期间修改列表,并获取列表中迭代器的位置,是list集合特有的迭代器。
常用方法:

当使用倒叙遍历时,是需要注意先进行一遍正向顺序;或者直接通过Collection工具类中的reverse()的方法进行倒叙,再输出。

4.并发修改异常(ConcurrentModificationException)

主要产生原因:通过内部类的形式,当通过hasNext()这个方法时,遍历集合中加以判断并添加时会发生并发异常,是因为list.add()会导致实际的修改集合和预期的修改集合不对等而触发并发修改异常。
因为:当你使用list的add方法时候,只会添加实际修改集合的值,而预期的修改集合值不会增加,而hasNext()的使用是需要预期和实际进行判断的。
如何避免这种异常出现?

1.使用列表迭代器的方法进行添加,因为add不会导致实际与预期的不对等。

2.通过for循环进行遍历。

2.1 List的实现类

1.ArrayList(底层数据结构属于数组实现,增删慢,查询快);
2.LinkedList(底层数据结构属于双链表,查询慢,增删快);
常用方法:

3.Set集合

特点:集合是无序的(存储与取出顺序不一致),且不允许有重复元素,没有索引值,因此不能使用普通for遍历。

3.1HashSet(Set的实现类)

1.哈希值

概述:哈希值是JDK通过对象的地址或者字符串或者数字算出来的int类型的值。
特点:同一个对象的哈希值是相同的,且在默认情况下不同对象的哈希值是不同的。

2.数据结构之哈希表

3.怎么HashSet集合的元素唯一性?(重中之重)

4.LinkedHashSet集合(HashSet的子类)

LinkedHashSet集合元素是有序的。

3.2TreeSet集合(Set的实现类)

特点:可以通过自然排序或者特定的比较器(主要用于Comparable接口来进行)来进行排序;
自然排序Comparable:

String类实现类自然排序Comparable接口,则可以直接调用用来判断字符串之间的大小,而当一个类的对象之间需要比较时,是需要实现自然排序Comparable接口,重写其中compareTo的方法。(TreetSet可以通过匿名内部类的方法来进行重写自然排序方法)。

4.集合的高频面试题

4.1Arraylist 与 LinkedList 异同

1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;
2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向循环链表数据结构;
3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(add(int index, E element))时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。
4. 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandmoAccess 接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。
5. 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

4.2ArrayList 与 Vector 区别

Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。
Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。

集合框架底层数据结构总结

1.Collection

1. List

Arraylist: Object数组
Vector: Object数组
LinkedList: 双向循环链表

2. Set

HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素。
LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。
TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)。

到此这篇关于Java Collection集合用法详解的文章就介绍到这了,更多相关Java Collection集合内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java Collection集合遍历运行代码实例

    Iterator : 迭代器,集合的专用遍历方式 Iterator <E> iterator() : 返回此集合中元素的迭代器,通过集合的iterator()方法得到 迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖于集合而存在的 Iterator中的常用方法 E next() : 返回迭代中的下一个元素 boolean hasNext() : 如果迭代具有更多元素,则返回true 代码如下 public class CollectionDemo_01 { public s

  • 剖析Java中在Collection集合中使用contains和remove为什么要重写equals

    目录 引言 源码剖析 实例测试 String类和包装类的特殊情况 自定义类型 总结 引言 在Collection集合中: contains方法是判断一个集合里面是否包含指定元素,如果有则返回true: remove方法是从集合中删除指定元素的单个实例: 这两个方法看起很简单,用起来也很简单,同样也非常常用:但是,它们到底是怎么匹配到相应的元素呢? 源码剖析 以ArrayList为例,我们分析一下ArrayList中的contains和remove的源码: 先看看contains: 这里看到比较的

  • Java中关于Collections集合工具类的详细介绍

    Collections 是一个操作 Set.List 和 Map 等集合的工具类. Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变.对集合对象实现同步控制等方法. 排序操作 reverse(List):反转 List 中元素的顺序 shuffle(List):对 List 集合元素进行随机排序 sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序 sort(List,Comparator):根据指定的 C

  • 深入浅出讲解Java集合之Collection接口

    目录 一.集合框架的概述 二.集合框架(Java集合可分为Collection 和 Map 两种体系) 三.Collection接口中的方法的使用 四.集合元素的遍历操作 A. 使用(迭代器)Iterator接口 B. jdk5.0新增foreach循环,用于遍历集合.数组 五.Collection子接口之一:List接口 List接口方法 ArrayList的源码分析: JDK 7情况下: JDK 8中ArrayList的变化: LinkedList的源码分析: Vector的源码分析: 六.

  • JAVA容器集合全面解析(Collection和Map)

    目录 前言 一.Collection集合 1.1List集合 1.1.1ArrayList集合 1.1.2LinkedList集合 1.2Set集合 1.2.1HashSet集合 HashSet集合保证元素唯一性源码分析: 1.2.2TreeSet集合 比较器排序Comparator的使用: 二.Map集合 2.1Map集合的概述与特点 2.2Map集合的获取功能 2.3Map集合的遍历方式(方式一) 2.4Map集合的遍历方式(方式二) 2.5HashMap集合 前言 本次我将分享的是java

  • Java Collection集合iterator方法解析

    这篇文章主要介绍了Java Collection集合iterator方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Iterator接口概述 /** * java.util.Iterator接口:选代器(对集合进行遍历) * 有两个常用的方法 * boolean hasNext() * 如果仍有元素可以迭代,则返回true. * 即判断集合中还有没有下ー个元素,有就返回true,没有就返回 false * E next() * 返回送代

  • JAVA collection集合之扑克牌游戏实例

    Collection 层次结构中的根接口.Collection表示一组对象,这些对象也称为collection的元素.一些 collection 允许有重复的元素,而另一些则不允许.一些 collection 是有序的,而另一些则是无序的.JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现.此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection. 主要内容:这里使用collection集合,模拟香港电影中大佬们玩的

  • Java Collection集合用法详解

    目录 1.集合的主要体系及分支 1.1Collection集合及实现类 2.List集合(List是带有索引的,所以多注意索引越界等问题) 2.1 List的实现类 3.Set集合 3.1HashSet(Set的实现类) 3.2TreeSet集合(Set的实现类) 4.集合的高频面试题 4.1Arraylist 与 LinkedList 异同 4.2ArrayList 与 Vector 区别 集合框架底层数据结构总结 1.Collection 1.集合的主要体系及分支 1.1Collection

  • Java Map集合用法详解

    目录 Map集合的概述 常用方法: 遍历方式: Map的实现类: HashMap TreeMap 集合嵌套(补充知识): 高频面试题 1.Map 2.HashMap的底层实现 Map集合的概述 概述:interface Map<K,V> 其中K是键的类型,键是唯一的,不重复.V是值的类型,是可以重复.且每个键可以映射最多一个值.注意的是如果存在两个相同的键时,则会将现在的值替换之前的值. 创建方式:以多态的形式创建对象. 特点: 键值对映射关系 一个键对应一个值 键不能重复,值可以重复 元素存

  • Java RandomAccessFile的用法详解

    RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件. RandomAccessFile不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和 DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫

  • Java中SimpleDateFormat用法详解

    public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (date -> text).语法分析 (text -> date)和标准化. SimpleDateFormat 允许以为日期-时间格式化选择任何用户指定的方式启动. 但是,希望用 DateFormat 中的 getTimeInstance. getDateInstance 或 getDateTime

  • Java中DecimalFormat用法详解

    我们经常要将数字进行格式化,比如取2位小数,这是最常见的.Java 提供DecimalFormat类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: importjava.text.DecimalFormat; public class TestNumberFormat{ public static void main(String[]args){ doublepi=3.1415927; //圆周率 //取一位整数 System.out.println(newDecimalForm

  • java.text.DecimalFormat用法详解

    简要 DecimalFormat 的 pattern 都包含着 正负子 pattern ,例如 "#,##0.00;(#,##0.00)": /** * Created by Shuai on 2016/7/11. */ public class Main { public static void main(String[] args) { // 正值 BigDecimal bigDecimal = BigDecimal.valueOf(-12211151515151.541666);

  • java Beanutils.copyProperties( )用法详解

    这是一篇开发自辩甩锅稿~~~~ 昨天测试小姐姐将我的一个bug单重开了,emmmm....内心OS:就调整下对象某个属性类型这么简单的操作,我怎么可能会出错呢,一定不是我的锅!!but再怎么抗拒,bug还是要改的,毕竟晚上就要发版本了~~ 老老实实将我前天改的部分跟了一遍,恩,完美,没有任何的缺失~~but本应success的测试数据,接口返还的结果确实是false来着,那还是老老实实debug吧. 一步步跟下来,恩,多么顺畅,就说一定不是我的锅~~诶?不对不对,这里的ID值,为啥是null?传

  • Java String类用法详解

    一.简介 零碎知识点 extends Object implements serializable,Comparable< String >,charSequence String类表示字符串,所有字符串文字都是此类的对象 字符串是不变的,值在创建后无法更改 对象一旦声明则不可改变,改变的只是地址,原来的字符串还是存在的,并且产生垃圾 任何一个""都为字符串对象,无赋值则为匿名对象 用"+"拼接字符串尽量避免,一般用append+toString Str

  • Java Arrays.sort()用法详解

    Java的Arrays类中有一个sort()方法,该方法是Arrays类的静态方法,在需要对数组进行排序时,非常的好用. 但是sort()的参数有好几种,下面我就为大家一一介绍,这几种形式的用法. 1.Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序. 举例如下: import java.util.Arrays; public class Main { public static void main(String[] args) { int

  • Java System.setProperty()用法详解

    /* * 设置指定键对值的系统属性 * setProperty (String prop, String value); *  * 参数: * prop - 系统属性的名称. * value - 系统属性的值.   *  * 返回: * 系统属性以前的值,如果没有以前的值,则返回 null. *  * 抛出:   * SecurityException - 如果安全管理器存在并且其 checkPermission 方法不允许设置指定属性. * NullPointerException - 如果

随机推荐