1.Set
特点:无序(存储顺序和取出顺序不一致),唯一
2.HashSet集合
a.底层数据结构为哈希表(一个元素为链表的数组)
b. 哈希表底层依赖两个方法:hashcode和equals
执行顺序:首先比较哈希值是否相同
相同:继续执行equals方法
2.HashSet集合
a.底层数据结构为哈希表(一个元素为链表的数组)
b. 哈希表底层依赖两个方法:hashcode和equals
执行顺序:首先比较哈希值是否相同
相同:继续执行equals方法
返回true 元素重复,就不添加
返回false: 直接把元素添加到集合中
返回false: 直接把元素添加到集合中
不同:就直接把元素添加到集合中
c.保证元素的唯一性
由hashcode 和equals 方法保证
d.hashSet存储字符串并遍历 由于String对象自动重写了hashcode和equals方法 所以保证了字符串的唯一性
e.hashSet存储自定义对象并遍历,(自定义对象的成员相同视为同一个元素)由于自定义对象中需要自动重写hashcode和equals方法,才能保证对象的唯一性
c.保证元素的唯一性
由hashcode 和equals 方法保证
d.hashSet存储字符串并遍历 由于String对象自动重写了hashcode和equals方法 所以保证了字符串的唯一性
e.hashSet存储自定义对象并遍历,(自定义对象的成员相同视为同一个元素)由于自定义对象中需要自动重写hashcode和equals方法,才能保证对象的唯一性
比如
package cn.itcast_02;
/**
* @author Administrator
*
*/
public class Student {
private String name;
private int age;
* @author Administrator
*
*/
public class Student {
private String name;
private int age;
public Student() {
super();
}
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
return name;
}
public void setName(String name) {
this.name = name;
}
this.name = name;
}
public int getAge() {
return age;
}
return age;
}
public void setAge(int age) {
this.age = age;
}
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
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 != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
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;
}
}
e.hashSet方法
e.hashSet方法
boolean | add(E e) 如果此 set 中尚未包含指定元素,则添加指定元素。 |
void | clear() 从此 set 中移除所有元素。 |
Object | clone() 返回此 HashSet 实例的浅表副本:并没有复制这些元素本身。 |
boolean | contains(Object o) 如果此 set 包含指定元素,则返回 true。 |
boolean | isEmpty() 如果此 set 不包含任何元素,则返回 true。 |
Iterator<E> | iterator() 返回对此 set 中元素进行迭代的迭代器。 |
boolean | remove(Object o) 如果指定元素存在于此 set 中,则将其移除。 |
int | size() 返回此 set 中的元素的数量(set 的容量)。 |
3.TreeSet集合
a.底层数据结构是个红黑树(自平衡二叉树)
b:保证元素的排序方式
a.底层数据结构是个红黑树(自平衡二叉树)
b:保证元素的排序方式
注意:实现自定义类的方法必须重写CompareTo方法
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
比较器排序(集合具备比较性)
让集合构造方法接收Comparator的实现类对象
4.Collection集合的总结
Collection
|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|--Set 无序,唯一
|--HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals()
开发中自动生成这两个方法即可
|--LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序
比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
Collection
|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
|--Set 无序,唯一
|--HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals()
开发中自动生成这两个方法即可
|--LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序
比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定