1. 程式人生 > >Java集合看了這篇爛文 就夠了(不要臉的說)

Java集合看了這篇爛文 就夠了(不要臉的說)

由於自己不斷受挫,最近在深惡補Java 基礎,感覺集合的魅力深深的吸引了我,我來記錄一下最近的學習筆記,同時分享給大家:

提個名詞,或許你知道 陣列, 在不認識集合之前儲存大量物件,一般使用的就是陣列,但是呢眾所周知陣列如果進行動態的改變即增加或者刪除元素 時,會導致很不方便。大概由於這個原因吧,產生了集合這種 interesting 的容器,下面我們療效結合那些事。
偷來的集合框架圖

一、關於 Collection 介面 的那些事

1、常識

集合中儲存的東西,被稱之為物件,也可以稱之為元素。Collection 是集合的頂層介面,他的具體實現類存取的元素,有唯一的、有序的、也有無序的。

2、Collection 的具體功能描述

1)、新增功能
boolean add(E e) 新增單個元素
boolean addAll(Collection c) 新增一個集合元素
2)、刪除功能
void clear() 刪除集合內所有元素
boolean remove(Object o)移除一個元素
boolean removeAll(Collection c)移除集合內資料
3)、判讀功能
boolean contains(Object o)判讀集合內是否包含指定元素
boolean containsAll(Collection c)判斷集合中包含指定集合的集合元素
boolean isEmpty()

判斷集合是否為空
4)、獲取功能
Iterator<E> iterator() 迭代
5)、測量長度
int size()返回集合內元素的數量
6)、交集
boolean retainAll(Collection c)兩個集合內公共的元素即兩個集合包含的相同元素

3、方法使用演示

由於 Collection 是個介面並且沒有子介面,那麼我們就用它的子介面的實現類,ArrayList就很好,下面開始我的表演

1、 add(E e)方法
    //新增功能
    private static void collectionTest() {
        Collection<String> ct = new
ArrayList<>(); boolean what = ct.add("北京"); ct.add("天津"); ct.add("上海"); ct.add("河北"); ct.add("山東"); ct.add("山西"); System.out.println("what:" + what + " 集合內容:" + ct); }

執行結果可以看出,新增成功返回值為 true。

2、clear()方法
  Collection<String> ct = new ArrayList<>();
        boolean what = ct.add("北京");
        ct.add("天津");
        ct.add("上海");
        ct.add("河北");
        ct.add("山東");
        ct.add("山西");
        System.out.println("what:" + what + "   集合內容:" + ct);

        //移除功能
        ct.clear();
        System.out.println("clear 之後的集合:" + ct);

移除之後的結果呼叫 clear() 方法之後 集合內資料被清空

3、remove()方法
  Collection<String> ct = new ArrayList<>();
        boolean what = ct.add("北京");
        ct.add("天津");
        ct.add("上海");
        ct.add("河北");
        ct.add("山東");
        ct.add("山西");
        System.out.println("what:" + what + "   集合內容:" + ct);
        //移除指定元素
        ct.remove("天津");
        System.out.println("移除指定元素之後:"+ct);

移除指定元素

remove 方法:當移除成功時返回值為true,當移除失敗 返回 false(當集合內不包含指定元素則移除失敗)

4、contains(Object o)方法
  Collection<String> ct = new ArrayList<>();
        ct.add("北京");
        ct.add("天津");
        ct.add("上海");
        ct.add("河北");
        ct.add("山東");
        ct.add("山西");
        System.out.println( "集合內容:" + ct);
        //判斷包含
        boolean what = ct.contains("天津");
        System.out.println("what:" + what +"  呼叫方法之後集合:" + ct);

判斷包含的結果

可以看出來,當包含元素時,返回為true,否則為false

5、size()和 isEmpty() 方法

size()方法類似,陣列的 length()方法
isEmpty()方法 只是對集合進行的判空,是空的則返回 true,否則為 false

