关于HashSet与HashMap

本文通过具体示例展示了如何使用Java中的HashMap和HashSet进行数据的增删查改操作,并介绍了不同迭代方式的特点。


package com.test;

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class MapIteratorDemo {
	/*
	 * HashMap实现Map接口
	 * HashMap基于哈希表(数组+链表)实现
	 * 键和值可以使用null
	 * 非同步,线程不安全,无序
	 */
	public static void hashMapIterator(){
		HashMap<String,Test> h = new HashMap<>();
		Test t1 = new Test(1,"manu1",10);
		Test t2 = new Test(2,"manu2",20);
		Test t3 = new Test(3,"manu3",30);
		h.put("test1",t1);
		h.put("test2",t2);
		h.put("test3",t3);
		h.put("test4",t1);
		System.out.println("删除前的k-v数:"+h.size());
		h.remove("test1");//根据键移除指定的映射关系
		System.out.println("删除后的k-v数:"+h.size());
		t1.setId(5);
//		h.remove("test4");
		
		System.out.println("*********KeySet()*********");
		Set<String> sets = h.keySet();//获取映射中所有键的集合
		Iterator<String> i = sets.iterator();
		while(i.hasNext()){
			String keys = i.next();
			Test tests = h.get(keys);
			System.out.println(keys+"-->"+tests);//无序
		}
		System.out.println("*********entrySet()*********");
		Set<Map.Entry<String, Test>> kv = h.entrySet();//获取键值对
		Iterator<Entry<String, Test>> iter = kv.iterator();
		while(iter.hasNext()){
			System.out.println(iter.next());
		}
		System.out.println("*********values()*********");
		Collection<Test> co = h.values();//获取所有的值得集合
		Iterator<Test> ic = co.iterator();
		while(ic.hasNext()){
			Test t = ic.next();
			System.out.println(t);
		}
	}
	/*
	 * HashSet实现Set接口
	 * HashSet也是基于哈希表实现
	 * 允许使用null元素
	 * 非同步,线程不安全,无序
	 */
	public static void hashSetIterator(){
		HashSet<Test> h = new HashSet<>();
		Test t1 = new Test(1,"manu1",10);
		Test t2 = new Test(2,"manu2",20);
		h.add(t1);
		h.add(t2);
		System.out.println("*********Iterator*********");
		Iterator<Test> iter = h.iterator();
		while(iter.hasNext()){
			Test t = iter.next();
			System.out.println(t);
		}
		System.out.println("*********foreach*********");
		for (Test test : h) {
			System.out.println(test);
		}
		System.out.println("删除前:"+h.size());
		System.out.println("删除t1结果:"+h.remove(t1));
		System.out.println("删除后:"+h.size());
		/*
		 * 改变实例的属性后,
		 * 若在实例类中没有重写hashCode()方法,即使改变实例的属性值,其hash值也相同
		 * 因为Object中的hashCode()是native的,只与本地机器有关,所以,可以执行删除操作
		 * 若实例中重写hashCode()方法,由于改变了实例属性值,重写的hashCode()方法里,某些属性值
		 * 参与了hash值的计算,所以,改变属性值前后hash值也变化了,相当于在原来添加对象的位置找不到了,
		 * 故不能删除成功
		 */
		t2.setId(10);
		System.out.println("删除t2结果:"+h.remove(t2));
		System.out.println("删除后:"+h.size());
		
	} 
	public static void main(String[] args) {
		hashMapIterator();
		System.out.println(">>>>>>>>>>test>>>>>>>>>>");
		hashSetIterator();
	}
}

运行结果:

删除前的k-v数:4
删除后的k-v数:3
*********KeySet()*********
test4-->id=5, name=manu1, age=10
test2-->id=2, name=manu2, age=20
test3-->id=3, name=manu3, age=30
*********entrySet()*********
test4=id=5, name=manu1, age=10
test2=id=2, name=manu2, age=20
test3=id=3, name=manu3, age=30
*********values()*********
id=5, name=manu1, age=10
id=2, name=manu2, age=20
id=3, name=manu3, age=30
>>>>>>>>>>test>>>>>>>>>>
*********Iterator*********
id=2, name=manu2, age=20
id=1, name=manu1, age=10
*********foreach*********
id=2, name=manu2, age=20
id=1, name=manu1, age=10
删除前:2
删除t1结果:true
删除后:1
删除t2结果:false
删除后:1





转载于:https://www.cnblogs.com/jzmanu/p/10284795.html

Java集合框架中,HashSetHashMap都基于哈希表实现,具有高效的查找、插入删除性能,但在用途、接口设计具体实现上存在显著区别: - **基本概念元素存储形式**:HashSet以对象作为元素,拒绝接受重复的对象;而HashMap以(key - value)的一组对象作为元素,可以看作三个视图,即key的Set,value的Collection,Entry的Set,HashSet其实是HashMap的一个视图 [^1][^3]。 - **内部实现使用方式**:HashSet是“Java无序集合类(实现Set接口的类)”成员之一,继承自抽象类AbstractSet,内部基于HashMap实现无序集合类的操作,仅运用了HashMap的“key”,“value”统一放置为HashSet类的一个静态对象;而HashMap是用于存储键值对的集合 [^1][^4]。 - **性能差异因素**:二者都需计算哈希码,若HashMap的键存储在HashSet中的键是相同的对象,性能无真正区别,区别在于HashMap的键是哪种对象,HashSet存储的可能是一个对象 [^2]。 以下是简单的代码示例展示二者的使用: ```java import java.util.HashMap; import java.util.HashSet; public class HashSetAndHashMapExample { public static void main(String[] args) { // HashSet示例 HashSet<String> hashSet = new HashSet<>(); hashSet.add("apple"); hashSet.add("banana"); hashSet.add("apple"); // 重复元素,不会被添加 System.out.println("HashSet: " + hashSet); // HashMap示例 HashMap<String, Integer> hashMap = new HashMap<>(); hashMap.put("apple", 1); hashMap.put("banana", 2); hashMap.put("apple", 3); // 键重复,会更新值 System.out.println("HashMap: " + hashMap); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值