本节课我学习的主要内容有:
Set接口与它的实现类HashSet、LinkedHashSet
SortedSet接口与TreeSet类
Set接口与它的实现类HashSet、LinkedHashSet:
Set接口:
Set中不保证元素存放的顺序但是一定没有重复元素。
HashSet类:
元素不重复计算时调用的equals方法和hashCode方法都是按照
元素中重写过的,没有重写过的话就是Object类中的。来保证元素
不重复。
元素的存入顺序和存储顺序是不同的。
LinkedHashSet类:
它继承于HashSet类,元素的存入顺序和存储顺序是相同的。
SortedSet接口与TreeSet类:
SortedSet接口(一般不用):
Set的子接口。
SortedSet接口使用Comparator或者自然排序来作为排序的依据。
自然排序:操作的元素实现了Comparable接口。
TreeSet类:
实现了SortedSet接口。
内部元素通过自动排序来处理。
SetTest01类(测试今日所学内容):
package LessonForSet;
import java.util.*;
class Game2
{
private String price;
public Game2(String price)
{
super();
this.price = price;
}
public String getPrice()
{
return price;
}
}
class Game2Comparator implements Comparator<Game2>//Game2的比较器
{
@Override
public int compare(Game2 g1, Game2 g2)
{
return g1.getPrice().compareTo(g2.getPrice());
}
}
class Game implements Comparable<Game>
{
private String price;
public Game(String price)
{
super();
this.price = price;
}
public String getPrice()
{
return price;
}
public void setPrice(String price)
{
this.price = price;
}
@Override
public String toString()
{
return this.price;
}
@Override
public boolean equals(Object o)
{
if (o instanceof Game)
{
return this.price.equals(((Game)o).price);
}
return false;
}
@Override
public int compareTo(Game g)
{
return this.price.compareTo(g.price);
//调用本类的price来与传入的price对比
}
}
public class SetTest01
{
public static void main(String[] args)
{
//HashSet
HashSet<String> hs = new HashSet<String>();
hs.add("a");
hs.add("a");
hs.add("cc");
hs.add("bb");
hs.add("d");
Iterator<String> i1 = hs.iterator();
while (i1.hasNext())
{
System.out.println("此时hs中的元素有:"+i1.next());
}
System.out.println("a只有一个并且他们的值与存放时的顺序不同");
Game g1 = new Game("100");
Game g2 = new Game("200");
Game g3 = new Game("200");
Game g4 = new Game("400");
HashSet<Game> hs1 = new HashSet<Game>();
hs1.add(g1);
hs1.add(g2);
hs1.add(g3);
hs1.add(g4);
Iterator<Game> i3 = hs1.iterator();
while (i3.hasNext())
{
System.out.println("此时hs1中的元素有:"+i3.next());
}
System.out.println("为什么会出现相同的值呢?");
System.out.println("此时调用的equals方法是Object类中的,比较的是地址");
System.out.println("因为此时四个Game对象并不是同一个,我们也可以通过重写equals和hashCode方法来定义自己想要的判断");
System.out.println("此时遍历输出的值是Game对象中的price");
System.out.println("所以出现了重复的元素");
System.out.println("----------------------");
//LinkedHashSet
LinkedHashSet<String> lhs = new LinkedHashSet<String>();
lhs.add("a");
lhs.add("a");
lhs.add("cc");
lhs.add("bc");
lhs.add("d");
Iterator<String> i2 = lhs.iterator();
while (i2.hasNext())
{
System.out.println("此时lhs中的元素有:"+i2.next());
}
System.out.println("a只有一个并且他们的值与存放时的顺序相同");
LinkedHashSet<Game> lhs1 = new LinkedHashSet<Game>();
lhs1.add(g1);
lhs1.add(g2);
lhs1.add(g3);
lhs1.add(g4);
Iterator<Game> i4 = lhs1.iterator();
while (i4.hasNext())
{
System.out.println("此时hs1中的元素有:"+i4.next());
}
System.out.println("----------------------");
TreeSet<String> ts1 = new TreeSet<String>();
ts1.add("ab");
ts1.add("Ac");
ts1.add("de");
ts1.add("cd");
ts1.add("ef");
ts1.add("fg");
ts1.forEach(System.out::println);
System.out.println("字符串按照首字母排序");
TreeSet<Integer> ts2 = new TreeSet<Integer>();
ts2.add(1);
ts2.add(3);
ts2.add(2);
ts2.add(3);
ts2.add(4);
ts2.add(5);
ts2.forEach(System.out::println);
System.out.println("自定对象排序");
//自定对象排序
TreeSet<Game> ts3 = new TreeSet<Game>();
Game g5 = new Game("100");
Game g6 = new Game("200");
Game g7 = new Game("300");
Game g8 = new Game("400");
ts3.add(g5);
ts3.add(g6);
ts3.add(g7);
ts3.add(g8);
ts3.forEach((t)->{
System.out.println(t.getPrice());
});
System.out.println("用比较器");
//用比较器排序
TreeSet<Game2> ts4 = new TreeSet<Game2>(new Game2Comparator());
Game2 g9 = new Game2("a100");
Game2 g10 = new Game2("c300");
Game2 g11 = new Game2("b200");
Game2 g12 = new Game2("d400");
ts4.add(g9);
ts4.add(g10);
ts4.add(g11);
ts4.add(g12);
ts4.forEach((t)->{
System.out.println(t.getPrice());
});
}
}
本篇部分文字来源于:
咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》
在这里十分感谢老师能够给我带来学习的激情。
2020.11.1
本文章是本人学习笔记,不进行任何商用所以不支持转载请理解!也请别拿去商用!
如果觉得对你有帮助那么欢迎你随时来回顾!
只为记录本人学习历程。
毕