JAVA学习第三十六课(常用对象API)- 集合框架(四)— Set集合:HashSet集合演示

随着Java学习的深入,感觉大一时搞了一年的ACM,简直是明智之举,Java里很多数据结构、算法类的东西,理解起来就轻松多了

Set集合下有两大子类开发常用 HashSet集合 、TreeSet集合

Set集合的元素是不重复且无序

一、HashSet集合

API文档解释:此类实现
Set
接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null 元素。

此类为基本操作提供了稳定性能,注意,此实现不是同步的。

由上可以总结出:HashSet集合的方法:内部数据结构是哈希表,且不同步,无论重复元素有多少,只存一个。

import java.util.HashSet;
import java.util.Iterator;

public class Main
{
	public static void main(String[] args)
	{
		HashSet hash = new HashSet();
		hash.add("123");
		hash.add("456");
		hash.add("asd");
		hash.add("789");
		Iterator it = hash.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}

哈希表

    数据经过哈希算法存储,会经过两次判断,第一此判断位置,第二次会判断内容,比如“ab”已经存储了,“ba”经过算法得到的位置是“ab”的位置,这时要经过第二次判断,确定内容是否相同,不相同会通过过算法得到新的位置,ACM里一般会经过线性探测再散列或者是链地址法

总结

哈希表判断元素是否相同:

1.判断的是两个元素的哈希值是否相同,如果相同,再判断两个对象的内容是否相同

2.判断哈希值相同,HashCode方法(返回此字符串的哈希码),判断内容相同,equals方法

注:哈希值不同,就不需要第二次判断内容是否相同

哈希表演示

import java.util.HashSet;
import java.util.Iterator;
class Man extends Object//必须继承Object类才能复写HshCode,equals
{
	private String name;
	private int age;
	public Man() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Man(String name, int age) {
		super();
		this.name = name;
		//System.out.println("1号"+this);
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prim = 31;
		//System.out.println("namecode = "+name.hashCode());
		return name.hashCode()+age*prim;
	}
	@Override
	public boolean equals(Object obj) {
		if(this == obj)
			return true;
		//System.out.println("2号"+this);
		if(!(obj instanceof Man))
			throw new ClassCastException("类型错误");
		Man m = (Man)obj;
		return this.name.equals(m.name) && this.age == m.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 class Main
{
	public static void main(String[] args)
	{
		HashSet hash = new HashSet();
		hash.add(new Man("a",11));
		hash.add(new Man("b",12));
		hash.add(new Man("c",13));
		hash.add(new Man("a",11));
		Iterator it = hash.iterator();
		while(it.hasNext()){
			Man M = (Man)it.next();
			System.out.println(M.getName()+"....."+M.getAge());
		}
	}
}

特别注意:上述代码的1号和2号两个this,代表的对象不同,不能混淆

练习

关于ArrayList的演示

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
class Man extends Object
{
	private String name;
	private int age;
	public Man() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Man(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public boolean equals(Object obj) {
		if(this == obj)
			return true;
		if(!(obj instanceof Man))
			throw new ClassCastException("类型错误");
		Man m = (Man)obj;
		return this.name.equals(m.name) && this.age == m.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 class Main
{
	public static void main(String[] args)
	{
		ArrayList AL = new ArrayList();
		AL.add(new Man("a",11));
		AL.add(new Man("b",12));
		AL.add(new Man("c",13));
		AL.add(new Man("a",11));
		printf(AL);
		AL = ArrayListHashDemo(AL);
		printf(AL);
		System.out.println(AL.remove(new Man("a",11)));
		printf(AL);
	}
	public static ArrayList ArrayListHashDemo(ArrayList al) {
		ArrayList temp = new ArrayList();
		Iterator it = al.iterator();
		while(it.hasNext())
		{
			Object obj = it.next();
			if(!temp.contains(obj))
			temp.add(obj);
		}
		return temp;
	}
	public static void printf(ArrayList al)
	{
		Iterator it = al.iterator();
		while(it.hasNext())
		{
			Man man = (Man)it.next();
			System.out.print(man.getName()+".."+man.getAge()+",");
		}
		System.out.printf("\n");
	}
}

API文档关于contains的解释:如果列表包含指定的元素,则返回 true。更确切地讲,当且仅当列表包含满足(o==null ? e==null : o.equals(e)) 的元素e 时才返回
true

所以对于ArrayList集合,contains的判断与equals有关,而HashSet与HashCode和equals有关

System.out.println(AL.remove(new Man("a",11)));//同理,remove也是有equals有关,只判断内容
时间: 2024-10-06 00:10:59

JAVA学习第三十六课(常用对象API)- 集合框架(四)— Set集合:HashSet集合演示的相关文章

JAVA学习第三十九课(常用对象API)- 集合框架(七)— Map集合及其子类对象

一.Map集合常见子类 HashTable:内部结构是哈希表,同步,此实现提供所有可选的映射操作,不允许使用 null 值和 null 键 (HashTable下有子类Properties,使用频率非常高,用来存储键值对型的配置文件信息和IO技术相结合) HashMap:内部结构是哈希表,不同步,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键. TreeMap:内部结构是二叉树,不同步,可以对Map集合中的键进行排序. 二.HashMap演示 import java.ut

JAVA学习第三十五课(常用对象API)- 集合框架(三)—Vector、LinkedList、ArrayList集合演示

集合框架构成图 摘自百度图片 一.Vector集合 演示 虽然Vector已经不常用了,但是还是要了解一下其中的方法 import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Vector

JAVA学习第三十八课(常用对象API)- 集合框架(六)— Map集合及其常用方法

一.Map集合特点 Map集合(双列集合)一次添加一对元素,Collection集合(单列集合)一次添加一个元素 接口 Map<K,V>,实际上存储的是键值对 特点: 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 也就是说Map中必须保证键的唯一性 二.常用方法 1.添加:value = put(key,value);返回前一个和key相关联的值,如果没有返回null 2.删除:void clear();把Map中的所有映射关系清除 value remove(ke

JAVA学习第三十二课(常用对象API)- 基本数据类型对象包装类

将基本数据类型(8种:int..)封装成对象的好处就是可以在对象中封装更多的功能和方法来操控该数据 常见的操作就是:用于基本数据类型与字符串之间的转换 基本数据类型对象包装类一般用于基本类型和字符串之间的转换 基本类型----->字符串 1.基本类型数值+"" 2.用string类中的valueOf(基本类型数值) 3.用Integer.ValueOf(); 字符串-->基本类型数值 1.使用包装类中的静态方法XXX  parseXXX("XXXX")比

JAVA学习第五十六课 — IO流(十)对象的序列化和反序列化 &amp; RandomAccessFile

操作对象 ObjectInputStream.ObjectOutputStream 被操作的对象需要实现Serializable(标记接口) ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStream 读取(重构)对象.通过在流中使用文件可以实现对象的持久存储.如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的

JAVA学习第四十六课 — 其他对象API(二)Date类 &amp; Calendar类(重点掌握)

Date类(重点) 开发时,会时常遇见时间显示的情况,所以必须熟练Date的应用 <span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>import java.util.*; public class Main { public static void main(String[] args){ long l = System.currentTimeMillis();//14140798929

JAVA学习笔记(三十六)- 文件的拆分和合并

文件的拆分和合并 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.SequenceInputStream; import java.util.Enumeration; import java.util.Vector; /* * 文件的拆分和合并 */ public class

NeHe OpenGL教程 第三十六课:从渲染到纹理

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十六课:从渲染到纹理 放射模糊和渲染到纹理: 如何实现放射状的滤镜效果呢,看上去很难,其实很简单.把渲染得图像作为纹理提取出来,在利用OpenGL本身自带的纹理过滤,就能实现这种效果,不信,你试试. 嗨,我是Dario Corn

2018-08-24 第三十六课

第三十六课 非关系统型数据库-mangodb 目录 二十四 mongodb介绍 二十五 mongodb安装 二十六 连接mongodb 二十七 mongodb用户管理 二十八 mongodb创建集合.数据管理 二十九 php的mongodb扩展 三十 php的mongo扩展 三十一 mongodb副本集介绍 三十二 mongodb副本集搭建 三十三 mongodb副本集测试 三十四 mongodb分片介绍 三十五 mongodb分片搭建 三十六 mongodb分片测试 三十七 mongodb备份