【JavaSE笔记】集合(三)_Set

本期知识点
Set及其子类
Collation总结


1.Set

a.Set集合的特点:

无序(存储和取出不一致),集合中的元素不可以重复。

import java.util.HashSet;
import java.util.Set;

public class Demo01 {
	public static void main(String[] args) {
		//创建Set集合对象
//		Set是接口不能直接实例化
//		Set<String> a = new Set<String>();
		Set<String> a = new HashSet<String>();
		a.add("hello");
		a.add("is");
		a.add("me");
		a.add("is");
		a.add("me");
		a.add("hello");
		//增强for遍历
		for (String s : a) {
			System.out.println(s);
		}
	}
}
/*out:
me
is
hello
*/

2.HashSet

a.底层数据结构是哈希表(是一个元素为链表的数组)

b.哈希表底层依赖两个方法:

hashCode()equals()
执行顺序:
首先比较哈希值是否相同?
相同:
继续执行equals()方法:
true:元素重复了,不添加
false:直接把元素添加到集合中
不同:
直接把元素添加到集合中

c.如何保证元素的唯一性?

由hashCode()、equals()保证。

e.HashSet存储字符串并遍历

import java.util.HashSet;

public class HashSet存储字符串并遍历 {
	public static void main(String[] args) {
		//创建HashSet集合对象;
		HashSet<String> a = new HashSet<String>();
		a.add("hello");
		a.add("is");
		a.add("me");
		a.add("hello");
		a.add("is");
		a.add("me");
		
		for (String s : a) {
			System.out.println(s);
		}
	}
}
/*out:
	me
	is
	hello*/

f.HashSet存储自定义对象并遍历

import java.util.HashSet;
class Student{
	private String name;
	private int age;
	
	public Student() {
		super();
	}
	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 String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	//重写equals方法 比较的是内容
	@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 != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
public class HashSet存储自定义对象并遍历 {
	public static void main(String[] args) {
		//创建HashSet集合对象
		HashSet<Student> a = new HashSet<Student>();
		//添加对象
		a.add(new Student("Tom",21));
		a.add(new Student("Peter",20));
		a.add(new Student("Tom",21));
		a.add(new Student("Jack",23));
		//遍历
		for (Student s : a) {
			System.out.println(s.getName()+"---"+s.getAge());
		}
	}
}
/*out:
	Tom---21
	Tom---21
	Peter---20
	Jack---23*/

3.TreeSet

a.底层数据结构是红黑树(自然平衡二叉树)

b.保证元素的排序方式:

i.自然排序(元素具备比较性)
让元素所属的类实现 Comparable 接口
ii.比较器排序(集合具备比较性)
让集合构造方法接收 Comparator的实现类对象

c.如何保证元素的唯一性?

根据比较的返回值是否是0来决定
import java.util.TreeSet;

public class Demo01 {
	public static void main(String[] args) {
		//创建TreeSet对象
		TreeSet<Integer> a = new TreeSet<Integer>();
		//给集合添加元素
		//3,2,5,8,4,7,6
		a.add(3);
		a.add(2);
		a.add(5);
		a.add(8);
		a.add(4);
		a.add(7);
		a.add(6);
		//遍历
		for (Integer i : a) {
			System.out.print(i+" ");
		}
	}
}
//out:2 3 4 5 6 7 8 

4.Collection集合总结:

Collection
|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|--Set 无序,唯一
|--HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals()
开发中自动生成这两个方法即可
|--LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序
比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定


5.Collection集合我们到底使用谁呢?

唯一?(不确定?用ArrayList)
是:Set
排序?(不确定,用HashSet)
是:TreeSet
否:HashSet
否:List
安全?(不确定,用ArrayList)
是:Vector
否:
查询多:ArrayList
增删多:LinkedList


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章