Set介面下的集合都會有以下特點
HashSet集合的特點
HashSet<元素資料型別> set = new HashSet<>();
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
}
方法 | 解釋 |
---|---|
boolean add(E e) | 新增元素,如果元素新增不成功 返回值代表是否新增成功 |
boolean remove(Object o) | 刪除元素 ,返回值代表刪除元素是否成功 |
boolean contains(Object o) | 判斷元素是否存在 |
int size() | 獲取集合的大小 |
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
//新增元素
boolean f = set.add("愚");
set.add("生");
set.add("淺");
set.add("末");
System.out.println(f);
}
我們打斷點偵錯一下:
可以看到愚生淺末四個字元已經裝入set,且f為true證明新增成功。
我們再試試刪除:
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
//新增元素
set.add("愚");
set.add("生");
set.add("淺");
set.add("末");
boolean f = set.remove("生");
}
可以看到set已經沒有生了,且f為true代表刪除成功。
判斷是否存在:
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
//新增元素
set.add("愚");
set.add("生");
set.add("淺");
set.add("末");
boolean f = set.contains("末");
}
末是存在於set的,所以返回值為true。
獲取集合的大小:
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
//新增元素
set.add("愚");
set.add("生");
set.add("淺");
set.add("末");
//獲取集合的大小
int size = set.size();
新增了愚生淺末四個字元,所以可以得到size是4.
1.轉換為陣列遍歷
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("愚");
set.add("生");
set.add("淺");
set.add("末");
String[] strings = set.toArray(new String[0]);
for (int i = 0; i < strings.length; i++) {
System.out.println(strings[i]);
}
}
結果:
前面說過:儲存元素的順序和遍歷獲取出來的順序可能不一致。
2.使用迭代器遍歷
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("愚");
set.add("生");
set.add("淺");
set.add("末");
Iterator<String> it = set.iterator();
while (it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
結果:
3.foreach遍歷
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("愚");
set.add("生");
set.add("淺");
set.add("末");
for (String s : set) {
System.out.println(s);
}
}
結果:
Map介面是雙列集合的頂層介面,下面是Map介面的定義
interface Map<K,V> K:鍵的型別;V:值的型別
儲存的資料必須包含key和value。
key和value在Map集合中是一一對應的關係。一個key對應一個value。
key在map集合中是不會重複的。
HashMap集合的特點
HashMap<key的資料型別,value的資料型別> map = new HashMap<>();
例如:
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
HashMap<String,Integer> map = new HashMap<>();
}
方法 | 解釋 |
---|---|
V put(K key, V value) | 新增元素,如果key不存在就新增,如果key |
V get(Object key) | 根據key獲取對應的value值返回。如果key不存在就返回null |
V remove(Object key) | 根據key刪除map中對應的鍵值對。並且把刪除的value返回 |
boolean containsKey(Object key) | 判斷key是否存在 |
int size() | 集合中鍵值對的對數 |
void clear() | 清空集合中的所有鍵值對 |
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
// map.put()
//新增元素
map.put("name", "愷龍");
map.put("age", "20");
String v = map.put("name", "愚生淺末");//將原來的愷龍替換為愚生淺末
String name = map.get("name");//獲取名字:愷龍
String age = map.get("age");//獲取age:20
//刪除元素
String delV = map.remove("age");//返回值為20
//判斷key是否存在
if(map.containsKey("name")){
String agea = map.get("name");//null
System.out.println(agea.length());
}
//size
int size = map.size();
map.clear();
}
1.使用entrySet遍歷
map集合的entrySet方法可以獲取一個Set集合,集合中存放的是Entry物件,一個Entry物件相當於一個鍵值對。我們可以遍歷set集合拿到Entry物件,然後獲取出裡面的鍵和值。
使用迭代器遍歷entrySet
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put("name","愷龍");
map.put("age","20");
Set<Map.Entry<String, String>> entries = map.entrySet();
//使用迭代器遍歷entrySet
Iterator<Map.Entry<String, String>> it = entries.iterator();
while (it.hasNext()){
Map.Entry<String, String> entry = it.next();
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
結果:
使用foreach遍歷entrySet
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put("name","愷龍");
map.put("age","20");
Set<Map.Entry<String, String>> entries = map.entrySet();
//使用foreach遍歷entrySet
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
結果:
2.使用keySet遍歷
map集合的keySet方法可以獲取一個Set集合,集合中存放的是所有的key。我們可以遍歷set集合拿到key物件,然後通過key獲取對應的value。
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put("name","愷龍");
map.put("age","20");
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key+"="+map.get(key));
}
}
結果:
HashMap在新增元素的時候會判斷集合中是否有key和本次存入的key相同。判斷的時候主要是通過hashCode方法和equals方法來進行判斷的。hashCode相同,並且equals判斷也相同就會認為是同一個key。
所以如果我們要儲存到HashMap中的key是一個自定義的型別。就需要根據情況判斷下是否需要重寫下hashCode方法和equals方法。重寫的時候使用IDEA的提示即可。
public class Student {
private int age;
private String name;
public String getName(){
return name = this.name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age = this.age;
}
public void setAge(int age){
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
}
注意:HashSet儲存資料其實也是使用了HashMap。所以如果往HashSet中儲存自定義物件也要看情況是否需要重寫hashCode方法和equals方法。
如圖片失效等情況請參閱公眾號文章:https://mp.weixin.qq.com/s/NLKGamezcB3nnQ3BgEDc9g
歡迎關注我的公眾號:愚生淺末,一起交流學習。