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
欢迎大家关注我的订阅号,会定期分享一些关于测试相关的文章,有问题也欢迎一起讨论学习!订阅号每一条留言都会回复!​

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值