6、addAll()方法
  Collection<String> ct = new ArrayList<>();
        ct.add("北京");
        ct.add("天津");
        ct.add("上海");
        ct.add("河北");
        ct.add("山東");
        ct.add("山西");
        System.out.println("ct 集合內容:" + ct);
        //判斷包含
        Collection<String> ctAdd = new ArrayList<>();
        ctAdd.addAll(ct);
        System.out.println("ctAdd 集合內容:" + ctAdd);

方法效果展示

由此可以推斷出
boolean removeAll(Collection c)方法和boolean containsAll(Collection c)方法均是將整個集合進行相關操作,返回值表示是否操作成功

7、集合的遍歷

1)、轉換集合為陣列進行相關操作

  Collection<String> ct = new ArrayList<>();
        ct.add("beijing");
        ct.add("tianjin");
        ct.add("shanghai");
        ct.add("hebei");
        ct.add("shandong");
        ct.add("shanxi");
        System.out.println("ct 集合內容:" + ct);

        Object[] o = ct.toArray();

        for (int i = 0; i < ct.size(); i++) {
            System.out.println("O 陣列內容:" + o[i]);
        }

執行結果

2)、迭代器

        ct.add("北京");
        ct.add("天津");
        ct.add("上海");
        ct.add("河北");
        ct.add("山東");
        ct.add("山西");
        System.out.println("ct 集合內容:" + ct);

        Iterator<String> iterator = ct.iterator();

        while (iterator.hasNext()) {
            Object obj = iterator.next();
            System.out.println("遍歷結果:" + obj);
        }

使用 Iterator 物件對 集合內資料進行遍歷輸出,是常用的遍歷手段。

其中 hasNext() 方法為判斷遍歷集合是否包含下一個元素。

next() 方法為查詢下一個元素。

通過集合獲取迭代器物件的過程本質上是直接拿到集合,然後在集合內進行相關操作。

總結:遍歷集合的步驟大概總結為: a、擁有一個非空集合; b、通過集合物件回去迭代器物件; c、通過迭代器的 hasNext()方法判讀是否還有下一個物件;d、通過迭代器的 next()方法獲取元素並且移動到下一個位置。

二、List 的那些事

1、常識

List 是 一個有序的 Collection 的介面,這裡的有序指的是,新增到集合和從集合內取出的順序是有序的。

2、方法使用與演示

由於List 整合 Collection 介面,所以父介面有得方法,它都有了,面向物件三大特性,你懂得。下面我們說一下特有的方法吧
1)、新增功能
void add(int index, Object o) 集合指定位置新增元素
2)、獲取功能
Object get(int index) 根據索引獲取元素
int indexOf(Object o)獲取集合內第一次出現元素的索引
int lastIndexOf(Object o) 獲取集合內最後一次出現指定元素的索引
3)、迭代功能
ListIterator listIteretor()List 集合的特有迭代器
4)、刪除功能
Object remove(int index)刪除指定位置元素並返回
5)、擷取功能
subList(int startIndex, int endIndex)擷取集合內兩個索引之間的資料

3、方法演示

1、void add(int index, Object o) 方法
 List<String> list = new ArrayList<>();
        list.add("北京");
        list.add("天津");
        list.add("上海");
        list.add("河北");
        list.add("山東");
        list.add("山西");


        System.out.println("list 集合內容:" + list);

        list.add(0,"中國");

        System.out.println("list 集合插入元素後:" + list);

演示例項

但是該方法使用的索引必須的最大值只能等於集合的長度,否則會:陣列下標越界

2、Object get(int index) 方法
   List<String> list = new ArrayList<>();
        list.add("北京");
        list.add("天津");
        list.add("上海");
        list.add("河北");
        list.add("山東");
        list.add("山西");


        System.out.println("list 集合內容:" + list);

        String s=list.get(2);
        System.out.println("list 得到的資料:" + s);

執行結果

該方法,如果獲取的元素的索引大於集合的長度,則會 陣列下標越界。

