1. 程式人生 > 其它 >java基礎複習04

java基礎複習04

java基礎複習

面向物件

3.4、資料結構

常見的資料結構

資料儲存的常用結構有:棧、佇列、陣列、連結串列和紅黑樹。

:先進後出

佇列:先進先出

陣列:查詢快,增刪慢

連結串列:
查詢慢: 連結串列中地址不是連牘的,每次查詢元素都必須從頭開始查詢
增刪快: 連結串列結構,增加/刪除一個元素對連結串列的整體結構沒有影響所以增刪快

  • 連結串列中的每一個元素也稱之為一個節點
    • —個節點包含了一個數據源(儲存資料,兩個指計域(儲存地址)

單向連結串列:連結串列中只有一條鏈子.不能保證元素的順序(儲存元素和取出元素的順序有可能不一致)
雙向連結串列:連結串列中有兩條鏈子,有一條鏈子是專門記錄元素的順度是一個有序的集合

紅黑樹:查詢非常快

3.5、List集合

List介面的特點:

  • 有序的集合,儲存元素和取出元素的順序是一致的(儲存123取出123)

  • 有索引包含了一些帶索引的方法

  • 允許儲存重複的元素

List介面中帶索引的方法(特有):

  • public void add(int index, E eLement): 將指定的元素,新增到該集合中的指定位置上。

  • public E get(int index): 返回集合中指定位置的元素。

  • public E remove(int index): 移除列表中指定位置的元素,返回的是被移除的元素。

  • public E set(int index,E element): 用指定元素替換集合中指定位置的元素,返回值的更新前的元素。

注意:操作索引的時候,一定要防止索引越界異常

public class DemoList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        System.out.println(list);//[a, b, c, d]

        list.add(3,"赤兔");   //將指定的元素,新增到該集合中的指定位置上。
        System.out.println(list);   //[a, b, c, 赤兔, d]

        String k = list.remove(2);  //移除列表中指定位置的元素,返回的是被移除的元素。
        System.out.println("被移除的是:"+k); //被移除的是:c
        System.out.println(list);       //[a, b, 赤兔, d]

        String m = list.set(1, "呂布");   //用指定元素替換集合中指定位置的元素
        System.out.println("被替換的是:"+m); //被替換的是:b
        System.out.println(list);   //[a, 呂布, 赤兔, d]

        for (int i = 0; i < list.size(); i++) {//普通for迴圈遍歷
            String s = list.get(i); //返回集合中指定位置的元素
            System.out.println(s);
        }

        Iterator<String> it = list.iterator();     //迭代器遍歷
        while (it.hasNext()){
            String g = it.next();
            System.out.println(g);
        }

        for (String y : list){      //增強for迴圈
            System.out.println(y);
        }
    }
}

3.6、LinkedList集合

LinkedList集合的特點:

  • 底層是一個連結串列結構:查詢慢,增刪快

  • 裡邊包含了大量操作首尾元素的方法

注意:使用LinkedList集合特有的方法,不能使用多型

  • public void addFirst(E e): 將指定元素插入此列表的開頭。

  • public void addLast(E e): 將指定元素新增到此列表的結尾。

  • public void push(E e): 將元素推入此列表所表示的堆疊。

  • public E getFirst(): 返回此列表的第一個元素。

  • public E getlast(): 返回此列表的最後一個元素。

  • public E removeFirst(): 移除並返回此列表的第一個元素。

  • public E removeLast(): 移除並返回此列表的最後一個元素。

  • public E pop(): 從此列表所表示的堆疊處彈出一個元素。

  • public boolean isEmpty(): 如果列表不包含元素,則返回true。

3.7、HashSet集合

set介面的特點:

  • 不允許儲存重複的元素

  • 沒有索引,沒有帶索引的方法,也不能使用普通的for迴圈遍歷

Hashset特點:

  • 不允許儲存重複的元素

  • 沒有索引,沒有帶索引的方法,也不能使用普通的for迴圈遍歷

  • 是一個無序的集合,儲存元素和取出元素的順序有可能不一致

  • 底層是一個雜湊表結構(查詢的速度非常的快)

public class DemoSet {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("1");
        set.add("2");
        set.add("3");
        set.add("1");

        Iterator<String> it = set.iterator();
        while (it.hasNext()){   //使用迭代器進行遍歷
            String s = it.next();
            System.out.println(s);//1,2,3
        }

        for (String b : set){  //增強for
            System.out.println(b);//1,2,3
        }

    }
}

雜湊值

雜湊值:是一個十進位制的整數,由系統隨機給出(就是物件的地址值,是一個邏輯地址,是模擬出來得到地址,不是資料實際儲存的實體地址)

  • int hashcode()返回該物件的雜湊碼值。

雜湊表

Set集合儲存元素不重複的原理

Set集合在呼叫add方法的時候,add方法會呼叫元素的hashCode方法和equals方法,判斷元素是否重複

Hashset儲存自定義型別元素

set集合報錯元素唯一:

  • 儲存的元素(String,Integer, . . .Student ,Person. . . ) ,必須重寫hashcode方法和equals方法

LinkedHashSet集合

linkedHashset集合特點:

  • 底層是一個雜湊表(陣列+連結串列/紅黑樹)+連結串列:多了一條連結串列(記錄元素的儲存順序),保證元素有序
  • 有序,不允許重複

3.8、可變引數

可變引數: 是JDK1.5之後出現的新特性

使用前提:

  • 當方法的引數列表資料型別已經確定,但是引數的個數不確定,就可以使用可變引數.

使用格式:定義方法時使用

修飾符   返回值型別  方法名(資料型別...變數名){}

