黑马程序员:Java基础总结
子接口 set<E>及其实现类
java.util
子接口 set<E>
子接口 set<E>
特点:
Set:无序的,无索引,元素不可重复
Set集合的功能和Collection是一致的,一个不包含重复元素的 collection
|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。!无序的
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
|--TreeSet:可以对Set集合中的元素进行排序。 !有自然排序的功能
底层数据结构是二叉树。
保证元素唯一性的依据:
compareTo方法return 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。!无序的
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
|--TreeSet:可以对Set集合中的元素进行排序。 !有自然排序的功能
底层数据结构是二叉树。
保证元素唯一性的依据:
compareTo方法return 0.
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。
java.lang接口 Comparable<T>
TreeSet的第二种排序方式。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。当两种排序都存在时,以比较器为主。定义一个类,实现Comparator接口,覆盖compare方法
ava.util
接口 Comparator<T>
hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素(覆盖equals,hashcode方法)
姓名和年龄相同为同一个人,重复元素(覆盖equals,hashcode方法)
public
int
hashCode()
{
System.
out
.println(
this
.name +
"....hashCode"
);
return
name.hashCode()+ age*37;
}
public
boolean
equals(Object obj)
{
if
(!(obj
instanceof
Person))
return
false
;
Person p = (Person )obj;
System.out.println(
this
.name+
"...equals.."
+p.name);
return
this
.name.equals(p.name) &&
this
.age == p.age;
}
TreeSet集合中存入自定对象使之具备比较性方便排序
TreeSet排序的第一种方式:让元素自身具备比较性。
class
Student
implements
Comparable
// 该接口强制让学生具备比较性。
{
private
String
name
;
private
int
age
;
Student(String name,
int
age) {
this
.
name
= name;
this
.
age
= age;
}
public
int
compareTo(Object obj) {
// return 0;
if
(!(obj
instanceof
Student))
throw
new
RuntimeException(
"不是学生对象"
);
Student s = (Student) obj;
System.
out
.println(
this
.
name
+
"....compareto....."
+ s.
name
);
if
(
this
.
age
> s.
age
)
return
1;
if
(
this
.
age
== s.
age
) {
return
this
.
name
.compareTo(s.
name
);
}
return
-1;
/**/
}
}
TreeSet的第二种排序方式。让集合自身具备比较性。
TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。 |
TreeSet tr =
new
TreeSet(
new
MyCompare());
class
MyCompare
implements
Comparator
{
public
int
compare (Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int
num = s1.getName().compareTo(s2. getName());
if
(num==0)
{
return
new
Integer(s1.getAge ()).compareTo(
new
Integer(s2.getAge()));
/*
if(s1.getAge()>s2.getAge())
return 1;
if(s1.getAge()==s2.getAge())
return 0;
return -1;
*/
}
return
num;
}
}