3、列表迭代器 ListIterator listIteretor()
   List<String> list = new ArrayList<>();
        list.add("北京");
        list.add("天津");
        list.add("上海");
        list.add("河北");
        list.add("山東");
        list.add("山西");


        System.out.println("list 集合內容:" + list);

        ListIterator<String> lit = list.listIterator();

        while (lit.hasNext()) {
            String s = lit.next();
            System.out.println("正向迭代出來的資料:" + s);
        }
        System.out.println("-------------------------------");
        while (lit.hasPrevious()) {
            String s = lit.previous();
            System.out.println("逆向迭代出來的資料:" + s);
        }

使用效果

這個迭代器可以進行倒序迭代,但是呢,前提必須是之前進行過正序迭代之後,才可以。

三、ArrayList 的那些事兒

1、常識

ArrayList: 底層為陣列實現,查詢速度快,增刪慢,執行緒不安全,效率高。

2、方法演示

ArrayList 沒有什麼特別的方法,使用 ArrayList 和使用 List 沒什麼特別的區別,建議研究透徹 List 介面 即可很熟練的使用 ArrayList 。

四、Vector 類的那些事兒

1、常識

底層實現為陣列 ,查詢快 、增刪慢 、執行緒安全、效率低

2、特有方法

1)、新增功能
void addElement(Object o)新增元素
2)、獲取功能
Object elementAt(int index)獲取指定位置元素

Enumeration elements()類似於迭代器

3、方法演示

   Vector<String> vector = new Vector<>();
        vector.addElement("北京");
        vector.addElement("天津");
        vector.addElement("上海");
        vector.addElement("河北");
        vector.addElement("山東");
        vector.addElement("山西");

        System.out.println("vector 集合內容:" + vector);

        for (int i = 0; i < vector.size(); i++) {
            System.out.println("for 迴圈遍歷產生的第" + i + "個數據:" + vector.elementAt(i));
        }

        System.out.println("-------------------------------");

        Enumeration<String> enumeration = vector.elements();
        while (enumeration.hasMoreElements()) {
            System.out.println("Enumeration 遍歷產生資料:" + enumeration.nextElement());
        }

效果展示

ArrayList 的出現就是為了替代 Vector 集合的。所以這兩個類的各種功能很相似。

五、LinkedList 類的那些事

1、常識

頂層為連結串列實現、查詢慢、增刪快、執行緒不安全、效率高

2、特有方法

1)、增加功能
void addFirst(Object o)在集合首端新增元素
void addLast(Object o)在集合的末尾新增元素
2)、獲取功能
Object getFirst()獲取集合第一個元素
Object getLast()獲取集合最後一個元素
3)、刪除功能
Object removeFirst()移除第一個
Object removeLast()移除最後一個

3、方法演示

    LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("北京");
        linkedList.add("天津");
        linkedList.add("上海");
        linkedList.add("河北");
        linkedList.add("山東");
        linkedList.add("山西");

        System.out.println("linkedList 集合內容:" + linkedList);

        linkedList.addFirst("中國");
        linkedList.addLast("臺灣");

        System.out.println("新增首尾的 linkedList集合:"+linkedList);

效果展示
這裡不再重複移除功能和獲取功能,三種功能類似。

總結:

到這裡 List 的分支已經說的差不多了,下面我們來實際運用一下。

需求:去除集合內的重複元素

實現需求:

1)、建立新集合方式的去重

   List<String> list = new ArrayList<>();
        list.add("北京");
        list.add("天津");
        list.add("上海");
        list.add("河北");
        list.add("河北");
        list.add("河北");
        list.add("河北");
        list.add("山東");
        list.add("山西");

        System.out.println("原有資料:" + list);

        List<String> list1New = new ArrayList<>();

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {

            String s = iterator.next();
            if (!list1New.contains(s)) {
                list1New.add(s);
            }
        }
        for (int i = 0; i < list1New.size(); i++) {
            System.out.println("去重之後的集合 list1New:" + list1New.get(i));
        }