可變引數的原理:

  • 可變引數底層就是一個數組,根據傳遞引數個數不同,會建立不同長度的陣列,來儲存這些引數傳遞的引數個數,可以是o個(不傳遞),1,2...多個
public class DemoAdd {
    public static void main(String[] args) {
        System.out.println(add(10,20,30));
    }
    public static int add(int...arr){
        int sum = 0;
        for (int i : arr) {
            sum += i;
        }
        return sum;
    }
}

可變引數的注意事項

  • —個方法的引數列表,只能有一個可變引數

  • 如果方法的引數有多個,那麼可變引數必須寫在引數列表的末尾

3.9、collections集合工具類

  • public static boolean addAll(Collection c,T... elements) : 往集合中新增一些元素。

  • public static void shuffle(list<?> list)打亂順序:打亂集合順序。

public class DemoCollections {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        Collections.addAll(list,"a","b","c","d","e");//一下就存入
        System.out.println(list);//[a, b, c, d, e]

        Collections.shuffle(list);//打亂順序
        System.out.println(list);//[b, e, d, c, a]
    }
}
  • public static void sort (list list): 將集合中元素按照預設規則排序。

  • public static void sort(List list, Comparator<? super T>): 將集合中元素按照指定規則排序。

    • Comparator和comparable的區別
      • Comparable:自己(this )和別人(引數)比較,自己需要實現Comparable介面,重寫比較的規則compareTo方法
      • comparator:相當於找—個第三方的裁判,比較兩個
public class DemoSort {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
        list.add(2);
        System.out.println(list);

        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1-o2;//升序     o2-o1為降序
            }
        });
        System.out.println(list);
    }
}

4.0、Map集合

Map集合的特點:

  • Map集合是一個雙列集合,一個元素包含兩個值(一個key,一個value)

  • Map集合中的元素, key和value的資料型別可以相向,也可以不同

  • Map集合中的元素,key是不允許重複的, vatue是可以重複的

  • Map集合中的元素,key和value是——對應

Map常用子類

HashMap集合的特點:

  • HashMap集合底層是雜湊表:查詢的速度特別的快

    • JDK1.8之前:陣列+單向連結串列
    • JDK1.8之後:陣列+單向連結串列/紅黑樹(連結串列的長度超過8): 提高查詢的速度
  • hashMap集合是一個無序的集合,儲存元素和取出元素的順序有可能不一致

linkedHashMap的特點:

  • LinkedHashMap集合底層是雜湊表+連結串列(保證迭代的順序)

  • LinkedHashMap集合是一個有序的集合,儲存元素和取出元素的順序是一致的

Map常用方法

  • public v put(K key,v value): 把指定的鍵與指定的值新增到Map集合中。

  • public v remove(0bject key): 把指定的鍵所對應的鍵值對元素在Map集合中刪除,返回被刪除元素的值。

  • public v get(0bject key) :根據指定的鍵,在Map集合中獲取對應的值。

  • boolean containsKey(0bject key) :判斷集合中是否包含指定的鍵。

  • public Set keySet(): 獲取Map集合中所有的鍵,儲存到Set集合中。

  • public Set<Map.Entry<K,V>> entrySet(): 獲取到Map集合中所有的鍵值對物件的集合(Set集合)。

Map遍歷

Map集合的第一種遍歷方式:通過鍵找值的方式

實現步驟:

1、使用Map集合中的方法keySet(),把Map集合所有的key取出來,儲存到一個Set集合中

2、遍歷set集合,獲取Map集合中的每一個key

3、通過Map集含中的方法get ( key),通過key找到value

public class DemoMap {
    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("張無忌",18);
        map.put("謝遜",20);
        map.put("張三丰",18);

        Set<String> set = map.keySet();//把鍵存到set集合中
        Iterator<String> it = set.iterator();//迭代器
        while (it.hasNext()){
            String key = it.next();
            Integer integer = map.get(key);//獲取鍵對應的值
            System.out.println(key+"="+integer);
        }

//        for (String key : set){            增強for
//            Integer value = map.get(key);
//            System.out.println(key+"="+value);
//        }
    }
    
}

Map集合遍歷的第二種方式:使用Entry物件遍歷

實現步驟:

1、使用Map集合中的方法entrySet() ,把Map集合中多個Entry物件取出來,儲存到一個set集合中

2、遍歷set集合,獲取每一個Entry物件

3、使用Entry物件中的方法getKey ()和getValue( )獲取鍵與值

public class DemoMap01 {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("內瑟斯",20);
        map.put("凱爾",21);
        map.put("卡爾薩斯",22);

        Set<Map.Entry<String, Integer>> set = map.entrySet();//把Map集合中多個Entry物件取出來,儲存到一個set集合中
        Iterator<Map.Entry<String, Integer>> it = set.iterator();

        while (it.hasNext()){
            Map.Entry<String, Integer> entry = it.next();
            String key = entry.getKey(); //使用Entry物件中的方法getKey()和getValue()獲取鍵與值
            Integer value = entry.getValue();
            System.out.println(key+"="+value);
        }
    }
}

Hashtable集合

Hashtable ;底層也是一個雜湊表,是一個執行緒安全的集合,是單執行緒集合,速展慢

HashMap:底層是一個雜湊表,是一個執行緒不安全的集合,是多執行緒的集合,速度快

HashMap集合(之前學的所有的集合):可以儲存nulL值, nulL鍵

Hashtable集合,不能儲存null值, null鍵

Hashtable和vector集合一祥,在jdk1 .2版本之後被更先進的集合(HashMap, ArrayList )取代了

hashtable的子類Properties依然活躍在歷史舞臺