JAVA学习日记:集合框架(4)

本节课我学习的主要内容有:

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
本文章是本人学习笔记,不进行任何商用所以不支持转载请理解!也请别拿去商用!
如果觉得对你有帮助那么欢迎你随时来回顾!
只为记录本人学习历程。
毕
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值