實現效果
2)、不建立新集合方式

  List<String> list = new ArrayList<>();
        list.add("北京");
        list.add("天津");
        list.add("上海");
        list.add("河北");
        list.add("河北");
        list.add("河北");
        list.add("河北");
        list.add("山東");
        list.add("山西");
        list.add("山西");
        list.add("山西");

        for (int i = 0; i < list.size(); i++) {
            for (int j = i + 1; j < list.size(); j++) {
                if (list.get(i).equals(list.get(j))) {
                    list.remove(j);
                    //不新增該步驟,會導致連續資料去重,去不乾淨
                    j--;
                }
            }
        }

        System.out.println("去重後集合: " + list);

執行結果

在註釋處新增指定的操作,否則導致有重複資料不可去除乾淨。

六、Set 介面那些事兒

1、常識

存入資料 唯一、無序。

2、特有方法

Set 查詢得知,它的方法和 collection 方法完全相同,所以,不太懂或者還有點懵逼,可以看一下前面。

3、效果演示

 Set<String> set = new HashSet<>();
        set.add("北京");
        set.add("天津");
        set.add("上海");
        set.add("河北");
        set.add("山東");
        set.add("山東");

        System.out.println("set集合資料: " + set);

執行效果:
執行效果

充分驗證了無序與唯一;

七、HashSet 的那些事兒

1、常識

不能保證迭代順序、底層資料結構是雜湊表(雜湊表依賴於雜湊值儲存)、底層新增資料依賴於haseCode()方法和 equals()方法。

2、獨有方法

很高興的告訴你,HashSet 類也沒有自己獨特的方法,那麼,我們來分析一下它是這麼保證唯一性的吧。

3、分析 Set 的實現集合怎麼保證資料唯一性

HashSet<String> set = new HashSet<>();
        set.add("北京");
        set.add("天津");
        set.add("上海");
        set.add("河北");
        set.add("山東");
        set.add("山東");

        for (String s:set){
            System.out.println("set集合資料: " + s);
        }

下面拿起我們的小手,熟練地 跟著add()方法進入原始碼:

 public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

仔細看只是個 map 新增資料啊,然後跟著 map物件 檢視一下:private transient HashMap<E,Object> map; 呦,是個HashMap啊,跟著 map 的值看一下 private static final Object PRESENT = new Object();是個常量,沒大用。那麼 HashMap 就是我們研究的重點了,HashMap 實現了 Map 介面。然後那我們只能看一下 HashMap 的新增元素的方式了,跟著 put()方法,點開原始碼:

public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

//------------------------------------------------------

 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

仔細一看 putVal()方法一枝獨秀,對我們很有價值,仔細研究一下:首先,資料進入的時候進行非空的的判斷,待判斷完成之後,進行 hash值的判斷,但是hash 值相等,但是不代表資料一致,繼續進行地址值的判斷,還需要進行 equals()方法的判斷,若判斷結果為 true 則可以將資料進行儲存。

總結:

可以得出一個結論比較事物的相同,首先比較 hash 值、其次是比較地址值、最後是進行 equals 判斷。

這樣導致一個問題,一個類沒有實現 hashCode()方法和 equals()方法, 則需要開發者主動實現這兩個方法。這樣才可以保證唯一性。

八、LinkedHashSet 的那些事

1、常識

元素有序唯一、底層由連結串列保證元素有序、雜湊表保證元素唯一性。

2、特有方法

方法全部來自於實現的介面,所以,請看Set 的相關方法。

3、方法使用

   LinkedHashSet<String> set = new LinkedHashSet<>();
        set.add("北京");
        set.add("天津");
        set.add("上海");
        set.add("河北");
        set.add("山東");
        set.add("山東");

        for (String s:set){
            System.out.println("set集合資料: " + s);
        }

結果展示

總結:

該集合特點:有序、唯一

九、TreeSet 的那些事兒

1、常識

底層基於 TreeMap 實現、按照元素的自然順序排序(按照某種規則排序),也可根據建立 Set 時提供的 comparator(比較器) 進行排序。

2、特有方法

方法也是和之前的 Set 型別集合相同,沒有特殊方法

3、程式碼演示

  TreeSet<String> set = new TreeSet<>();
        set.add("aaa");
        set.add("ddd");
        set.add("ccc");
        set.add("zzz");
        set.add("kkk");
        set.add("rrr");

        for (String s:set){
            System.out.println("set集合資料: " + s);
        }

