1.集合
- Java集合類是一種特別有用的工具類,可用於存儲數量不等的對象,並可以實現常用 的數據結構,如棧、隊列等。除此之外,Java集合還可用於保存具有映射關係的關聯 數組。Java集合大致可分爲List、Set、Queue和Map四種體系。
集合的接口簡易圖:
1.1 四種體系
- List:代表有序、 重複的集合;
- Set:代表無序、不可重複的集合;
- Map:代表具有映射關係的集合;
- Queue:代表一種隊列集合實現。(Java5之後)
1.2 Set集合
-
Set 集合的特徵: 存儲的元素(引用數據類型) 無序的,不可重複的。
-
Set:Set 具有與 Collection 完全一樣的接口,只是行爲上不同,Set 不保存重複的元素。Set 接口存儲一組唯一,無序的對象。
-
SortedSet:繼承於Set保存有序的集合。
——————————————
1.2.1 HashSet
-
HashSet 內部存儲是一個散列表。 HashSet 內部實現是一個HashMap.
-
集合存在的意義,就是存儲對象。
下面展示一些 SetDemo 代碼片
。
public class SetDemo {
public static void main(String[] args) {
// 接口 = 實現類
Set<String> set = new HashSet<String>();
// 實現類 = 實現類
HashSet<String> hSet = new HashSet<String>();
hSet.add("dahuang");
// Set提供的方法。
set.add("ac");
set.add("hello");
set.add("java");
set.add("sql");
set.add("oracle");
set.add("jack");
set.add("zee");
// Set 不可重複存放元素
set.add("zee");
// 遍歷Set集合。
System.out.println(set.toString());
// 數組的長度
System.out.println(set.size());
// addall
set.addAll(hSet);
System.out.println(set.toString());
//clear 清楚集合中所有元素
// set.clear();
// System.out.println(set.size());
// 是否包含某個元素
System.out.println(set.contains("dahuang"));
// hashCode
System.out.println(set.hashCode());
// 刪除某個元素
set.remove("dahuang");
System.out.println(set.toString());
// 集合的遍歷1: toArray
Object[] objs = set.toArray();
for(Object obj:objs){
String str = (String)obj;
System.out.println(str+" ");
}
System.out.println("\n==============================");
// 集合的遍歷 2: forEach
for(String str:set){
System.out.println(str+" ");
}
System.out.println("\n=============================");
// 集合的遍歷 3: Iterator 迭代器 遊標
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){// hasNext 下一位是否還有值。
System.out.println(iterator.next()+" ");// 輸入下一位的值。
}
}
}
以上代碼打印輸出:
——————————————————
下面展示一些 SetDemo 2 代碼片
。
public class SetDemo2 {
public static void main(String[] args) {
Set set = new HashSet<>();
set.add(1);// Integer
set.add(15);
set.add(26);
set.add(3);
set.add(7);
System.out.println(set.toString());
}
}
以上代碼打印輸出:
————————————————————
1.3 Hashset 集合存儲對象的原理:
-
hashset 存儲對象, 先判斷對象的hashcode值是否存在於散列表中。如果沒有,就存入Set集合。
-
如果有,在判定,兩個對象的equals 是否相同。如果相同,不存儲。如果requals 不同,則存入。
-
set集合中,有兩個相同的hashcode。 但不可能有兩個相同的equals。
下面展示一些 Student 代碼片
。
public class Student {
public String name;
public int age;
public String sex;
public Student(){
super();
}
public Student(String name, int age, String sex){
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString(){
return "Student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
return result;
}
public boolean equsls(Object obj){
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null){
if (other.name !=null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null){
if(other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return false;
}
// @Override
// public int hashCode() {
// return name.hashCode()+age+sex.hashCode();
// }
//
// @Override
// public boolean equals(Object obj) {
// Student student = (Student)obj;
// if(student.name.equals(this.name) && student.age == age && student.sex.equals(this.sex)){
// return true;
// }else{
// return false;
// }
// }
}
下面展示一些 測試類 代碼片
。
public class Test {
public static void main(String[] args) {
Student stu = new Student("張偉",8,"女");
Student stu1 = new Student("李漂亮",18,"男");
Student stu2 = new Student("楊丹",28,"女");
// stu2 和stu3 算不算重複 //不算
Student stu3 = new Student("楊丹",28,"女");
// 創建集合
Set<Student> stus = new HashSet<Student>();
stus.add(stu);
stus.add(stu1);
stus.add(stu2);
stus.add(stu3);
// hashCode
System.out.println(stu2.hashCode());
System.out.println(stu3.hashCode());
// 在判斷reques 方法是否相同。
System.out.println(stu2.equals(stu3));
// 遍歷集合
for(Student student : stus){
System.out.println(student);
}
}
}
以上兩聯代碼打印輸出:
————————————————————
1.4 LinkedHashSet
- LinkedHashSet 有鏈表順序,不能重複的。
- Link 鏈表。
下面展示一些 LinkedHashSetDemo 代碼片
。
public class LinkedHashSetDemo {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("hello");
set.add("java");
set.add("mysql");
set.add("oracle");
set.add("html");
set.add("css");
set.add("css");// 不能重複
set.add("css");// 不能重複
for(String str : set){
System.out.println(str+" ");
}
}
}
以上代碼打印輸出:
————————————————————
1.5 Tree 樹
- Tree 樹,
- Tree 樹形結構, 有序的。
- TreeSet 是可排序的集合。默認按照字典或數字順序排列。
下面展示一些 學生 Student 代碼片
。
public class Student implements Comparable<Student>{
public String name;
public int age;
public String sex;
public Student(){
super();
}
public Student(String name, int age, String sex){
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString(){
return "Student [name=" + name + ", age="+ age + ",sex=" + sex + "]";
}
@Override
public int compareTo(Student o){
return o.age-age;
}
}
下面展示一些 TreeSetDemo 代碼片
。
public class TreeSetDemo {
public static void main(String[] args){
Set<String> set = new TreeSet<>();
set.add("1hello");
set.add("2java");
set.add("5aaaa");
set.add("3aaa");
set.add("7blue");
set.add("4gree");
set.add("6full");
for(String str : set){
System.out.println(str);
}
}
}
下面展示一些 TreeSetDemo 2代碼片
。
public class TreeSetDemo2 {
public static void main(String[] args) {
Student stu = new Student("張偉",8,"女");
Student stu1 = new Student("李漂亮",18,"男");
Student stu2 = new Student("楊丹",28,"女");
TreeSet<Student> set = new TreeSet<Student>(new MyComparable());
set.add(stu);
set.add(stu1);
set.add(stu2);
// 遍歷集合。
for(Student student : set){
System.out.println(student);
}
}
}
// 自定義排序規則類。
class MyComparable implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2){
return o2.age-o1.age;
}
}
下面展示一些 TreeSetDemo3 代碼片
。
public class TreeSetDemo3 {
public static void main(String[] args) {
Student stu = new Student("張偉",8,"女");
Student stu1 = new Student("李漂亮",18,"男");
Student stu2 = new Student("楊丹",28,"女");
System.out.println(stu.compareTo(stu1));
TreeSet<Student> set = new TreeSet<Student>();
set.add(stu);
set.add(stu1);
set.add(stu2);
//遍歷集合。
for(Student student : set){
System.out.println(student);
}
}
}
以上代碼打印輸出:
Student學生類:
TreeSetDemo:
TreeSetDemo2:
TreeSetDemo3:
————————————————————
小練習:
註冊 登錄
Admin 類。 用戶名,密碼。
集合。 不能重複。
登錄。 判斷集合中是否有對象。
public class HomeWork {
public static void main(String[] args) {
}
}