当前位置: 首页 > news >正文

郑州市城乡建设局网站专门做投标书的网站

郑州市城乡建设局网站,专门做投标书的网站,ios网站开发,龙华网站-建设深圳信科2.2、HashSet特点不能保证元素的排列顺序#xff0c;顺序可能和添加的顺序不同#xff0c;顺序也有可能发生变化。HashSetf不是同步的#xff0c;如果多个线程同时来访问一个 HashSet#xff0c;假设有两个或者两个以上线程同时修改了HashSet 集合时#xff0c;则必须通过…2.2、HashSet特点不能保证元素的排列顺序顺序可能和添加的顺序不同顺序也有可能发生变化。HashSetf不是同步的如果多个线程同时来访问一个 HashSet假设有两个或者两个以上线程同时修改了HashSet 集合时则必须通过代码来保证其同步。集合元素值可以是 null。2.3、HashSet如何保证元素唯一性的原理当我们想要创建一个集合该集合里面的元素都具有唯一性时。会遇到两种情况1)元素为String类型可以直接用Hashset集合来创建2)String类重写了hashCode()和equals()方法所以它就可以把内容相同的字符串去掉只留下一个。思路图3)HashSet保证元素唯一性的原理我们使用Set集合都是需要去掉重复元素的,如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象如果没有哈希值相同的对象就直接存入集合如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存。4)将自定义类的对象存入HashSet去重复类中必须重写hashCode()和equals()方法hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储。在开发中并不要我们去写比如使用eclipse开发中在类上面 AltShifts 再点h就能生成相对应的重写的hashCode()和equls()方法了。那我们就来分析一下该怎么写的。/*注意这里是一个Student类里面有name和age属性。* 为什么是31?* 1,31是一个质数,质数是能被1和自己本身整除的数* 2,31这个数既不大也不小* 3,31这个数好算,2的五次方-1,2向左移动5位*/Overridepublic inthashCode() {finalint prime 31;int result 1;result prime * result age;result prime * result ((name null) ? 0: name.hashCode());returnresult;}Overridepublicboolean equals(Object obj) {if (this obj) //调用的对象和传入的对象是同一个对象return true; //直接返回trueif (obj null) //传入的对象为nullreturn false; //返回falseif (getClass() ! obj.getClass()) //判断两个对象对应的字节码文件是否是同一个字节码return false; //如果不是直接返回falsePerson other (Person) obj; //向下转型if (age ! other.age) //调用对象的年龄不等于传入对象的年龄return false; //返回falseif (name null) { //调用对象的姓名为nullif (other.name ! null) //传入对象的姓名不为nullreturn false; //返回false} else if (!name.equals(other.name)) //调用对象的姓名不等于传入对象的姓名return false; //返回falsereturn true; //返回true}细说hashCode和equals方法2.4、一个案例来说明问题package com.zyh.domain;public classPerson {privateString name;private intage;public Person(String name,intage) {this.name name;this.age age;}publicString getName() {returnname;}public voidsetName(String name) {this.name name;}public intgetAge() {returnage;}public void setAge(intage) {this.age age;}/** 为什么是31?* 1,31是一个质数,质数是能被1和自己本身整除的数* 2,31这个数既不大也不小* 3,31这个数好算,2的五次方-1,2向左移动5位*/Overridepublic inthashCode() {finalint prime 31;int result 1;result prime * result age;result prime * result ((name null) ? 0: name.hashCode());returnresult;}Overridepublicboolean equals(Object obj) {if (this obj) //调用的对象和传入的对象是同一个对象return true; //直接返回trueif (obj null) //传入的对象为nullreturn false; //返回falseif (getClass() ! obj.getClass()) //判断两个对象对应的字节码文件是否是同一个字节码return false; //如果不是直接返回falsePerson other (Person) obj; //向下转型if (age ! other.age) //调用对象的年龄不等于传入对象的年龄return false; //返回falseif (name null) { //调用对象的姓名为nullif (other.name ! null) //传入对象的姓名不为nullreturn false; //返回false} else if (!name.equals(other.name)) //调用对象的姓名不等于传入对象的姓名return false; //返回falsereturn true; //返回true}OverridepublicString toString() {return Person{ name name \ , age age };}}Personpackage com.zyh.Collection.set;import com.zyh.domain.Person;import java.util.HashSet;public classHashSetDemo_0010 {/*HashSet集合存储自定义对象并遍历。如果对象的成员变量值相同即为同一个对象注意了你使用的是HashSet集合这个集合的底层是哈希表结构。而哈希表结构底层依赖:hashCode()和equals()方法。如果你认为对象的成员变量值相同即为同一个对象的话你就应该重写这两个方法。如何重写呢?不同担心自动生成即可。*/public static voidmain(String[] args) {HashSet hs new HashSet();hs.add(new Person(boy,10));hs.add(new Person(girl,34));hs.add(new Person(girl,34));hs.add(new Person(boy,10));hs.add(new Person(person,10));hs.add(new Person(boy,10));hs.add(new Person(person,10));hs.add(new Person(boy,10));hs.add(new Person(girl,34));//遍历集合for(Person p : hs){System.out.println(p.getName():p.getAge());}}}HashSetDemo_0010三、LinkedHashSet3.1、LinkedHashSet概述1)LinkedHashSet是HashSet的子类LinkedHashSet 集合也是根据元素的 hashCode 值来决定元素的存储位置但它同时使用链表维护元素的次序这样使得元素看起来是以插入的顺序保存的。也就是说当遍历 LinkedHashSet 将会按照添加元素顺序来访问集合里的元素。2)LinkedHashSet是通过用一个链表的实现来扩展HashSet从而支持了对HashSet中的元素的排序。所以LinkedHashSet可以按照元素插入时的顺序进行提取。3)LinkedHashSet 需要维护元素的插入顺序因此性能略低于 HashSet 的性能但在迭代访问 Set 里的全部元素时将有很好的性能因为它以链表来维护内部顺序。虽然 LinkedHashSet 使用了链表记录集合元素的添加顺序但 LinkedhasHSet依然是 HashSet,因此它依然不允许集合元素重复。4)LinkedHashSet只能按照先后顺序来进行排序TreeSet则是按照比较器给的比较规则进行从小到大排序。其实现也就是借助于TreeMap。3.2、LinkedHashSet的特点一是保证元素唯一。二是可以保证怎么存就怎么取3.3、SortedSet接口与TreeSet类SortedSet接口是Set接口的子接口,除了拥有Set集合的一些基本特点之外,还提供了排序的功能。TreeSet类就是SortedSet接口的实现类四、TreeSet4.1、TreeSet概述1)TreeSet继承与实现关系TreeSet 是一个有序的集合它的作用是提供有序的Set集合。它继承于AbstractSet抽象类实现了NavigableSet, Cloneable, java.io.Serializable接口。TreeSet 继承于AbstractSet所以它是一个Set集合具有Set的属性和方法。TreeSet 实现了NavigableSet接口意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。TreeSet 实现了Cloneable接口意味着它能被克隆。TreeSet 实现了java.io.Serializable接口意味着它支持序列化。TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式自然排序 或者 根据创建TreeSet 时提供的 Comparator (比较器排序)进行排序。这取决于使用的构造方法。TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。另外TreeSet是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。2)存储对象TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法。Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序)如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口在类上implement Comparable重写compareTo()方法在使用TreeSet存储对象的时候, add()方法内部就会自动调用compareTo()方法进行比较, 根据比较结果使用二叉树形式进行存储3)Tree的构造方法//默认构造函数。使用该构造函数TreeSet中的元素按照自然排序进行排列。TreeSet()//创建的TreeSet包含collectionTreeSet(Collection extends Ecollection)//指定TreeSet的比较器TreeSet(Comparator super Ecomparator)//创建的TreeSet包含setTreeSet(SortedSet set)4)TreeSet与Collection的关系TreeSet继承于AbstractSet并且实现了NavigableSet接口。TreeSet的本质是一个有序的并且没有重复元素的集合它是通过TreeMap实现的。TreeSet中含有一个NavigableMap类型的成员变量m而m实际上是TreeMap的实例。4.2、TreeSet原理1)特点TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列2)使用方式2.1)自然顺序(Comparable)TreeSet类的add()方法中会把存入的对象提升为Comparable类型调用对象的compareTo()方法和集合中的对象比较根据compareTo()方法返回的结果进行存储2.2)比较器顺序(Comparator)创建TreeSet的时候可以制定 一个Comparator如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序add()方法内部会自动调用Comparator接口中compare()方法排序调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数2.3)两种方式的区别TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)TreeSet如果传入Comparator, 就优先按照Comparator4.3、图解TreeSet的排序原理4.3.1、环境我们创建了一个Person类和一个测试类TreeSetDemo_0010类package com.zyh.domain;public classPerson {privateString name;private intage;public Person(String name,intage) {this.name name;this.age age;}publicString getName() {returnname;}public voidsetName(String name) {this.name name;}public intgetAge() {returnage;}public void setAge(intage) {this.age age;}/** 为什么是31?* 1,31是一个质数,质数是能被1和自己本身整除的数* 2,31这个数既不大也不小* 3,31这个数好算,2的五次方-1,2向左移动5位*/Overridepublic inthashCode() {finalint prime 31;int result 1;result prime * result age;result prime * result ((name null) ? 0: name.hashCode());returnresult;}Overridepublicboolean equals(Object obj) {if (this obj) //调用的对象和传入的对象是同一个对象return true; //直接返回trueif (obj null) //传入的对象为nullreturn false; //返回falseif (getClass() ! obj.getClass()) //判断两个对象对应的字节码文件是否是同一个字节码return false; //如果不是直接返回falsePerson other (Person) obj; //向下转型if (age ! other.age) //调用对象的年龄不等于传入对象的年龄return false; //返回falseif (name null) { //调用对象的姓名为nullif (other.name ! null) //传入对象的姓名不为nullreturn false; //返回false} else if (!name.equals(other.name)) //调用对象的姓名不等于传入对象的姓名return false; //返回falsereturn true; //返回true}OverridepublicString toString() {return Person{ name name \ , age age };}}Personpackage com.zyh.Collection.set;import com.zyh.domain.Person;import java.util.TreeSet;public classTreeSetDemo_0010 {public static voidmain(String[] args) {TreeSet ts new TreeSet();ts.add(new Person(张三,23));ts.add(new Person(李四,13));ts.add(new Person(王五,43));ts.add(new Person(赵六,33));for(Person p:ts){System.out.println(p);}}}TreeSetDemo_0010当我们直接执行的时候会报错误。Exception in thread main java.lang.ClassCastException: com.zyh.domain.Person cannot be cast to java.lang.Comparable分析Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序)4.3.2、自然排序(Comparable)我们让Person实现Comparable接口重写compareTo方法当我们把返回值设置为1时图解当返回值是0时张三作为二叉树的根当我们其他的元素比较时都返回0表示相同的对象。所以只会存储张三。当返回值是-1时张三作为二叉树的根李四和它比较时返回-1说明李四小挂在张三的左边。王五一进来也和张三比较返回-1放在张三左边在和李四比较返回-1挂在李四左边以此类推。当返回值是1时。和上面一样的推理。2.1)按照年龄排序分析张三作为二叉树的根当李四进来的时候李四的年龄比张三小挂在张三的左边。当王五进来的时候王五的年纪比张三大所以挂在张三的右边。当赵六的进来的时候和张三比较年龄结果赵六大挂在张三的右边在和王五比较结果比王五小挂在王五的左边。结果排序就是李四、张三、赵六、王五2.2)按年龄为主要条件名字是次要条件4.3.3、比较器顺序(Comparator)首先我们查看TreeSet的构造方法发现有一个这样的构造方法//指定TreeSet的比较器TreeSet(Comparator super E comparator)通过查看它的构造方法就知道可以传入一个比较器。构造一个新的空TreeSet它根据指定比较器进行排序。插入到该 set 的所有元素都必须能够由指定比较器进行相互比较对于 set 中的任意两个元素 e1 和e2执行 comparator.compare(e1, e2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的元素添加到 set 中则 add 调用将抛出 ClassCastException。1)TreeSetd的Comparetor比较器实现的二种方法第一种写个类实现Comparator接口classmyComparator implements Comparator{Overridepublic intcompare(Object o1, Object o2) {Person p1(Person) o1;Person p2(Person) o2;int num p1.getName().compareTo(p2.getName());//0的话是两个相同进行下一个属性比较if (num 0){return new Integer(p1.getAge()).compareTo(newInteger(p2.getAge()));}returnnum;}}然后在new Set的时候放进去。如TreeSet ts new TreeSet(new myComparator());myComparator第二种写内名内部类方法TreeSet ts new TreeSet(newComparator() {Overridepublic intcompare(Object o1, Object o2) {Person p1(Person) o1;Person p2(Person) o2;int num p1.getName().compareTo(p2.getName());if (num 0){return new Integer(p1.getAge()).compareTo(newInteger(p2.getAge()));}returnnum;}});View Code
http://www.sadfv.cn/news/287039/