執行結果

4、TreeSet 儲存自定義物件 相關問題

1)、自定義物件如何保證排序以及唯一性
原始自定義物件程式碼:

public class Provice {
    private String name;
    private int num;

    public Provice(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

呼叫程式碼:

  TreeSet<Provice> set = new TreeSet<>();
        set.add(new Provice("北京",1));
        set.add(new Provice("天津",2));
        set.add(new Provice("上海",3));
        set.add(new Provice("重慶",4));
        set.add(new Provice("河北",5));


        for (Provice s:set){
            System.out.println("set集合資料: " + s);
        }

執行結果:
執行結果

報錯,報錯原因不能按照某種規則排序,所以改進

兩種解決bug方法:

第一種,外部類實現 Comparable 介面

改進之後的自定義物件程式碼:

public class Province implements Comparable<Province> {
    private String name;
    private int num;

    public Province(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "Province{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }


    @Override
    public int compareTo(Province o) {

        //排序的主要條件,按照數字的大小進行排序
        int number = this.num - o.num;
        //次要條件,按照字典順序進行排序
        return number == 0 ? this.name.compareTo(o.name) : number;
    }
}

程式碼呼叫

  TreeSet<Province> set = new TreeSet<>();
        set.add(new Province("北京",1));
        set.add(new Province("天津",2));
        set.add(new Province("上海",10));
        set.add(new Province("山西",10));
        set.add(new Province("重慶",9));
        set.add(new Province("河北",5));


        for (Province s:set){
            System.out.println("set集合資料: " + s);
        }
第二種方法 使用匿名內部類方式

外部類程式碼不變

public class Province {
    private String name;
    private int num;

    public Province(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "Province{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
}

程式碼呼叫:

   TreeSet<Province> set = new TreeSet<>(new Comparator<Province>() {
            @Override
            public int compare(Province o1, Province o2) {

                //排序的主要條件,按照數字的大小進行排序
                int number = o1.getNum() - o2.getNum();
                //次要條件,按照字典順序進行排序
                return number == 0 ? o1.getName().compareTo(o2.getName()) : number;
            }
        });
        set.add(new Province("北京", 1));
        set.add(new Province("天津", 2));
        set.add(new Province("上海", 10));
        set.add(new Province("山西", 10));
        set.add(new Province("重慶", 9));
        set.add(new Province("河北", 5));


        for (Province s : set) {
            System.out.println("set集合資料: " + s);
        }

總結:

當使用無參構造的時,TreeMap 內的元素按照自然順序進行相關排序。

十、Map 集合那些事兒

1、常識

儲存鍵值對元素、鍵值對內鍵是唯一、值可以重複、結構特點只與鍵有關。

Map集合特點:儲存資料成對出現、鍵唯一、值可重複;
Collection集合特點:集合元素單獨出現、Set集合元素唯一、List集合元素可重複;

2、特有方法

1)、新增功能:
V put(K key, V value)新增元素;
2)、刪除功能:
void clear();刪除集合所有元素;
V remove(Object key) ;根據鍵移除資料,並且返回值;
3)、判斷功能:
boolean containsKey(Object key);判斷集合是否包含指定的鍵;
boolean containsValue(Object value);判斷集合是否包含指定的值;
boolean isEmpty();判斷集合是否為空;
4)、獲取功能
Set<Map.Entry<K,V>> entrySet()
v get(Object key)根據鍵 獲取值;
Set<K> keySet();獲取集合中所有鍵的集合;
Collection <v>values獲取集合中所有值的集合;
5)、數量統計
int size()返回鍵值對的數量。

3、方法演示

1)、 put() 方法

