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:相當於找—個第三方的裁判,比較兩個
- Comparator和comparable的區別
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依然活躍在歷史舞臺