JAVA常见容器学习总结
JAVA容器总结
1、JAVA常见容器的继承关系
2、Iterable 接口
Iterable接口是Java集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素。
-
Iterable是一个超级接口,被Collection所继承。它只有一个方法: Iterator<T> iterator() //即返回一个迭代器
-
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
-
Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
-
注意:iterator()方法是java.lang.Iterable接口,被Collection继承。 (2) 使用next()获得序列中的下一个元素。 (3) 使用hasNext()检查序列中是否还有元素。 (4) 使用remove()将迭代器新返回的元素删除。
//源码 package java.lang; import java.util.Iterator; import java.util.Objects; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; public interface Iterable<T> { // 返回一个内部元素为T类型的顺序迭代器 Iterator<T> iterator(); // 对Iterable中的元素进行指定的操作 default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } // 返回一个内部元素为T类型的并行迭代器 default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } }
3、Collection
Collection 是一个的接口,是高度抽象出来的集合,包含了集合的基本操作和属性。
Collection 可以主要分为 set、List 、Queue 三种类型。
不同的Collection子类对于有序性、重复性、null、线程同步都有不同的策略
注意:Map 是不属于 Collection ,Map 是一个独立的数据结构。但是 Collention 又和 Map 的实现上又互相依赖。
4、List接口
-
List是有序的 collection(也称为序列)。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
-
用户插入的顺序或者指定的位置就是元素插入的位置。它与Set不同,List允许插入重复的值。
-
List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法(如下)来获取从列表中指定位置开始的列表迭代器。
4.1、List接口常用实现类之ArrayList
-
ArrayLis是基于数组实现的List类,它封装了一个动态的、增长的、允许再分配的Object[ ]数组.它允许对元素进行快速随机访问
-
当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
package learn_java_demo; import java.util.ArrayList; import java.util.Iterator; public class LearnArrayListDemo { public static void main(String[] args) { ArrayList arr = new ArrayList(); arr.add("aa"); //添加一个元素 arr.add("bb"); arr.add("cc"); arr.add(1,"dd"); //指定位置添加一个元素 Iterator iter = arr.iterator(); while (iter.hasNext()) System.out.println(iter.next()); arr.remove("aa"); //删除一个元素 System.out.println(arr); System.out.println(arr.get(0)); //获取一个指定索引元素 System.out.println(arr.indexOf("cc")); //获取一个元素的索引 } } //输出 aa dd bb cc [dd, bb, cc] dd 2
4.2、List接口常用实现类之LinkedList
-
LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。
-
另外,它还实现了Deque接口,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
package learn_java_demo; import java.util.Iterator; import java.util.LinkedList; public class LearnLinkedList { public static void main(String[] args) { LinkedList arr = new LinkedList(); arr.add("aa"); //添加一个元素 arr.add("bb"); arr.add("cc"); arr.add(1,"dd"); //指定位置添加一个元素 Iterator iter = arr.iterator(); while (iter.hasNext()) System.out.println(iter.next()); arr.remove("aa"); //删除一个元素 System.out.println(arr); System.out.println(arr.get(0)); //获取一个指定索引元素 System.out.println(arr.indexOf("cc")); //获取一个元素的索引 } }
5、Set接口
-
Set集合。java的集合和数学的集合一样,满足集合的无序性,确定性,单一性。Set是无序、不可重复的,Set只能有一个null。
-
Set类似于一个篮子,放入set中的元素是没有前后之分的。
-
Set判断两个对象相同不是使用"=="运算符,而是根据equals方法,在加入一个新元素时,如果新元素对象和Set中已有对象进行equals比较都返回false时,则Set加入新元素对象,否则拒绝。
-
Set最常见的实现类有HashSet、TreeSet、LinkedHashSet
5.1、Set接口常用实现类之HashSet
-
HashSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet会调用该对象的 hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。
-
值得主要的是,HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等
package learn_java_demo; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class LearnHashSetDemo { //Set 集合存和取的顺序不一致。 public static void main(String[] args) { Set hs = new HashSet(); hs.add("aaa"); //添加一个元素到集合中 hs.add("bbb"); hs.add("ccc"); hs.add("ddd"); Iterator it = hs.iterator(); //遍历集合 while (it.hasNext()) { System.out.println(it.next()); } System.out.println(hs.contains("ttt")); //判断元素是否在集合中 } } //输出 aaa ccc bbb ddd false
5.1、Set接口常用实现类之LinkedHashSet
-
LinkedHashSet集合根据元素的hashCode值来决定元素的存储位置,与HashSet不同的是,它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。
-
当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
-
LinkedHashSet需要维护元素的插入顺序,性能略低于HashSet的性能。
package learn_java_demo; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; public class LearnLinkedSet { //Set 集合存和取的顺序不一致。 public static void main(String[] args) { Set hs = new LinkedHashSet(); hs.add("aaa"); //添加一个元素到集合中 hs.add("bbb"); hs.add("ccc"); hs.add("ddd"); Iterator it = hs.iterator(); //遍历集合 while (it.hasNext()) { System.out.println(it.next()); } System.out.println(hs.contains("ttt")); //判断元素是否在集合中 } } //输出 aaa bbb ccc ddd true
6、Queue 接口
用于模拟“队列”数据结构(FIFO)。新插入的元素放在队尾,队头存放着保存时间最长的元素。
6.1、PriorityQueue优先队列
PriorityQueue 优先队列(类)其实它并没有按照插入的顺序来存放元素,而是按照队列中某个属性的大小来排列的。故而叫优先队列。
package learn_java_demo; import java.util.Iterator; import java.util.PriorityQueue; public class LearnPriorityQueueDemo { public static void main(String[] args) { PriorityQueue q = new PriorityQueue(); q.add("111"); //向队列中插入一个值 q.add("222"); q.add("333"); q.add("444"); System.out.println(q.peek()); //用于检索或获取Queue的第一个元素或Queue头部的元素 //循环取出队列中的元素 while (q.size()!=0){ System.out.println(q.poll()); //用于检索或获取Queue的第一个元素并将元素移除 } System.out.println(q.size()); } } //输出 111 111 222 333 444 0
7、Map 接口
-
Map不是collection的子接口或者实现类。Map是一个接口。
-
Map用于保存具有“映射关系”的数据。每个Entry都持有键-值两个对象。其中,Value可能重复,但是Key不允许重复(和Set类似)。
-
Map可以有多个Value为null,但是只能有一个Key为null。
7.1、Map 接口常用实现类之HashMap
HashMap也不能保证key-value对的顺序。并且类似于HashSet判断两个key是否相等的标准一样: 两个key通过equals()方法比较返回true、 同时两个key的hashCode值也必须相等
package learn_java_demo; import java.util.HashMap; import java.util.Map; public class LearnHashMapDemo { public static void main(String[] args) { Map<Integer, String> map=new HashMap<Integer, String>(); map.put(1, "阿里"); //添加一个元素到map中 map.put(2, "腾讯"); map.put(3,"百度"); //map.remove(3); //移除一个键值对 System.out.println(map.get(1)); //获取指定key的值 System.out.println(map.size()); //获取map键值对个数 System.out.println(map.containsKey(1)); //判断是否已存在该key } } //输出 阿里 3 true
7.2、Map 接口常用实现类之LinkedHashMap
LinkedHashMap也使用双向链表来维护key-value对的顺序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致。
package learn_java_demo; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; public class LearnLinkedMap { public static void main(String[] args) { Map<Integer, String> map=new LinkedHashMap<Integer, String>(); map.put(1, "阿里"); //添加一个元素到map中 map.put(2, "腾讯"); map.put(3,"百度"); //map.remove(3); //移除一个键值对 System.out.println(map.get(1)); //获取指定key的值 System.out.println(map.size()); //获取map键值对个数 System.out.println(map.containsKey(1)); //判断是否已存在该key } } //输出 阿里 3 true 欢迎大家关注我的订阅号,会定期分享一些关于测试相关的文章,有问题也欢迎一起讨论学习!订阅号每一条留言都会回复!