《怪物獵人物語2破滅之翼》迷路的孩子位置一覽 迷路的孩子在哪
阿新 • • 發佈:2021-07-12
Set集合
特點
- 不包含重複元素的集合
- 沒有帶索引的方法,所以不能使用普通for迴圈遍歷
package com.jihe.set; import java.util.HashSet; import java.util.Set; public class SetDemo { public static void main(String[] args) { //建立集合物件 //HashSet:對集合的迭代順序不作任何保證 Set<String> set = new HashSet<String>(); //新增元素 set.add("hello"); set.add("world"); set.add("java"); set.add("java"); //遍歷 for (String s : set) { System.out.println(s); } } }
雜湊值
雜湊值:是JDK根據物件的地址或者字串或者數字算出來的int型別的數值
Object類中有一個方法獲取物件的雜湊值
public int hashCode():返回物件的雜湊碼值。
package com.jihe.set; public class HashDemo { public static void main(String[] args) { //建立學生物件 Student s1 = new Student("流年",20); //同一個物件多次呼叫hashCode()方法返回的雜湊值是相同的 System.out.println(s1.hashCode());//460141958 System.out.println(s1.hashCode());//460141958 System.out.println("========="); //預設情況下,不同物件的雜湊值是不同的 //通過方法重寫,可以實現不同物件的雜湊值是相同的 Student s2 = new Student("流年",20); System.out.println(s2.hashCode());//1163157884 System.out.println("========="); System.out.println("hello".hashCode());//99162322 System.out.println("world".hashCode());//113318802 System.out.println("java".hashCode());//3254818 System.out.println("world".hashCode());//113318802 System.out.println("================"); System.out.println("重地".hashCode());//1179395 System.out.println("通話".hashCode());//1179395//重寫了hashCode方法 } }
HashSet集合概述和特點
特點:
- 底層資料結構是雜湊表
- 對集合的迭代順序不作任何保證,不保證儲存和取出的元素保持一致
- 沒有帶索引的方法,所以不能使用普通for迴圈遍歷(可以使用迭代器、增強for)
- 不包含重複元素的集合
package com.jihe.set; import java.util.HashSet; public class HashSetDemo01 { public static void main(String[] args) { //建立集合物件 HashSet<String> hs = new HashSet<String>(); //新增元素 hs.add("hello"); hs.add("world"); hs.add("java"); hs.add("world"); //遍歷 for (String s :hs){ System.out.println(s); } } }
HashSet集合保證元素唯一性原始碼分析
雜湊表
案例
package com.jihe.set.hashCodeDemo02;
import java.util.Objects;
public class Student {
//1.定義學生類
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return 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(name, age);
}
}
package com.jihe.set.hashCodeDemo02;
/*
需求:建立一個儲存學生物件的集合,儲存3名學生,使用程式實現遍歷
要求:學生物件的成員變數值相同,就認為是同一個物件
在Student類中重寫HashCode()和equals()方法
*/
import java.util.HashSet;
public class HashCodeDemo02 {
public static void main(String[] args) {
//建立HashCode集合物件
HashSet<Student> hs = new HashSet<Student>();
//建立學生物件
Student s1 = new Student("流年", 20);
Student s2 = new Student("冰茶", 25);
Student s3 = new Student("碎冰", 22);
Student s4 = new Student("碎冰", 22);//在Student類中重寫HashCode()和equals()方法
//把學生新增到集合
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
//遍歷集合
for (Student s : hs) {
System.out.println(s.getName() + "," + s.getAge());
}
}
}
LinkedHashSet集合概述和特點
特點:
- 雜湊表和連結串列實現的Set介面,具有可預測的迭代順序
- 有連結串列保證元素有序
- 由雜湊表保證元素唯一
package com.jihe.set;
import java.util.HashSet;
import java.util.LinkedHashSet;
public class LinkedHashSetDemo {
public static void main(String[] args) {
//建立集合物件
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>();
//新增元素
linkedHashSet.add("hello");
linkedHashSet.add("world");
linkedHashSet.add("java");
linkedHashSet.add("world");
//遍歷
for (String s: linkedHashSet){
System.out.println(s);
}
}
}
TreeSet集合概述和特點
特點:
-
元素有序,根據一定的規則進行排序,具體的排序方式取決於構造方法:
- Treeset():根據其元素的自然排序進行排序
- Treeset(Comparator comparator):根據指定的比較器進行排序
-
沒有帶索引的方法,所以不能使用普通for迴圈遍歷(可以使用迭代器、增強for)
-
不包含重複元素的集合
Treeset()
package com.jihe.set;
import java.util.TreeSet;
public class TreeSetDemo01 {
public static void main(String[] args) {
//建立集合物件
TreeSet<Integer> ts = new TreeSet<Integer>();//基本型別儲存的時候,要用它的包裝類型別
//新增元素
ts.add(10);
ts.add(50);
ts.add(30);
ts.add(20);
ts.add(40);
ts.add(40);
//遍歷集合
for (Integer i :ts){
System.out.println(i);
}
}
}
自然排序Comparable的使用
- 用TreeSet集合儲存自定義物件,無參構造方法使用的是自然排序對元素進行排序
- 自然排序,就是讓元素所屬的類實現Comparable介面,重寫comparaTo(To)方法
- 重寫方法時,注意排序規則按照主要和次要條件來寫
package com.jihe.set.treeSetDemo02;
public class Student implements Comparable<Student> {
//1.定義學生類
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student s) {
// return 0;//認為是重複元素,不新增
// return 1;//升序
// return -1;//降序
int num = this.age - s.age;
int num2 = num==0?this.name.compareTo(s.name):num;
return num2;
}
}
package com.jihe.set.treeSetDemo02;
import java.util.TreeSet;
/*
儲存學生物件並遍歷,建立集合使用無參構造方法
要求:按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序
*/
public class TreeSetDemo02 {
public static void main(String[] args) {
//建立集合物件
TreeSet<Student> ts = new TreeSet<Student>();
//建立學生物件
Student s1 = new Student("流年",19);
Student s2 = new Student("長島", 18);
Student s3 = new Student("冰茶", 20);
Student s4 = new Student("威士忌", 15);
Student s5 = new Student("長島", 18);
//把學生新增到集合
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍歷集合
for (Student s : ts) {
System.out.println(s.getName() + "," + s.getAge());
}
}
}
比較器排序Comparator的使用
- 用TreeSet集合儲存自定義物件,帶參構造方法使用的是比較器排序對元素進行排序
- 比較器排序,就是讓集合構造方法接收Comparator的實現類物件,重寫compare(To1,To2)方法
- 重寫方法時,注意排序規則按照主要和次要條件來寫
package com.jihe.set.treeSetDemo03;
public class Student {
//1.定義學生類
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.jihe.set.treeSetDemo03;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo03 {
public static void main(String[] args) {
//建立集合物件
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//this.age-s.age
//s1 s2
int num = s1.getAge() - s2.getAge();
int num2 = num==0?s1.getName().compareTo(s2.getName()):num;
return 0;
}
});
//建立學生物件
Student s1 = new Student("流年",19);
Student s2 = new Student("長島", 18);
Student s3 = new Student("冰茶", 20);
Student s4 = new Student("威士忌", 15);
Student s5 = new Student("長島", 18);
//把學生新增到集合
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍歷集合
for (Student s : ts) {
System.out.println(s.getName() + "," + s.getAge());
}
}
}