java集合总结

xiaoxiao2021-02-28  91

为知笔记http://a36bf370.wiz03.com/share/s/2zq_dM1mlQS52P2klg35rzwa0z0Eah2zqkmk2UA-PM0OzNhV

集合概述

java集合是一个长度可变的容器,用于存储对象。集合类位于java.util包下,而java.util.concurrent包下也提供了一些多线程支持的集合类。集合主要分为以下几类

List 代表有序,可以重复的集合Set 代表无序,不可重复的集合Map 代表具有映射关系的集合Queue 代表队列集合的实现

集合只能保存对象的引用变量,而数据既可以保存对象的引用变量,也能保存基本类型的值。

集合的顶级接口Collection和Map

Collection set 元素无序(存入和取出顺序可能不一样),不可重复元素无序(存入和取出顺序可能不一样),不可重复 HashSet 数据结构hash表,线程不同步。TreeSet 可以对Set集合中的元素进行排序。list 元素有序,可重复,因为该集合体系有索引 ArrayList 底层存储方式(数据结构)使用的是数组结构 特点:查询速度快,线程不同步底层存储方式(数据结构)使用的是数组结构 特点:查询速度快,线程不同步。LinkedList 底层使用的链表数据结构 特点:增删改快。线程不同步Vector 数组结构,线程同步,被ArrayList替代。Queue ArrayQequeMap HashMap,TreeMap,Hashtable.

Iterator

Iterator接口主要用于Collection集合的遍历,被称之位迭代器。其实现原理: 先来看一下Iterator,定义了以下几个接口。

public interface Iterator<E> { boolean hasNext(); //是否有下一个元素 E next(); //获取下一个元素并返回 default void remove() { //移除元素 throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) {} //Lambda相关 }

而Collection下的具体集合呢,都会有一个内部类去实现这个接口。并且都会提供要给方法返回这个实现类。

public Iterator<E> iterator() { return new Itr();}

利用多态的特性,对内每个集合类都有自己特有的迭代处理方式,但对外,使用者使用每个集合的迭代方式都得到了统一。List和set集合写法都差不多,如下所示:

List<String> names = new ArrayList<>(); Iterator<String> it = names.iterator(); while (it.hasNext()) { String name = it.next(); }

Itertor迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改,程序立即引发ConcurrentModificationException异常。这样可以避免共享资源而引发的潜在问题。

使用foreach循环遍历集合元素

List<String> names = new ArrayList<>(); for(String name : names){ System.out.print(name); }

Set

Set集合的是否相等的比较规则:存储对象时,先对比哈希值,再用equals对比

先比哈希值不同,直接存对象哈希值相同,用equals比不同,存该对象哈希值相同,用equals比相同,不存储该对象

HashSet按Hash算法来存储集合中的元素,具有很好的存取和查找性能。

不能保证元素的排列顺序。HashSet不是同步的。集合元素值可以是null

TreeSet采用红黑树的数据结构存储集合元素。以下简述Treeset的排序。

第一种排序,让元素自身实现Comparaable接口,并复写compareTo方法。如果compareTo直接返回正数,存的顺序就是取的顺序,单右边型二叉树。如果comparaTo直接返回负数,存和取得顺序相反,单左边型二叉树。如果compareTo返回0.那么只会存第一个树。第二种排序,当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。如果两种排序方式都存在,会使用第二种方式进行排序。 TreeSet(Comparator public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); ....... } 默认情况下,Treeset采用自然排序。通过调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合按升序排序。向TreeSet集合中添加元素时,该元素必须是实现了Comparable接口的对象。并且TreeSet只能添加同一种类型的对象。

List

##### List集合允许重复元素,可以通过索引来访问指定位置的集合元素,索引值从0开始递增。其判断两个对象是否相同是通过判断equals()方法比较返回true即可。 java8中List新增的方法 - void sort(Comparator c) 进行List的排序。 - void replaceAll(UnaryOperator operator) 根据operator指定的计算规则重新设置List集合的所有元素。 - ListIterator listIterator(),ListIterator接口zaiIterator接口的基础上增加了如下方法 - boolean hasPrevious() :是否有上一个元素 - Object previous() : 返回该迭代器的上一个元素 - void add(Object 0):在指定位置插入一个元素。

ArrayList(数组:随机访问性能较好,插入,删除元素差)
默认长度为10。ArrayList是线程安全的。固定长度的List,通过Arrays的asList方法返回的List集合是要给固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加,删除该集合里的元素。

Vector(随机访问和插入删除都差)

默认长度为10.Vector是线程不安全的。Vector提供了一个Stack的子类,即栈,后进先出。 Enumeration en = v.elements(); while(en.hasMoreElement()){ System.out.println(en.nextElement()); }
LinkedList(单链表:随机访问较差,插入删除元素较好)

LinkedList实现了Deque接口和List接口,可以根据索引来随机访问集合中的元素,也被当成双端队列来使用,可以是当作栈,也可以当作队列来使用。

Map集合

Map集合概述 : - Map用于保持具有映射关系的数据,key和value可以是任何引用类型的数据,Map的key不允许重复,value允许重复,即任何两个key通过equals方法比较总是返回false。新增key相同的键值对会覆盖原来的键值对。 - Map提供了一个Entry内部类来封装key-value对,而计算Entry存储时只考虑Entry封装的key。从java源码来看,java先实现了Map,然后通过包装一个所有value都是null的Map就实现了Set集合。

Map<String,String> map = new HashMap<String,String>(); ..... Set<String> keySet = map.keySet(); Iterator<String> it = keySet.iterator(); while(it.hasNext()){ String key = it.next(); String value = map.get(key); }

HashMap

线程不安全的底层哈希表数据结构可以使用null作为key或value。但key不能重复,所以key只能有一个是null的。value可以重复,所以可以有多个value是null的。

HashTable

线程安全的底层哈希表数据结构不允许使用null作为key和value,如果试图把null值放进Hashtable中,将会引发NullPointerException异常;

TreeMap

线程不同步底层二叉树结构可以用于给map集合中的键进行排序

HashMap和Hashtable使用需要注意 : 1. 用作key的对象必须实现 hashCode()和 equals()。 2. 判断两个key相同的标准也是先判断hashcode值是否相等,再判断equals是否相等。 3. 判断两个对象的value相等的标准是通过equals方法比较两个value对象的值是否相等。 4. 当使用自定义类作为HashMap和Hashtable的key时,需要保证equals和hashCode方法的判断标准一致,即当两个key通过equals方法比较返回true时,两个key的hashCode返回值也应该相同。

LinkedHashMap

HashMap的子类,通过双向链表来维护key-value对的次序,迭代顺序与key-value对的插入顺序保持一致。避免了对HashMap和Hashtable的key-value对的的排序,也避免使用TreeMap所增加的成本。

Properties读写属性文件

Properties是Hashtable的子类,在处理属性文件时特别方便。属性值和属性名只能是字符串类型。 Properties props = new properties(); //向Properties中添加属性 props.setProperty("username","123"); //将Properties中的key-value对保持到本地a.ini文件中 props.store(new FileOutputStream("a.ini"),"comment line"); //加载文件中的key-value对追加到props2中。 //props2.load(new FileInputString("a.ini"));
转载请注明原文地址: https://www.6miu.com/read-53357.html

最新回复(0)