程式碼例項:


        Map<String, Integer> map = new HashMap<>();

        map.put("北京", 1);
        map.put("天津", 1);
        map.put("上海", 3);
        map.put("重慶", 4);
        map.put("河北", 5);
        map.put("河北", 6);
        map.put(
            
           

相關推薦

Java集合 不要的說

由於自己不斷受挫,最近在深惡補Java 基礎,感覺集合的魅力深深的吸引了我,我來記錄一下最近的學習筆記,同時分享給大家: 提個名詞,或許你知道 陣列, 在不認識集合之前儲存大量物件,一般使用的就是陣列,但是呢眾所周知陣列如果進行動態的改變即增加或者刪除元素 時,會導致很不方便。大概由

Java進階專題(十一) 想理解JVM文章,知道

## 前言 ​ 上次講解了JVM記憶體相關知識,今天繼續JVM專題。 ## JVM垃圾回收演算法 ### 什麼是垃圾回收 ​ 程式的執行必然需要申請記憶體資源,無效的物件資源如果不及時處理就會一直佔有記憶體資源,最終將導致記憶體溢位,所以對記憶體資源的管理是非常重要了。 ### 什麼樣的物件需要回收

如何使用Python爬取資料?文章你

前段時間小編髮了一篇有關於Python資料型別的文章,由於只是介紹了資料型別,我覺得遠遠不夠,所以呢我現在寫一篇用Python爬取資料的文章來補充。   首先我會介紹如何使用scrapy抓取二手房資料,然後我會將抓下來的資料進行了一些簡單的分析和視覺化。最後奉上資料,感興趣的朋友可

什麼是執行緒?文章你

  0 引子 這是一篇基礎複習文件, 在寫 python 指令碼的時候, 確實感覺到 python 基礎不紮實導致程式碼在執行時, 老是出現一些基礎性的錯誤。因此決定接下來的一段時間對 python 的基礎知識進行學習和鞏固。 注意: 由於 python2 將會在不久之後

PDF怎麽拆分成多個PDF,文章你明白

c89 pro 很好 有著 效果圖 分享 內容 拖拽 雙擊 PDF文件對於每一個經常在職場上工作的人來說,是特別常見的一個文檔格式,PDF格式深受人們的喜愛,因為是特別好用的,但同時也是比較難進行編輯和修改的,特別是遇到PDF文檔過長,為了方便瀏覽和及時查找對我們有用的內容

想理解JVM文章,知道

## 前言 ​ 本章節屬於Java進階系列,前面關於設計模式講解完了,有興趣的童鞋可以翻看之前的博文,後面會講解JVM的優化,整個系列會完整的講解整個java體系與生態相關的中介軟體知識。本次將對jvm有更深入的學習,我們不僅要讓程式能跑起來,而且是可以跑的更快!可以分析解決在生產環境中所遇到的各種“棘手”

最新阿裏Java技術面試題,

重載 系統 java 開發 搜索框 分代 公司 poll arr oscache 金三銀四跳槽季即將到來,作為 Java 開發者你開始刷面試題了嗎?別急,小編整理了阿裏技術面試題,看這一文就夠了! 阿裏面試題目目錄 技術一面(基礎面試題目) 技術二面(技術深度、技術原理

關於Java集合框架,講的還算不錯,建議大家看看!

## 集合框架 為什麼要用集合而非陣列: 雖然陣列是儲存一組物件最有效的方式,但是陣列具有固定尺寸,但在寫程式時並不知道將需要多少個物件。而集合能夠自動地調整自己的尺寸。 列印陣列時,必須使用`Arrays.toString()`,但是列印集合可以直接列印。 建立集合物件如果不使用泛型,那麼預設可以存

文章你清楚的知道 ZooKeeper的 概念

問題 sta leader 監聽服務 生成 項目 一輪 ges 服務註冊 前言 相信大家對 ZooKeeper 應該不算陌生。但是你真的了解 ZooKeeper 是個什麽東西嗎?如果別人/面試官讓你給他講講 ZooKeeper 是個什麽東西,你能回答到什麽地步呢? 我本人曾

wwwlyjustcom,你會Linux基本操作,請耐完199O8836661

command sts r文件 正常 內置命令 生態 regular ces 開頭 只有光頭才能變強這個學期開了Linux的課程了,授課的老師也是比較負責任的一位。總的來說也算是比較系統地學習了一下Linux了~本文章主要是總結Linux的基礎操作以及一些簡單的概念,對於開

你們都在用IntelliJ IDEA嗎?或許你們需要一下

寫在前面 以前一直用的eclipce,如今入坑IntelliJ IDEA,沒想到啊。深深的愛上了它,強大到無所不能; "工欲善其事必先利其器",IntelliJ IDEA作為一個非常好用的工具,他的神奇之處真的很多很多,掌握了這款idea的技巧之後,開發效率至少提升兩倍以上,而且對一些英

什麽是5G,文章你徹底懂

推出 ext 世界 障礙 amp 設備 文字 革命 http 人類已經經歷了六次信息技術革命為: 第一次:語言的使用 讓信息可以分享 第二次:文字的創造 讓信息可以記錄 第三次:印刷術的發明 讓信息可以傳得更遠 第四次:無線電的發明 讓信息可以遠距離實時

async,await執行流不懂?以後再也不會

昨天有朋友在公眾號發訊息說看不懂await,async執行流,其實看不懂太正常了,因為你沒經過社會的毒打,沒吃過牢飯就不知道自由有多重要,沒生過病就不知道健康有多重要,沒用過ContinueWith就不知道await,async有多重要,下面我舉兩個案例佐證一下? 一:案例一 【巢狀下的非同步】 寫了這麼多年

,你知道Python生成器是什麼

生成器是 Python 初級開發者最難理解的概念之一,雖被認為是 Python 程式設計中的高階技能,但在各種專案中可以隨處見到生成器的身影,你得不得去理解它、使用它、甚至愛上它。 提到生成器,總不可避免地要把迭代器拉出來對比著講,生成器就是一個在行為上和迭代器非常類似的物件,如果把迭代器比

,你會知道 Lineage OS 系統的一切

前幾天看到新聞,發現 CM 團隊做出的新專案 Lineage OS 系統,一經官方釋出,就備受刷機黨們的關注。下面我來詳細講述一下我刷這個系統的整個過程以及體驗。   Lineage OS 系統介紹 大夥還記得 CyanogenMod 嗎?給安卓手機刷過機的使用者基本都知

你還在靠“喂喂喂”來測語音通話質量嗎,文章你能掌握正確姿勢。

語音通話開發,對於一般開發者來說比較神祕,很多朋友不太清楚如何全面的評估第三方的音訊引擎,如何科學的選擇一家靠譜的語音通話服務供應商。 很多朋友還停留在這樣的初級階段:把demo調通,找幾個人喂喂喂……憑自己優異的聽覺感受一下。整個測試過程就完成了,廠商也就這麼“愉快”

熟悉Kubernetes卷管理方案,這個11分鐘的視訊

各位童鞋好 自“深入淺出Kubernetes儲存”系列課程第一期推出已有一段時間了,童鞋們是不是都苦苦等待著第二期呢? 嘿呀,童鞋們久等了,第二期課程上線啦上線啦!~   |  視訊課程   通過上期“Kubernetes持久化儲存簡介”課

下載好看的桌布,幾個網站

每個人都有自己喜歡的桌布,動漫、二次元、科技等等型別。 很多人也會遇到這個情況,一張桌布用了幾個月,想換一張但是又找不到合適的桌布,搞得自己很尷尬。 今天就給大家分享幾個國內外優質的桌布網站。閒暇時間在上面瀏覽瀏覽,找幾張喜歡的桌布,不也是一件愜意的事情麼。

Java 集合

大家好,這裡是《齊姐聊資料結構》系列之大集合。 話不多說,直接上圖: ![](https://img2020.cnblogs.com/other/2000306/202010/2000306-20201015102037433-1962948869.jpg) Java 集合,也稱作容器,主要是由`兩大介

學習Java JDBC,

影響 數據庫中間件 project prepare 管理系 lba 分布 為我 vax JDBC (Java DB Connection)---Java數據庫連接 JDBC是一種可用於運行SQL語句的JAVA API(ApplicationProgramming