简单的理解java集合中的HashSet和HashTree几个重写方法_java

来源:脚本之家  责任编辑:小易  

因为TreeSet需要排序而HashSet不需要,空的无法排序,1 List 集合: 被比较的对2113象要重写equals()方法, 调用List中5261contains()方法,就是用equals()方法比较的. List 集合4102 (允许1653重复元素,允许空值) 2 HashSet集合(不允许重复元素,允许空值): 被比较的对象要重写hashCode()方法和重写equals()方法, 两个都要. 3 TreeSet集合.(不允许重复元素): 方法一:被比较的对象(如学生类)实现Comparable接口,重写CompareTo()方法.--(不允许空值) 方法二:TreeSet的构造方法,传入Comparator接口的实现类,他是重写了compare()方法.--(允许空值) 4 HashMap集合: 与HashSet情况一样. 5 TreeMap集合: 与TreeSet情况一样. 6 顺便说一下, 对List排序可用Collections类的sort()方法.要用到Comparable或Comparator接口.===========================================================list:arraylist,vector,linkedlist,其中vetctor线程同步,linkedlist插删基本上list都是基于array的;里面的元素都可以重复;set:hashset,treeset;set不能够重复,set是基于map的;treeset是排序的list和set是继承collection接口的,map不是map:hashtable,hashmap,treemap;hashtable是线程同步的,map的key不能够重复,value可以;treemap是排序的另外,没记错的话,list,set,map都是可以使用collections.sort()排序的,List和Set都是接口。他们各自有自己2113的实5261现类,有无顺序的实现类,也有4102有顺序的实现类。最大的不同1653就是List是可以重复的。而Set是不能重复的。List适合经常追加数据,插入,删除数据。但随即取数效率比较低。Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低www.zgxue.com防采集请勿采集本网。

Java中的set是无序的,但是是不可重复的

==========================他们的区别===========================1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.3

HashSet底层是哈希表,通过调用hashcode和equals方法实现去重

==========================他们的区别=========================== 1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key 2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能

当我们HashSet里面存的是字符串时,就能默认去重了,因为String已经重写了hashcode和euqals方法

.HashSet 只去重复, 没有顺序 HashSet的add方法会调用hashCode和equals, 所以存储在HashSet中的对象需要重写这两个方法. 2.TreeSet 去重复, 并且可以按照某种顺序排序 TreeSet的add方法会将对象转为Comparable, 然后调用compareTo方法, 所以存储

Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象。 Has

