范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java基础你没看错,HashSet就是这么简单!

  Set概述
  Set也是集合中的一个容器,类似于一个罐子,程序可以依次把若干个对象放进Set,但是Set无法保存元素添加的顺序,Set不允许包含相同的元素,如果把两个相同的元素加入同一个Set中,则添加失败,add()方法会返回false,并且新元素不会被添加。Set接口主要有两个实现类HashSet、TreeSet。HashSet
  HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时就是使用这个实现类。HashSet 按 Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。HashSet 具有以下特点。不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。HashSet 不是同步的,如果多个线程同时访问一个 HashSet,假设有两个或者两个以上线程同时修改了HashSet集合时,则必须通过代码来保证其同步。集合元素值可以是 null。当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode()方法来得到该对象的 hashCode 值,然后根据该hashCode 值决定该对象在 HashSet 中的存储位置。如果有两个元素通过equals()方法比较返回 true,但它们的 hashCode()方法返回值不相等,HashSet 将会把它们存储在不同的位置,依然可以添加成功。也就是说,HashSet 集合判断两个元素相等的标准是两个对象通过 equals()方法比较相等,并且两个对象的 hashCode()方法返回值也相等。11.2.1 HashSet常用API
  方法
  描述
  add(Object o)
  添加元素
  remove(Object o)
  移除元素
  isEmpty()
  判断元素是否为空
  size()
  获取set中元素个数
  下面通过示例:package cn.bytecollege;  import java.util.HashSet; import java.util.Set;  public class HashSetDemo { 	public static void main(String[] args) { 		Set set = new HashSet<>(); 		//添加元素 		set.add("张无忌"); 		//移除元素 		set.remove("张无忌"); 		//此时set中没有元素 		System.out.println(set.isEmpty()); 	} } HashSet遍历因为HashSet中的元素没有索引,所以不支持for循环直接遍历,但是可以使用foreach进行遍历package cn.bytecollege;  import java.util.HashSet; import java.util.Set; /**  * 本例将演示使用foreach遍历Set  * @author MR.W  *  */ public class HashSetForDemo { 	public static void main(String[] args) { 		Set set = new HashSet<>(); 		 		set.add("乔峰"); 		set.add("虚竹"); 		set.add("段誉"); 		 		for (String name : set) { 			System.out.println(name); 		} 		 	} } HashSet继承了Iterable接口,因此HashSet还可以使用迭代器遍历。package cn.bytecollege; import java.util.HashSet; import java.util.Iterator; import java.util.Set;  public class HashSetIteDemo { 	public static void main(String[] args) { 		Set set = new HashSet<>(); 		 		set.add("乔峰"); 		set.add("虚竹"); 		set.add("段誉"); 		 		Iterator it = set.iterator(); 		while(it.hasNext()) { 			System.out.println(it.next()); 		} 		 		for (Iterator iterator = set.iterator(); iterator.hasNext();) { 			System.out.println(iterator.next()); 		} 		 	} }重写hashCode
  HashSet 中每个能存储元素的"槽位"(slot)通常称为"桶"(bucket),如果有多个元素的 hashCode值相同,但它们通过equals()方法比较返回 false,就需要在一个"桶"里放多个元素,这样会导致性能下降。
  下面给出重写 hashCode() 方法的基本规则。在程序运行过程中,同一个对象多次调用 hashCode()方法应该返回相同的值。当两个对象通过 equals()方法比较返回 true 时,这两个对象的 hashCode()方法应返回相等的值对象中用作 equals()方法比较标准的实例变量,都应该用于计算 hashCode 值。
  下面给出重写hashCode() 方法的一般步骤。把对象内每个有意义的实例变量(即每个参与 equals方法比较标准的实例变量)计算出一个 int 类型的 hashCode 值,计算方式如下:
  实例变量类型
  计算方式
  实例变量类型
  计算方式
  boolean
  hashCode=(f?1:0);
  float
  hashCode=Float.floatToIntBits(f)
  整型
  hashCode=(int)f;
  doublelong l = Double.doubleToLongBits(f);
  hashCode = (int)(l^l>>>32);
  long
  hashCode=(int)(f^(f>>>32))
  引用类型
  hashCode = f.hashCode();用第1步计算出来的多个hashCode 值组合计算出一个 hashCode 值返回。return f1.hashCode() + (int)f2;
  为了避免直接相加产生偶然相等 (两个对象的 f、f 实例变量并不相等,但它们的 hashCode 的和恰好相等),可以通过各实例变量的 hashCode 值乘以任意一个质数后再相加。例如如下代码;return f1.hashCode()*19 + (int)f2*31;HashSet使用场景
  根据HashSet的特点可以知道HashSet中存放的元素不能重复,利用这个特性就可以做一些去重的业务,例如在给定字符串HelloWorld中统计出现的字符。package cn.bytecollege;  import java.util.HashSet; import java.util.Set;  public class HashSetDemo { 	public static void main(String[] args) { 		 		String str = "HelloWorld"; 		//将字符串转换成字符数组 		char[] ch = str.toCharArray(); 		 		Set set = new HashSet<>(); 		//遍历字符数组将所有元素添加进set去重 		for (Character c : ch) { 			set.add(c); 		} 		//遍历set 		for (Character c : set) { 			System.out.println(c); 		} 	} } LinkedHashSet
  HashSet有一个子类LinkedHashSet,LinkedHashSet集合同HashSet一样,也是根据元素的hashCode值来确定元素的存储位置,并且通过链表维护元素的顺序,换句话说,遍历LinkedHashSet时,LinkedHashSet将会按照元素的添加顺序来访问集合里的元素。
  由于LinkedHash需要维护元素插入的顺序,因此性能略低于HashSet。下面通过示例学习LinkedHashSetpackage cn.bytecollege;  import java.util.LinkedHashSet; import java.util.Set;  /**  * 本例将演示LinkedHashSet  * @author MR.W  *  */ public class LinkedHashSetDemo { 	public static void main(String[] args) { 		Set set = new LinkedHashSet<>(); 		set.add("乔峰"); 		set.add("虚竹"); 		set.add("段誉"); 		for (String name : set) { 			System.out.println(name); 		} 	} }
  从示例代码以及HashSet的遍历我们可以看出LinkedHashSet维护了添加顺序,也就是说添加进容器的元素和取出的元素顺序是一致的。
  如果在某些场景下要使用set容器保存元素,并且需要维护set中的存放元素的顺序,那么就可以使用LinkedHashSetTreeSet
  TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。TreeSet常用API
  与 HashSet 集合相比,TreeSet 还提供了如下几个额外的方法。Comparator comparator()∶如果 TreeSet 采用了定制排序,则该方法返回定制排序所使用的Comparator;如果 TreeSet 采用了自然排序,则返回 null。Object first()∶返回集合中的第一个元素。Object last(): 返回集合中的最后一个元素。Object lower(Object e)∶ 返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是 TreeSet集合里的元素)。Object higher(Object e)∶返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,参考元素不需要是 TreeSet 集合里的元素)SortedSet subSet(Object fromElement,Object toElement)∶返回此Set 的子集合,范围从fromElement(包含)到 toElement (不包含)。SortedSet headSet(Object toElement)∶ 返回此 Set 的子集,由小于 toElement 的元素组成。SortedSet tailSet(Object fromElement)∶ 返回此 Set 的子集,由大于或等于 fromElement 的元素组成。
  下面通过示例学习TreeSet的常用方法:package cn.bytecollege;  import java.util.TreeSet;  public class TreeSetDemo {     public static void main(String[] args) {         TreeSet treeSet = new TreeSet();         treeSet.add(10);         treeSet.add(20);         treeSet.add(30);         treeSet.add(40);         treeSet.add(50);         //如果 TreeSet 采用了定制排序,则该方法返回定制排序所使用的Comparator;如果 TreeSet 采用了自然排序,则返回 null。         System.out.println(treeSet.comparator());         //返回集合中的第一个元素。         System.out.println(treeSet.first());         //返回集合中的最后一个元素。         System.out.println(treeSet.last());         //返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是 TreeSet集合里的元素)。         System.out.println(treeSet.lower(25));         //返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,参考元素不需要是 TreeSet 集合里的元素)         System.out.println(treeSet.higher(25));         //返回此Set 的子集合,范围从fromElement(包含)到 toElement (不包含)。         System.out.println(treeSet.subSet(20,50));         //返回此 Set 的子集,由小于 toElement 的元素组成         System.out.println(treeSet.headSet(30));         //返回此 Set 的子集,由大于或等于 fromElement 的元素组成。         System.out.println(treeSet.tailSet(30));     } }
  根据 上面程序的运行结果即可看出,TreeSet 并不是根据元素的插入顺序进行排序的。而是根据元素实际值的大小来进行排序的。
  与 HashSet 集合采用 hash 算法来决定元素的存储位置不同,TreeSet 采用红黑树的数据结构来存储集合元素。那么 TreeSet 进行排序的规则是怎样的呢? TreeSet 支持两种排序方法∶自然排序和定制排序。在默认情况下,TreeSet 采用自然排序。11.4.2 自然排序
  TreeSet 会调用集合元素的 compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列,这种方式就是自然排序。
  Java 提供了一个 Comparable接口,该接口里定义了一个 compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小。当一个对象调用该方法与另一个对象进行比较时,例如 obj1.compareTo(obj2),如果该方法返回 0,则表明这两个对象相等;如果该方法返回一个正整数,则表明 obj1 大于 obj2;如果该方法返回一个负整数,则表明 obj1小于obj2。
  下面通过示例学习该接口,首先定义Student类,类中包含name和age属性:package cn.bytecollege; public class Student { 	private String name; 	private int age; 	public Student(String name) { 		super(); 		this.name = name; 	} } package cn.bytecollege;  import java.util.Set; import java.util.TreeSet;  public class HashSetDemo { 	public static void main(String[] args) { 		Set set = new TreeSet<>(); 		Student s1 = new Student("张三",18); 		Student s2 = new Student("李四",18); 		 		set.add(s1); 		set.add(s2); 	} }
  当运行以上程序时,发现程序抛出了异常:
  这是因为Student没有继承Comparable接口,如果把一个对象添加到TreeSet时,则该对象的类必须继承Comparable接口,否则程序将会抛出异常。
  下面的程序将演示正确的添加方式:package cn.bytecollege; public class Student implements Comparable{ 	private String name; 	private int age; 	public Student(String name,int age) { 		super(); 		this.name = name; 		this.age = age; 	} 	@Override 	public int compareTo(Student o) { 		return this.age-o.age; 	} } package cn.bytecollege;  import java.util.Set; import java.util.TreeSet;  public class HashSetDemo { 	public static void main(String[] args) { 		Set set = new TreeSet<>(); 		Student s1 = new Student("张三",18); 		Student s2 = new Student("李四",19); 		 		set.add(s1); 		set.add(s2); 	} }
  Student类继承Comparable接口并重写compareTo()方法后再次向TreeSet中添加,可以顺利添加,并且可以按照age属性的大小进行排序。
  当把一个对象加入 TreeSet 集合中时,TreeSet 调用该对象的 compareTo(Object obj)方法与容器中的其他对象比较大小,然后根据红黑树结构找到它的存储位置。如果两个对象通过 compareTo(Object obj)方法比较相等,新对象将无法添加到 TreeSet 集合中。
  对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是∶两个对象通过compareTo(Object obj)方法比较是否返回 0——如果通过 compareTo(Object obj)方法比较返回 0,TreeSet 则会认为它们相等;否则就认为它们不相等。定制排序
  TreeSet 的自然排序是根据集合元素的大小,TreeSet 将它们以升序排列。如果需要实现定制排序,例如以降序排列,则可以通过 Comparator 接口的帮助。该接口里包含一个int compare(T o1,T o2)方法,该方法用于比较 o1 和 o2 的大小∶ 如果该方法返回正整数,则表明o1 大于o2;如果该方法返回0,则表明 o1等于 o2;如果该方法返回负整数,则表明 o1小于 o2。
  如果需要实现定制排序,则需要在创建 TreeSet 集合对象时,提供一个 Comparator 对象与该TreeSet集合关联,由该 Comparator 对象负责集合元素的排序逻辑。
  下面通过示例学习Comparator的用法,继续使用上例中的Student类:package cn.bytecollege; public class Student{ 	private String name; 	private int age; 	public Student(String name,int age) { 		super(); 		this.name = name; 		this.age = age; 	} } package cn.bytecollege;  import java.util.Comparator; import java.util.Set; import java.util.TreeSet;  public class ComparatorDemo { 	public static void main(String[] args) { 		Set set = new TreeSet(new Comparator() { 			@Override 			public int compare(Student o1, Student o2) { 				return o1.age-o2.age; 			} 		}); 		 		Student s1 = new Student("张三",18); 		Student s2 = new Student("李四",19); 		Student s3 = new Student("王五",20); 		 	} } 各个Set性能分析
  HashSet 和 TreeSet 是 Set 的两个典型实现,到底如何选择 HashSet 和 TreeSet 呢?HashSet 的性能总是比 TreeSet 好(特别是最常用的添加、查询元素等操作),因为 TreeSet 需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的 Set 时,才应该使用 TreeSet,否则都应该使用 HashSet。
  HashSet 还有一个子类∶LinkedHashSet,对于普通的插入、删除操作,LinkedHashSet 比 HashSet要略微慢一点,这是由维护链表所带来的额外开销造成的,但由于有了链表,遍历 LinkedHashSet 会更快。

一文摸透DDoS攻击所有概念,值得收藏内容来源华为论坛华安,前几篇我们从历史上著名DDoS案例出发,谈古论今,学习了各类经典DDoS攻击的攻防原理。可是有的初学者留言给我说华安,华安,DDoS案例很有趣,但是理解原理貌腾讯钞能力,未来国产3A不用愁?2022前三季度腾讯都投资了啥?今年由于疫情的影响,国内各行各业都遭到了致命打击,游戏业也是如此。各大游戏公司为了度过寒冬都开始了大面积裁员,有些公司甚至将整条业务线取消。唯有一家公司,它受到的影响很小,还反过来新iPhone将换安卓充电口灵动岛变色了10月4日,欧洲议会以压倒性的票数,支持将USBC强制作为包括iPhone和AirPods在内的各种消费电子设备的通用充电端口。欧盟强制推广USBC接口的初衷是为了环保,手机充电器不管感情多好,不能送以下几样东西给别人,很容易造成误会文夏莫01卷首语朋友,是这世间的一束光,能让人感觉到温暖,感觉到不孤独。每个人在这个世界上,都会有属于自己的朋友。但是,并不是每一种友情,都能长久地发展。许多朋友消散在人海中,是因公司整个安服团队解散,裁员范围涉及销售售前交付等部门shopee大裁员的余震还没结束,360又被曝光大地震了。下面是网传截图,称公司整个安服团队解散,各部分都是大裁员,涉及销售售前交付安服等部门。知情者认证,传闻是真的,部分区域直接文创京城新店开业,来赴一场指间盛会第十届北京惠民文化消费季搭建以20余项主体活动为引领,400余项精品市场活动为协同的全新活动体系,聚焦文创演艺书香影视娱游和艺术六大领域,营造吸引不同年龄圈层不同偏好人群共同参与的曾经欺辱中国的八国联军,现在怎么样了?有两国已经彻底消失欺辱过中国的国家,最后结局有多惨?想当初因为清政府的不作为,八国联军在我中华大地上到处烧杀抢掠,给当时的中国人民带去了无尽的灾难,但是正所谓报应不爽,当初那些在我国大地上犯下累累罪埃隆马斯克到底有多牛?马斯克到底有多牛?要说现在全世界风头最强劲的企业家,那一定非马斯克莫属!很多人把他和疯狂顶流外太空的男人等词语绑定在一起。如果科技界有所谓的顶流的话,埃隆马斯克的确当之无愧。很多人1。Sqoop入门1。1Sqoop简介Sqoop即SqlToHadoop一般来说数据仓库中的数据不应该只有行为数据,还需要有业务数据,而业务数据一般存放在关系型数据库(例如OracleMysqlSqOPPOReno8Pro斩获多渠道销量冠军,Reno7沦为百元机悲惨让路作为OPPOReno系列的产品,OPPOReno8Pro延续了这一系列轻薄高颜值,的优秀基因,打造出颜值极高的轻薄外观OPPOReno8Pro在外观上采用了一体式后盖设计,因此OP苹果macOS13Ventura公测版Beta8发布IT之家10月6日消息,在昨日发布开发者预览版Beta10后,苹果今日向Mac电脑用户推送了macOS13公测版Beta8更新。IT之家了解到,macOSVentura带来了台前调
三主摄5000mAh大电池前提下!FindX6Pro如何做到避免厚重?相信大家也能看到,近些年来随着手机配置的不断升级,手机重量厚度也水涨船高,尤其是定位高端旗舰的手机,经常被因重量厚度原因,被网友调侃成半斤机砖头机。与此同时,也有不少厂商不断寻求新幼童误将鱼肝油当糖果,接连吞下60多粒险中毒!常言道是药三分毒不少人经常服用鱼肝油补充维生素可也不能敞开了吃前两天宿迁泗阳一名五岁女童不小心将鱼肝油当成糖果误吞了60多粒鱼肝油可把家长吓了一跳当天晚上七点五十分左右泗阳县中医院西红柿和鸡蛋包饺子,原来这么好吃,调馅有秘诀,上桌孩子抢着吃家里的冰箱冷冻室还有好多前段时间给爸妈买的速冻饺子,有猪肉韭菜馅的白菜猪肉馅的三鲜馅的猪肉玉米馅的羊肉大葱馅的。这些口味的速冻饺子,可都是爸妈最好吃的口味,可最近一段时间,二老宁愿春天这菜正鲜嫩,揉成面团,包上豆沙馅,大火一蒸超好吃春天有很多时令蔬菜上市,菠菜就是其中一种,新鲜水嫩,正是最好吃的时候。但是很多孩子却不爱吃菠菜,怎么办呢?那就换一种烹饪方式吧,比如切得碎一点烙饼煮面,或者直接揉到面团里,做成各种神奇的生姜生姜大家再熟悉不过了。家里做菜用它。但是你们真的知道它的最大用途么?(此处已添加书籍卡片,请到今日头条客户端查看)有一句谚语说的好冬吃萝卜夏吃姜。不用医生开药方。咱们大多数人包括很长了牛皮癣,终生不能吃牛羊肉吗?为什么?研究证实,牛皮癣皮疹中含有高于正常人20多倍的花生四烯酸,这一化学物质经代谢过后转变成白三烯,是皮疹中重要的致炎物质。红色肉类如牛羊肉含有丰富的花生四烯酸,成为重要的食物来源。因此马山黑山羊肉罐头你吃过吗?周周有料到本期来探秘南宁市马山县是中国黑山羊之乡,黑山羊肉质鲜嫩膻气少,还能做成罐头,在市场上很受消费者的青睐。第十一期周周有料到就来到了马山,让我们一起来探秘马山县黑山羊罐头生产情况。广西清养泉食品美食推荐富贵羊肉煲百香果鸡爪金汤鹿茸菌浸猪肚制作方法富贵羊肉煲原料澳洲羊肉,上海青,胡萝卜块,蒜子,姜,葱,八角,桂皮,白酒,柱侯酱,蚝油,片糖,上汤。制法1将上海青洗净去叶,改刀成花状,焯水备用将煮熟的胡萝卜块入砂锅中垫底2将羊肉汪汪队立大功,加一串鸡腿!近日云南边检总站普洱支队在开展边境巡逻时途经一片玉米地警犬云一突然表现得异常兴奋并吠叫示警按照云一的引导警方在玉米地里的草丛中发现1个编织袋并当场从中查获冰毒6块重达12。47公斤气虚无力血虚发麻阳虚怕冷阴虚怕热,4个中成药,补气血调阴阳大家好,我是沈医生,现在很多人身体素质都不行,一个字就是虚!不信就看看你自己,是不是能躺就不坐,能坐就不站,总感觉浑身累,不想动,容易腰酸腿软,四肢酸痛?如果是,那你就是虚,但也不寒为血虚,痒为血燥,热为血瘀,4个中成药,养血散寒,温化瘀血中医讲血虚则生寒,血燥则生痒,血瘀必生热,血液问题可以通过身体症状表现出来,今天我来给大家解释这三句话的意思。首先,血虚则生寒分为两种情况,第一种是血虚生内寒,这类人会表现出怕冷四