DAY7.2 Java核心基礎
想學習Collection、list、ArrayList、Set、HashSet部分的小伙伴可以轉到
7.1集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判斷兩個對象是否相等文章查看
set集合
在set集合中,處理LinkedHashSet是有序的,TreeSet的存放也是有序的,但是二者之間的有序亦有區
LinkedHashSet:元素的存儲順序和遍歷順序是一致的
TreeSet:內部元素會按照升序的方法進行排序,無論存入元素的順序是什么,都會按照升序進行輸出
public static void main(String[] args) {TreeSet<Integer> treeSet = new TreeSet<>();treeSet.add(1);treeSet.add(5);treeSet.add(3);treeSet.add(2);treeSet.add(1);treeSet.add(9);Iterator<Integer> iterator = treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}System.out.println("***********************");LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();linkedHashSet.add(98);linkedHashSet.add(2);linkedHashSet.add(3);linkedHashSet.add(2);linkedHashSet.add(11);linkedHashSet.add(1);for (Integer integer : linkedHashSet) {System.out.println(integer);}
}
可以看見treeSet自動排序了,而linkedHashSet按照添加順序輸出的,但是他們兩個都去除了重復元素,驗證了Set集合元素的唯一性
TreeSet 內部會自動按照升序對元素進行排列,所以添加到 TreeSet 集合中的元素必須具備排序的功能,無法排序的對象無法添加到 TreeSet 中的。
如果傳遞的是一個不能比較的對象:
public class test {public static void main(String[] args) {TreeSet treeSet = new TreeSet<>();treeSet.add(new A(6));treeSet.add(new A(2));treeSet.add(new A(3));treeSet.add(new A(4));}
}
class A{private int num;public A(int num) {this.num = num;}
}
就會出現異常顯示無法是實現比較的接口
Comparable 是排序接口,實習了該接口的類就具備了排序的功能,對象就可以進行排序
如果要比較我們就需要在A對象類里面實現Comparable 接口
class A implements Comparable{private int num;public A(int num) {this.num = num;}/*** A.compareTo(B)* 返回值:* 1表示A大于B* 0表示A等于B* -1表示A小于B* @param o* @return*/@Overridepublic int compareTo(Object o) {if (o instanceof A){A a = (A) o;return this.num - a.num;}return 0;}@Overridepublic String toString() {return "A{" +"num=" + num +'}';}
}
public class test {public static void main(String[] args) {TreeSet treeSet = new TreeSet<>();treeSet.add(new A(6));treeSet.add(new A(2));treeSet.add(new A(3));treeSet.add(new A(4));Iterator iterator = treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}
這時候輸出:
完美解決!
Map 接口
Set List 都是Collenction的子接口,Map接口是與Collenction完全獨立的一個體系
Set 、List、Collenction都是只能操作一個元素,而Map可以操作一對數據,以Key-Value形式存在
Map接口常見方法
方法 | 描述 |
---|---|
int size() | 獲取集合長度 |
boolean isEmpty() | 判斷集合是否為空 |
boolean containsKey(Object key) | 判斷集合中是否存在某個 key 值 |
boolean containsValue(Object key) | 判斷集合中是否存在某個 value 值 |
V get(Object key) | 取出集合中 key 對應的 value |
V put(K key,V value) | 向集合中添加一組 key-value 的元素 |
V remove(Object key) | 刪除集合中 key 對應的 value |
void clear() | 清除集合中的所有元素 |
Set keySet() | 取出集合中所有的 key,返回一個 Set 集合 |
Collection values() | 取出集合中所有的 value,返回一個 Collection 集合 |
Set entrySet() | 將 Map 對象轉為 Set 對象 |
int hashCode() | 獲取集合的散列值 |
boolean equals(Object o) | 比較兩個集合是否相等 |
Map是一個接口,無法被實例化創建對象,而需要通過實現類來創建對象
HashMap:存儲無序,key不能重復,值可以重復
TreeMap:存儲有序,key不能重復,值可以重復
測試方法:
public class test {public static void main(String[] args) {testMapMethods();}public static void testMapMethods() {Map<String, Integer> map = new HashMap<>();// 測試 put 方法map.put("a", 1);map.put("b", 2);map.put("c", 3);System.out.println("插入元素后: " + map);// 測試 size 方法System.out.println("集合大小: " + map.size());// 測試 isEmpty 方法System.out.println("集合是否為空: " + map.isEmpty());// 測試 containsKey 方法System.out.println("是否包含鍵 'a': " + map.containsKey("a"));System.out.println("是否包含鍵 'd': " + map.containsKey("d"));// 測試 containsValue 方法System.out.println("是否包含值 1: " + map.containsValue(1));System.out.println("是否包含值 4: " + map.containsValue(4));// 測試 get 方法System.out.println("鍵 'a' 對應的值: " + map.get("a"));System.out.println("鍵 'd' 對應的值: " + map.get("d"));// 測試 keySet 方法Set<String> keySet = map.keySet();System.out.println("所有鍵的集合: " + keySet);// 測試 values 方法System.out.println("所有值的集合: " + map.values());// 測試 hashCode 方法System.out.println("集合的哈希碼: " + map.hashCode());// 測試 remove 方法System.out.println("刪除鍵 'a' 對應的值: " + map.remove("a"));System.out.println("刪除后: " + map);// 測試 replace 方法System.out.println("將鍵 'b' 的值替換為 4: " + map.replace("b", 4));System.out.println("替換后: " + map);// 測試 clear 方法map.clear();System.out.println("清空后: " + map);System.out.println("清空后是否為空: " + map.isEmpty());}
}
輸出:
朋友們可以自己取嘗試調用一下這些方法
TreeMap和HashMap差不多,但是這個會根據key排序
public static void main(String[] args) {TreeMap<Integer, String> map = new TreeMap<>();map.put(3, "Three");map.put(1, "One");map.put(2, "Two");map.put(2, "Two");System.out.println(map);
}
測試:
Collections 工具類
集合除了可以存儲數據之外,還提供了很多方法來對數據進行操作,但是這些方法都有其局限性,實際操作起來不是很方便,JDK 提供了一個工具類 Collections,專門用來操作集合,添加元素、元素排序、替換元素。
Collections 常用方法
方法 | 描述 |
---|---|
sort | 根據集合泛型對應的類實現的 Comparable 接口對集合進行排序 |
sort | 根據 Comparator 接口對集合進行排序 |
binarySearch | 查找元素在集合中的下標,要求集合元素必須是升序排列 |
get | 根據下標找到集合中的元素 |
reverse | 對集合元素的順序進行反轉 |
swap | 交換集合中指定位置的兩個元素 |
fill | 將集合中的所有元素進行替換 |
min | 返回集合中最小的元素 |
max | 返回集合中最大的元素 |
replaceAll | 將集合中的所有元素進行替換 |
addAll | 向集合中添加元素 |
部分代碼示例:
sort方法:
// 定義一個實現了Comparable接口的類
class Person implements Comparable<Person> {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Person p) {return Integer.compare(this.age, p.age);}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}public class TestSort {public static void main(String[] args) {List<Person> list = new ArrayList<>();list.add(new Person("Alice", 25));list.add(new Person("Bob", 30));list.add(new Person("Charlie", 20));Collections.sort(list); // 根據age排序System.out.println(list);}
}
輸出:
實現compareTo方法,然后可以使得按照age排序
binarySearch (查找元素下標,要求集合升序排列)
public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 3, 5, 7, 9);int index = Collections.binarySearch(list, 5); // 返回元素5的索引System.out.println("Index of 5: " + index);
}
輸出:
get (根據下標找到集合中的元素)
public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");String element = list.get(1); // 獲取第二個元素System.out.println("Element at index 1: " + element);
}
reverse (反轉集合順序)
public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");Collections.reverse(list);System.out.println("Reversed list: " + list);
}
swap (交換指定位置的兩個元素)
public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");Collections.swap(list, 0, 2); // 交換第一個和第三個元素System.out.println("Swapped list: " + list);
}
fill (將集合中的所有元素替換為指定值)
public static void main(String[] args) {List<String> list = new ArrayList<>(Arrays.asList("apple", "orange", "banana"));Collections.fill(list, "fruit");System.out.println("Filled list: " + list);
}
min (返回集合中最小的元素)、max (返回集合中最大的元素)
public static void main(String[] args) {List<Integer> list = Arrays.asList(5, 3, 8, 1, 9);Integer max = Collections.max(list);Integer min = Collections.min(list);System.out.println("Maximum value: " + max);System.out.println("Minimum value: " + min);
}
replaceAll (將集合中的所有元素替換為指定值)
public static void main(String[] args) {List<String> list = Arrays.asList("apple", "orange", "banana");Collections.replaceAll(list, "apple", "fruit");System.out.println("Replaced list: " + list);
}
addAll (向集合中添加所有指定元素)
public static void main(String[] args) {List<String> list = new ArrayList<>();List<String> toAdd = Arrays.asList("apple", "orange", "banana");Collections.addAll(list, "grape", "peach");// 或者使用addAll方法list.addAll(toAdd);System.out.println("Added list: " + list);
}