public static void main(String[] args) { HashSet<String> set = new HashSet(); set.add("java"); set.add("c"); set.add("php"); set.add("bigdata"); set.add("java"); //运行结果,给去重了,而且是无序的 System.out.println(set);//[java, c, bigdata, php] }}

我就按照自己想的说说吧。 首先它们6个是分属于三个类别中的,也就是List,Set,Map。 List与Set都是放单独的对象的,Map则是放一个名值对,就是可以通过一个key找到一个value。 List存东西是有顺序的,Set是没有顺序的。 List是允许重复存入的

但是当我们有类的时候,比如Person,Cat,Dog,我们自己写的类,但是我们想按照自己制定的规则去重,就比如Person的姓名和年龄,因为Person类是我们自己建的,如果我们没有重写方法,就会去找Object的hashcode方法,这样new Person()的hashcode就会不同,这样每个都是一个新的,都会输出,即使年龄和姓名一样

Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象。 Has

public class Demo1 { public static void main(String[] args) { HashSet<Person> set1 = new HashSet<>(); set1.add(new Person("aing",50)); set1.add(new Person("bing",10)); set1.add(new Person("ding",20)); set1.add(new Person("ding",20)); //运行结果是即使名字年龄一样,也会输出两个,我们如果想要按照自己的规则去重,这样我们一定要重写hashcode 和euqals方法 System.out.println(set1);//[Person{name='bing', age=10}, Person{name='ding', age=20}, Person{name='aing', age=50}, Person{name='ding', age=20}] }}class Person{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}

我们重写hashcode方法,当hashcode不一样时,就不会比较equals,直接就是不一样,如果hashcode一样,再比较equals方法

Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象。 Has

public class Demo1 { public static void main(String[] args) { HashSet<Person> set1 = new HashSet<>(); set1.add(new Person("aing",50)); set1.add(new Person("bing",10)); set1.add(new Person("ding",20)); set1.add(new Person("ding",20)); //根据年龄和姓名比较的 System.out.println(set1);//[Person{name='ding', age=20}, Person{name='aing', age=50}, Person{name='bing', age=10}] }}class Person{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } //和属性关联,根据属性的值比较,之所以让age*100;是因为怕有可能出现这个name.hashCode()+age 和 下一个name.hashCode()+age加起来的值恰好相等,所以age*100,可以避免这种情况的发生 @Override public int hashCode() { //return Objects.hash(name, age); return name.hashCode()+age*100; }}

TreeSet底层是二叉树,而且TreeSet还是有序的,在String中不仅重写了hashcode,还要调用元素的compareTo方法, String类已经实现了Comparable接口,并重写 了compareTo方法,但是如果我们自己写类的话,比如Person来说,如果想要按照自己的规则比,就要重写hashcode方法和实现Comparable接口

Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象。 Has

public class Demo2 { public static void main(String[] args) { TreeSet<String> set = new TreeSet(); set.add("java"); set.add("c"); set.add("php"); set.add("bigdata"); set.add("java"); System.out.println(set);//[bigdata, c, java, php] }}

但是要是自己的类

会报错cannot be cast to java.lang.Comparable,因为Person会去找compareTo的方法,但是Person类没有实现它,我们要去实现Comparable

Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象。 Has

public class Demo2 { public static void main(String[] args) { TreeSet<Person1> set1 = new TreeSet<>(); set1.add(new Person1("aing",50)); set1.add(new Person1("bing",10)); set1.add(new Person1("ding",20)); set1.add(new Person1("ding",20)); System.out.println(set1); }}class Person1{ String name; int age; public Person1(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person1{" + "name='" + name + '\'' + ", age=" + age + '}'; }}

这样我们就可以实现有序了,根据我们的属性

Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。 Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不 会接受这两个对象。 Has

public class Demo2 { public static void main(String[] args) { TreeSet<Person1> set1 = new TreeSet<>(); set1.add(new Person1("aing",50)); set1.add(new Person1("bing",10)); set1.add(new Person1("ding",20)); set1.add(new Person1("ding",20)); System.out.println(set1); }}class Person1 implements Comparable{ String name; int age; public Person1(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person1 person1 = (Person1) o; return age == person1.age && Objects.equals(name, person1.name); } @Override public int hashCode() { return name.hashCode()+age*100; } @Override public String toString() { return "Person1{" + "name='" + name + '\'' + ", age=" + age + '}'; } //根据类的属性进行排序 @Override public int compareTo(Object o) { Person1 person = (Person1)o; int num = name.compareTo(person.name); return num==0?age-person.age:num;}}

到此这篇关于简单的理解java集合中的HashSet和HashTree几个重写方法的文章就介绍到这了,更多相关java HashSet和HashTree重写内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网! 您可能感兴趣的文章:详解Java中HashSet和TreeSet的区别HashSet工作原理_动力节点Java学院整理Java中HashSet和HashMap的区别_动力节点Java学院整理Java编程中的HashSet和BitSet详解java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

TreeSet是一个有序的集合。2113第一:构造、增加、遍5261历、删除和判断是否4102包含某个元素同1653HashSet是一致的。、第二:证明TreeSet是一个有序的集合。TreeSet hashSet = new TreeSet();hashSet.add("a"); //向集合中添加一个字符串hashSet.add("e");hashSet.add("b");hashSet.add("d");hashSet.add("c");Iterator it = hashSet.iterator();while(it.hasNext()){System.out.println(it.next()+",");}输出结果是:a,b,c,d,e,注意:(1)从结果中可以看出元素被排序了,但是这个用默认的排序方法。如何自定义排序呢?可以实现Comparator接口来自定义排序。例如:import java.util.Comparator;import ws.wph.android.util.StringUtils;public class MyCmp implements Comparator {public int compare(Object element1, Object element2) {int x = element2.toString().compareTo(element1.toString());return x;}}然后将该类的对象作为TreeSet构造方法的实参,即TreeSet hashSet = new TreeSet(new MyCmp());。原理是:向TreeSet增加元素时,自动调用MyCmp类的compare(Object element1, Object element2)方法,根据方法返回值决定element1和element2的顺序。(此时的输出结果是:e,d,c,b,a,)(2)当element1 == element2时返回0,element1 > element2 返回正数,element1 < element2返回负数。第三:按照学生成绩排序,当成绩相同时按照学号排序public int compare(Object element1, Object element2) {int x=0;Stuendt s1 = (Stuendt)element1;Stuendt s2 = (Stuendt)element2;if(s1.getScore() > s2.getScore()){x=-1;}else if(s1.getScore() < s2.getScore()){x=1;}else{x = s1.getSno().compareTo(s2.getSno());}return x;}(3)将汉字转换成拼音public static String getPingYin(String src){char[] t1 = null;t1=src.toCharArray();String[] t2 = new String[t1.length];HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);t3.setVCharType(HanyuPinyinVCharType.WITH_V);String t4="";int t0=t1.length;try {for (int i=0;i<t0;i++){//判断是否为汉字字符if(java.lang.Character.toString(t1[i]).matches("[\\u4E00-\\u9FA5]+")){t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);t4+=t2[0];}elset4+=java.lang.Character.toString(t1[i]).toLowerCase();}return t4;}catch (BadHanyuPinyinOutputFormatCombination e1) {e1.printStackTrace();}return t4;}但是需要导入一个包内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • java多线程复制文件的实例代码
  • java 代码块与静态代码块加载顺序
  • 详解springboot结合swagger2快速生成简单的接口文档
  • java并发编程专题(一)----线程基础知识
  • elasticsearch 基础介绍及索引原理分析
  • 解析java编程中对于包结构的命名和访问
  • 基于线程、并发的基本概念(详解)
  • maven入门之使用nexus搭建maven私服及上传下载jar包
  • 深入了解java servletcontext
  • java实现响应重定向发送post请求操作示例
  • java8中重写treeset集合的comparetor怎么实现
  • java中为什么List、HashSet允许存放空元素,TreeSe...
  • java treeset和hashset如何判断元素是否相同
  • HashSet和TreeSet的区别
  • Java HashSet和TreeSet的区别
  • HashSet和TreeSet的用法
  • hashtree.add,aaaaa怎么决定它的添加顺序
  • HashSet,TreeSet和LinkedHashSet的区别
  • 学JAVA的新手请教HashSet TreeSet LinkedList A...
  • java中HashSet的集合内容如何一次性全部加入到Tree...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页详解java中hashset和treeset的区别hashset工作原理_动力节点java学院整理java中hashset和hashmap的区别_动力节点java学院整理java编程中的hashset和bitset详解java 中hashmap、hashset、treemap、treeset判断元素相同的几种方法比较java多线程复制文件的实例代码java 代码块与静态代码块加载顺序详解springboot结合swagger2快速生成简单的接口文档java并发编程专题(一)----线程基础知识elasticsearch 基础介绍及索引原理分析解析java编程中对于包结构的命名和访问基于线程、并发的基本概念(详解)maven入门之使用nexus搭建maven私服及上传下载jar包深入了解java servletcontextjava实现响应重定向发送post请求操作示例java使double保留两位小数的多方java8 十大新特性详解intellij idea 2020最新激活码(亲java.net.socketexception: connjava写入文件的几种方法分享java环境变量的设置方法(图文教程java 十六进制与字符串的转换java list用法示例详解java中file类的使用方法javaweb实现文件上传下载功能实例详解springboot初始教程之tomcat、https配详解springmvc controller介绍及常用注解spring boot 监控处理方案实例详解java grpc实例创建负载均衡详解如何使用code128字体将文本转换为code128java http反向代理实现过程详解java实现斗地主案例java+eclipse+selenium环境搭建的方法步骤浅谈java日志格式化java实现截取pdf指定页并进行图片格式转换
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved