1.hashset
public
class
HashSetDemo {
public
static
void
main(String[] args) {
Set<String> set=
new
HashSet<String>();
set.add(
"A"
);
set.add(
"B"
);
set.add(
"C"
);
set.add(
"D"
);
set.add(
"E"
);
set.add(
"A"
);
//重复添加
set.add(
"B"
);
set.add(
"F"
);
System.
out
.println(set);
}
}
结果:
[D, E, F, A, B, C]
从结果中发现Hashset集合是不重复且无序的
2.有序的TreeSet
public
class
TreeSetDemo {
public
static
void
main(String[] args) {
Set<String>set=
new
TreeSet<String>();
set.add(
"C"
);
set.add(
"B"
);
set.add(
"A"
);
set.add(
"D"
);
set.add(
"E"
);
set.add(
"A"
);
//重复添加
set.add(
"B"
);
set.add(
"F"
);
System.
out
.println(set);
}
}
结果:
[A, B, C, D, E, F]
3.对TreeSet排序的探索
既然TreeSet可以排序,那么它可以对我们自己写的类型进行排序不?
class
Person{
private
String
Name
;
private
int
age
;
public
String getName() {
return
Name
;
}
public
void
setName(String name) {
Name
= name;
}
public
int
getAge() {
return
age
;
}
public
void
setAge(
int
age) {
this
.
age
= age;
}
public
Person(String name,
int
age) {
Name
= name;
this
.
age
= age;
}
}
public
class
TreeSetDemo1 {
public
static
void
main(String[] args) {
Set<Person> set=
new
TreeSet<Person>();
set.add(
new
Person(
"aaa"
, 12));
set.add(
new
Person(
"adc"
, 12));
set.add(
new
Person(
"abc"
, 12));
set.add(
new
Person(
"aac"
, 12));
set.add(
new
Person(
"aaa"
, 13));
System.
out
.println(set);
}
}
结果:
Exception in thread "main"
java.lang.ClassCastException
: JHTest.Person cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(
TreeMap.java:1188
)
at java.util.TreeMap.put(
TreeMap.java:531
)
at java.util.TreeSet.add(
TreeSet.java:255
)
at JHTest.TreeSetDemo1.main(
TreeSetDemo1.java:41
)
类转换错误
出现这个错误的原因是对于一个对象要想排序,必须要实现排序法则,且对象所在类必须实现Comparable接口
4.探索继续
class
Person
implements
Comparable<Person>{
private
String
name
;
private
int
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;
}
public
Person(String name,
int
age) {
this
.
name
= name;
this
.
age
= age;
}
public
int
compareTo(Person per) {
if
(
this
.
age
>per.
age
){
return
1;
}
else
if
(
this
.
age
<per.
age
){
return
-1;
}
else
{
return
0;
}
}
@Override
public
String toString() {
return
"名字"
+
this
.
name
+
"年龄"
+
this
.
age
;
}
}
public
class
TreeSetDemo1 {
public
static
void
main(String[] args) {
Set<Person> set=
new
TreeSet<Person>();
set.add(
new
Person(
"aaa"
, 12));
set.add(
new
Person(
"adc"
, 12));
set.add(
new
Person(
"abc"
, 10));
set.add(
new
Person(
"aac"
, 11));
set.add(
new
Person(
"aaa"
, 13));
System.
out
.println(set);
}
}
结果:
[名字abc年龄10, 名字aac年龄11, 名字aaa年龄12, 名字aaa年龄13]
补充:这个发现有个
new
Person(
"adc"
, 12)这个没有加进来,这是因为之比较了一个属性,那treeSet就只会比较一个属性,如果这个属性相同,就认为是一个对象
5.对HashSet的探索(关于重复元素)
class
Per{
private
String
name
;
private
String
age
;
public
String getName() {
return
name
;
}
public
void
setName(String name) {
this
.
name
= name;
}
public
String getAge() {
return
age
;
}
public
void
setAge(String age) {
this
.
age
= age;
}
public
Per(String name, String age) {
this
.
name
= name;
this
.
age
= age;
}
@Override
public
String toString() {
return
"名字"
+
this
.
name
+
"姓名"
+
this
.
age
;
}
}
public
class
HashSetDemo1 {
public
static
void
main(String[] args) {
Set<Per> set=
new
HashSet<Per>();
set.add(
new
Per(
"AAA"
,
"10"
));
set.add(
new
Per(
"BBB"
,
"11"
));
set.add(
new
Per(
"AAA"
,
"12"
));
set.add(
new
Per(
"AAB"
,
"13"
));
set.add(
new
Per(
"ABA"
,
"10"
));
set.add(
new
Per(
"AAA"
,
"10"
));
System.
out
.println(set);
}
}
结果:
[名字AAB姓名13, 名字AAA姓名10, 名字BBB姓名11, 名字AAA姓名10, 名字AAA姓名12, 名字ABA姓名10]
我们发现这里重复了?
这里如果想要比较我们的类型的对象是否重复就要覆写Object 的equals方法和hashCode方法
class
Per{
private
String
name
;
private
int
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
"名字"
+
this
.
name
+
"姓名"
+
this
.
age
;
}
@Override
public
int
hashCode() {
return
this
.
name
.hashCode() *
this
.
age
;
}
@Override
public
boolean
equals(Object obj) {
if
(
this
==obj){
return
true
;
}
if
(!(obj
instanceof
Per)){
return
false
;
}
Per p=(Per)obj;
if
(
this
.
name
.equals(p.
name
)&&
this
.
age
==p.
age
){
return
true
;
}
else
{
return
false
;
}
}
public
Per(String name,
int
age) {
this
.
name
= name;
this
.
age
= age;
}
}
public
class
HashSetDemo1 {
public
static
void
main(String[] args) {
Set<Per> set=
new
HashSet<Per>();
set.add(
new
Per(
"AAA"
, 10));
set.add(
new
Per(
"BBB"
, 11));
set.add(
new
Per(
"AAA"
, 12));
set.add(
new
Per(
"AAB"
, 13));
set.add(
new
Per(
"ABA"
, 10));
set.add(
new
Per(
"AAA"
, 10));
System.
out
.println(set);
}
}
结果:
[名字AAA姓名12, 名字ABA姓名10, 名字AAA姓名10, 名字AAB姓名13, 名字BBB姓名11]