相关文章:

  • 网站建设硬件投入表wordpress主题动漫
  • 网站开发用什么数据库网站如何做404
  • 做优秀网站有什么做家常菜的网站
  • 福建中国建设工程造价管理协会网站asp网站显示空白
  • 网站备案 地域深圳建设网站排名
  • 企业网站页面宽哪里设置wordpress 爬虫插件
  • 怎样做网站备份禹州做网站的公司
  • 国外做兼职的网站网站用哪些系统做的比较好
  • 网站子页设计用wordpress建医疗网站
  • 快彩网站开发网站内容管理系统建设
  • app与网站的区别功能自己做的网站能备案
  • 中山网站建设咨询建设银行咸阳交费网站
  • 做网站要用到哪些架包网站定制怎么收费
  • 好玩有趣的网站网上做兼职老师的正规网站
  • 网站建设描述西部数码个人网站
  • 网站开发与推广方向德阳响应式网站建设
  • 四川成都网站建设公司专门做网站的软件是
  • 制作个网站大概多少钱校友网站 建设
  • 广铁建设集团门户网站网络科技有限公司和科技有限公司的区别
  • 网站备案账号是什么情况朝阳网络推广
  • 中国建设住建网站做网站开发学什么内容
  • 如何创立一个网站wordpress 优化提速
  • 网站建设开发技术天津如何建设自己的网站 知乎
  • 怎么建设网站首页镇江模板网站
  • 外贸网站都有那些网站设计业务
  • 网站建设与管理书籍网站机房建设
  • 旅游网站开发选题背景wordpress最新的编辑器
  • 做网站建设 个体经营 小微企业2023年企业所得税最新政策
  • 装饰设计网站模板北京公司注册网址
  • 百度公司做网站吗有哪些好的做兼职网站