大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。 "【從零開始學Java筆記】目錄" Set類 Set集合的特點: 無序(存儲和讀取的順序有可 ...
大家可以關註作者的賬號,關註從零開始學Java筆記文集。也可以根據目錄前往作者的博客園博客進行學習。本片文件將基於黑馬程式員就業班視頻進行學習以及資料的分享,並記錄筆記和自己的看法。歡迎大家一起學習和討論。
【從零開始學Java筆記】目錄
Set類
Set集合的特點:
無序(存儲和讀取的順序有可能不一樣)
不允許重覆(要求元素唯一)
沒有索引
例子:使用HashSet存儲自定義對象並遍歷
import java.util.HashSet;
public class HashSetDemo2 {
public static void main(String[] args) {
Student s1 = new Student("大喬", "18");
Student s2 = new Student("小喬", "17");
Student s3 = new Student("小喬", "17");
HashSet<Student> hs = new HashSet<Student>();
hs.add(s1);
hs.add(s2);
hs.add(s3);
for (Student student : hs) {
System.out.println(student);
}
}
}
輸出結果
Student [name=小喬, age=17]
Student [name=大喬, age=18]
Student [name=小喬, age=17]
為什麼HashSet不可重覆,但是s2和s3一樣,卻都存進去了?
通過查看add()方法源碼發現:
HashSet的add()方法,首先會使用當前集合中的每一個元素和新加的元素進行hash值比較,如果hash值不一樣, 則直接添加新的元素,如果hash值-樣,比較地址值或者使用equals方法進行比較
比較結果-樣,則認為是重夏不添加。set中所有元素的比較結果都不一樣則添加。
但這並不是我們想要的,我們就像讓他既有hashset的特性,不可重覆,怎麼辦?
重新equal和hashcode
右鍵->resource-> generate hashcode and equal
生成如下代碼
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
再次運行主函數,結果如下
Student [name=大喬, age=18]
Student [name=小喬, age=17]
Collections類
Collection和Collections有什麼區別?
Collection是集合體系的最頂層,包含了集合體系的共性
Collections是一個工具類, 方法都是用於操作Collection
常用方法
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsDemo {
public static void main(String[] args) {
}
private static void mothed7() {
//static void swap(List list, int i, int j) :將指定列表中的兩個索引進行位置互換
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
Collections.swap(list, 0, 1);
System.out.println(list);
}
private static void method6() {
//static void sort(List<T> list) :按照列表中元素的自然順序進行排序
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(4);
list.add(3);
list.add(2);
Collections.sort(list);
System.out.println(list);
}
private static void method5() {
//static void shuffle(List list):隨機置換
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Collections.shuffle(list);
System.out.println(list);
}
private static void method4() {
//static void reverse(List list) :反轉
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Collections.reverse(list);
System.out.println(list);
}
private static void method3() {
//static void fill(List list, Object obj) :使用指定的對象填充指定列表的所有元素
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
System.out.println(list);
Collections.fill(list, "android");
System.out.println(list);
}
private static void method2() {
//static void copy(List dest, List src) :是把源列表中的數據覆蓋到目標列表
//註意:目標列表的長度至少等於源列表的長度
//創建源列表
List<String> src = new ArrayList<String>();
src.add("hello");
src.add("world");
src.add("java");
//創建目標列表
List<String> dest = new ArrayList<String>();
dest.add("java");
dest.add("java");
dest.add("java");
dest.add("java");
Collections.copy(dest, src);
System.out.println(dest);
}
private static void method() {
//static int binarySearch(List list, Object key) 使用二分查找法查找指定元素在指定列表的索引位置
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
int index = Collections.binarySearch(list, 4);
System.out.println(index);
}
}
鬥地主發牌系統
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Landlords {
public static void main(String[] args) {
//生成一副撲克牌
ArrayList<String> c = new ArrayList<String>();
String[] arr = {"黑桃","紅桃","方片","草花"};
String[] arr2 = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
for (int i = 0; i <4; i++) {
for (int k = 0; k < 13.; k++) {
c.add(arr[i]+arr2[k]);
}
}
c.add("大王");
c.add("小王");
// System.out.println(c);
// System.out.println(c.size());
//打亂
Collections.shuffle(c);
// System.out.println(c);
//分成三組
List<String> c1 = new ArrayList<String>();
List<String> c2 = new ArrayList<String>();
List<String> c3 = new ArrayList<String>();
c1 = c.subList(0, 17);
c2 = c.subList(17, 34);
c3 = c.subList(34, 51);
//排序
Collections.sort(c1);
Collections.sort(c2);
Collections.sort(c3);
//輸出
System.out.println("玩家1:"+c1);
System.out.println("玩家2:"+c2);
System.out.println("玩家3:"+c3);
//底牌
List<String> c4 = new ArrayList<String>();
c4 = c.subList(51, 54);
System.out.println("底牌"+c4);
}
}
Map類
需求:實現學號和姓名這樣有對應關係的數據存儲(一對一:一個學號對應一個姓名)
為了體現這種有對應關係的數據,我們使用以前所學的內容是可以實現的,但是略有不變,所以java又給我買提供了一種專門用於存儲對應關係的集合——Map
Map:將鍵映射到值的對象。一個映射不能包含重覆的鍵;每個鍵最多只能映射到一個值
Map和Collection有什麼區別?
Map:是一個雙列集合,常用語處理有對應關係的數據,key是不可以重覆的,我們也稱之為是夫妻對集合
Collection:是單列集合,Collection有不同的子體系,有的允許重覆有索引有序,有的不允許重覆而且無序,那麼我們也稱之為單身漢集合
Map的方法
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
* Map的常用功能:
* 映射功能:
* V put(K key, V value)
* 獲取功能:
* V get(Object key)
* int size()
* 判斷功能:
* boolean containsKey(Object key)
boolean containsValue(Object value)
boolean isEmpty()
* 刪除功能:
* void clear()
* V remove(Object key)
*
* 遍歷功能:
* Set<Map.Entry<K,V>> entrySet()
*
*
* Set<K> keySet()
* Collection<V> values()
*/
public class MapDemo2 {
public static void main(String[] args) {
// 創建Map對象
Map<String, String> map = new HashMap<String, String>();
map.put("001", "張三");
map.put("002", "李四");
// V put(K key, V value) :就是將key映射到value,如果key存在,則覆蓋value,並將原來的value返回
// System.out.println(map.put("001", "張三"));
// System.out.println(map.put("002", "李四"));
// System.out.println(map.put("001", "王五"));
// void clear() : 清空所有的對應關係
// System.out.println(map);
// map.clear();
// System.out.println(map);
// V remove(Object key) :根據指定的key刪除對應關係,並返回key所對應的值,如果沒有刪除成功則返回null
// System.out.println(map.remove("005"));
// System.out.println(map.remove("001"));
// boolean containsKey(Object key) : 判斷指定key是否存在
// System.out.println(map.containsKey("003"));
// System.out.println(map.containsKey("001"));
// boolean containsValue(Object value):判斷指定的value是否存在
// System.out.println(map.containsValue("王五"));
// System.out.println(map.containsValue("張三"));
// boolean isEmpty() : 判斷是否有對應關係
// System.out.println(map.isEmpty());
// map.clear();
// System.out.println(map.isEmpty());
// int size() : 返回對應關係的個數
// System.out.println(map.size());
// V get(Object key) : 根據指定的key返回對應的value
// System.out.println(map.get("002"));
// Set<Map.Entry<K,V>> entrySet():輸出所有的映射關係
// System.out.println(map.entrySet());
// System.out.println(map);
// // Set<K> keySet() : 以Set的形式獲返回所有的key
// Set<String> keys = map.keySet();
// for (String key : keys) {
// System.out.println(key);
// }
// System.out.println("-----------");
//
// // Collection<V> values() :以Collection的形式獲返回所有的values,不能使用List
// Collection<String> values = map.values();
// for (String value : values) {
// System.out.println(value);
// }
}
}
Map兩種的遍歷方法
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo3 {
public static void main(String[] args) {
Map<String,String> m= new HashMap<String,String>();
m.put("劉備", "孫尚香");
m.put("諸葛亮", "黃月英");
m.put("曹丕", "甄姬");
// method(m);
// method1(m);
}
private static void method1(Map<String, String> m) {
/*
* 第二種遍歷
* 面向對象的方法
* entry是map的一個內部類,他有兩個變數key和value,就可以像類一樣獲取成員變數
*/
Set<Map.Entry<String, String>> set = m.entrySet();
for (Map.Entry<String, String> entry : set) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println("丈夫:"+key+"---媳婦:"+value);
}
}
private static void method(Map<String, String> m) {
/*
* 第一種遍歷
* 先獲得丈夫集合
* 遍歷丈夫
* 讓丈夫去找自己的老婆
*/
Set<String> s = m.keySet();
for (String key : s) {
String value = m.get(key);
System.out.println("丈夫:"+key+"---媳婦:"+value);
}
}
}