Hashset集合

存储字符串并遍历

import java.util.HashSet;public class dmo1_hashset {//set集合,无索引,不可以重复,无序(存取不一致)public static void main(String[] args) {HashSet<String> hSet=new HashSet<>();  //创建hashset对象boolean b1=hSet.add("a");boolean b2=hSet.add("a");    //当向set集合中存储重复元素的时候返回为falsehSet.add("b");hSet.add("c");hSet.add("d");System.out.println(hSet);  //hashset的继承体系中有重写toString方法//System.out.println(b1);//System.out.println(b2);for (String string : hSet) {  //只要能用迭代器迭代的,就可以使用增强for循环遍历
            System.out.println(string);}}}

案例

存储自定义对象保证元素唯一性

Hashset原理

  我们使用set集合都是需要去掉重复元素的,如果在存储的时候逐个equals()比较,效率较低,哈希算法提高了重复的效率,降低了使用equals()方法的次数

  当Hashset调用add()方法存储对象的时候,先调用对象的hashset()方法得到一个哈希值,然后在集合中查找是否有哈希值相同的对象:

  如果没有哈希值相同的对象就直接存入集合

  如果有哈希值相同的对象,就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入,true则不存

将自定义累的对象存入Hashset去重复

  类中必须重写hashCode()和equals()方法

  hashCode():属性相同的对象返回值此项相同,属性不同的返回值尽量不同(提高效率)

  equals():属性相同返回true,属性不同返回false,返回false的时候存储 

import java.util.HashSet;import tan.jung.bean.Person;public class demo2_hashset {public static void main(String[] args) {HashSet<Person> hs =new HashSet<>();hs.add(new Person("张三",23));hs.add(new Person("张三",23));hs.add(new Person("张三",23));hs.add(new Person("李四",24));hs.add(new Person("李四",24));System.out.println(hs);  //需要重写equals和HashCode方法
        }}//第二个包
public class Person {private String name;private int 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 Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();// TODO Auto-generated constructor stub
    }@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}/*@Overridepublic boolean equals(Object obj) {System.out.println("执行了");Person p=(Person)obj;return this.name.equals(p.name) && this.age == p.age;  }@Overridepublic int hashCode() {final  int num=38;return name.hashCode() * num +age;}*/@Overridepublic int hashCode() {final int prime = 31; //31是一个质数,质数是能被1和自己本身整除的数 ,即不大也不小,比较好算,2的五次方-1,2向左移动五位int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)                 //调用的对象和传入的对象是同一个对象return true;          //直接返回rute    if (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;              //返回flasereturn true;                 //返回true
    }
}

LinkedHashset

特点:

  可以保证怎么存就怎么取

底层是连带实现的,是set集合中唯一一个能保证怎么存怎么取得集合对象

因为Hashset的子类,所以也是保证元素唯一的,与Hashset的原理一样

随机数

public class test1 {public static void main(String[] args) {//创建Random类创建随机数对象Random r1=new Random();//不能重复,需要用Hashset方法HashSet<Integer> hs1=new HashSet<>();//hashset的size是下雨10就可以不断存储,如果大于等于10就停止存储while (hs1.size()<10) {//通过random类中的nextInt(n)方法获取1到20之间的随机数,并将这些随机数存现在hashset集合中hs1.add(r1.nextInt(21));}//遍历Hashsetfor (Integer integer : hs1) {System.out.println(integer);}}

练习题

键盘输入,去掉重复

import java.util.HashSet;
import java.util.Scanner;import javax.sound.sampled.Line;public class test2 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入");    //创建Hashset独享,将字符存储,去掉重复HashSet<Character> hs1 =new HashSet<>();//将字符串转换成字符数组,获取每一个字符存储在Hashset集合中,自动去除重复String line=sc.nextLine();    char[] arr=line.toCharArray();for (char c : arr) { //遍历字符数组
            hs1.add(c);}//遍历Hashset,打印每一个字符for(Character ch:hs1){System.out.println(ch);}}}

练习题

去除集合中的重复

import java.util.ArrayList;
import java.util.LinkedHashSet;public class test3 {public static void main(String[] args) {ArrayList<String> list=new ArrayList<>();list.add("a");list.add("a");list.add("a");list.add("a");list.add("b");list.add("b");list.add("c");getSingle(list);    //调用方法
                System.out.println(list);}public static void getSingle(ArrayList<String> list) {LinkedHashSet<String> lsh=new LinkedHashSet<>();lsh.addAll(list); //添加list元素
        list.clear();        //清除list元素
        list.addAll(lsh);    //将LinkedHashset集合中的元素添加会list集合中
    }}

练习题

TreeSet

Treeset存储Integer类型的元素并遍历

import java.util.TreeSet;public class demo4_TreeSet {//TreeSet集合是用来对对象元素进行排序的,同事也可以保证元素的唯一public static void main(String[] args) {TreeSet<Integer> ts1=new TreeSet<>();ts1.add(1);ts1.add(1);ts1.add(2);ts1.add(2);ts1.add(3);ts1.add(3);ts1.add(3);ts1.add(4);ts1.add(4);System.out.println(ts1);}}

案例

TreeSet存储自定义对象

二叉数:两个叉

小的存储在左边(负数),打的存储在右边(整数),相等就不存(0)

compareTo方法,在TreeSet集合如何存储元素取决于compareTo方法的返回值

返回0,集合中只有一个元素

返回负数集合会将存储的元素倒序

返回整数会怎么存怎么取

import java.util.Iterator;
import java.util.TreeSet;import tan.jung.bean.Person;/*当compareTo方法返回0的时候集合中只有一个元素*当compareTo方法返回整数的时候集合会怎么存就怎么取*当compareTo方法返回负数的时候集合会倒序存储* */
public class demo5_TreeSet {public static void main (String args[]){TreeSet<Person> ts1=new TreeSet<>();ts1.add(new Person("xx",20));ts1.add(new Person("hh",20));      ts1.add(new Person("nn",20));ts1.add(new Person("mm",20));Iterator<Person> it1=ts1.iterator();while (it1.hasNext()) {Person p1=it1.next();System.out.println(p1.getName()+"  "+p1.getAge());}//System.out.println(ts1);
    }}//第二个包
public class Person implements Comparable<Person>{private String name;private int 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 Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();// TODO Auto-generated constructor stub
    }@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}/*@Overridepublic boolean equals(Object obj) {System.out.println("执行了");Person p=(Person)obj;return this.name.equals(p.name) && this.age == p.age;  }@Overridepublic int hashCode() {final  int num=38;return name.hashCode() * num +age;}*/@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic int compareTo(Person o) {return -1;}
}

案例

按照姓名排序

按照年龄排序

import java.util.Iterator;
import java.util.TreeSet;import tan.jung.bean.Person;/*当compareTo方法返回0的时候集合中只有一个元素*当compareTo方法返回整数的时候集合会怎么存就怎么取*当compareTo方法返回负数的时候集合会倒序存储* */
public class demo5_TreeSet {public static void main (String args[]){//demo1();TreeSet<Person> ts1=new TreeSet<>();ts1.add(new Person("张三",20));ts1.add(new Person("李四",12));      ts1.add(new Person("王五",25));ts1.add(new Person("赵六",11));ts1.add(new Person("七七",11));System.out.println('张'+0);System.out.println('李'+0);System.out.println('王'+0);System.out.println('赵'+0);System.out.println('七'+0);Iterator<Person> it1=ts1.iterator();while (it1.hasNext()) {Person p1=it1.next();System.out.println(p1.getName()+"  "+p1.getAge());}}public static void demo1() {TreeSet<Person> ts1=new TreeSet<>();ts1.add(new Person("xx",20));ts1.add(new Person("hh",12));      ts1.add(new Person("nn",25));ts1.add(new Person("mm",11));ts1.add(new Person("ss",11));Iterator<Person> it1=ts1.iterator();while (it1.hasNext()) {Person p1=it1.next();System.out.println(p1.getName()+"  "+p1.getAge());}}}//第二个包
import java.awt.RenderingHints;public class Person implements Comparable<Person>{private String name;private int 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 Person(String name, int age) {super();this.name = name;this.age = age;}public Person() {super();// TODO Auto-generated constructor stub
    }@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}/*@Overridepublic boolean equals(Object obj) {System.out.println("执行了");Person p=(Person)obj;return this.name.equals(p.name) && this.age == p.age;  }@Overridepublic int hashCode() {final  int num=38;return name.hashCode() * num +age;}*/@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}/*@Overridepublic int compareTo(Person o) {int num =this.age-o.age;  //年龄是主要条件return num==0 ? this.name.compareTo(o.name) : num;}*/@Overridepublic int compareTo(Person o) {int num=this.name.compareTo(o.name); int num2=this.age-o.age;//姓名是主要条件return num==0 ? num2 :num;}}

案例

按照姓名长度排序

public int compareTo(Person o) {int length =this.name.length() - o.name.length();  //比较长度为主要条件int num =length == 0? this.name.compareTo(o.name) :length;//比较内容为次要条件//如果length等于0的话就比较this.name.compareTo(o.name) ,compare比较内容//如果不等于0的话就比较lengthreturn num ==0 ? this.age-o.age :num; //比较年龄为次要条件}

方法

接口不能直接new 需要给子类对象

public class demo5_TreeSet {public static void main (String args[]){  //demo1();//demo2();//demo3();TreeSet<String> ts1=new TreeSet<>(new CompareByLen());       //compare c=new CompareByLen();ts1.add("abccd");ts1.add("z");ts1.add("bb");ts1.add("sss");System.out.println(ts1);}
}class CompareByLen implements Comparator<String>{@Overridepublic int compare(String s1, String s2) { //按照字符串的长度比较int num =s1.length() -s2.length();        //长度为主要条件return num == 0 ?s1.compareTo(s2) : num ; //内容为次要条件
    }}

案例

TreeSet原理

特点:

  TreeSet是用来排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排列

使用方式:

  1.自然排序(Comparable)

    TreeSet类的add()方法中会把存入的对象提升为Comparable类型

    调用对象的compareTo()方法和集合中的对象比较

    根据compareTo()方法返回结果进行存储

  2.比较器顺序(Comparator)

    创建TreeSet的时候可以制定一个Comparatpr

    如果传入了Comparator的子类对象,那么TreeSet就会按照比较器中的顺序排序

    add()犯法内部会自动调用Comparator接口中compare()方法排序

    调用的对象是compare()方法的第一个参数,集合中的对象是compare方法的第二个参数

  3.两种方式区别:

    TreeSet构造函数什么都不传,默认按照类中Comparable的顺序(没有就报错ClassCasException)

    TreeSet如果传入了Comparator,就优先按照Comparator

转载于:https://www.cnblogs.com/JungTan0113/p/10930675.html

2019-05-27 Java学习日记 day17相关推荐

  1. Java学习日记:UI篇(6)--谢尔宾斯基地毯图

    Java学习日记:UI篇(6)–谢尔宾斯基地毯图 引言:谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构 ...

  2. Java学习日记1——基础认知

    Java学习日记1--基础认知 学习Java阶段,如果发现不正确的描述,还请指正! 首先附上Java相关下载链接和配置教程链接 Java相关软件工具下载地址:官方下载 Java环境配置(win10配置 ...

  3. Java学习日记-Day01

    Java学习日记-Day01 Java语言概述 比特(byte)与字节 内存 Java基础知识图解 人机交互方式 常用的DOS命令 常用快捷键 计算机编程语言介绍 第一代语言 第二代语言 第三代语言 ...

  4. 尚学堂Java学习日记Day3

    尚学堂Java学习日记Day3 第三天老师先回顾了昨天的内容我从回顾中掌握了新的知识 如下图所示 int与double计算,输出类型为double的不同结果 会把int转成double类型的,这是隐式 ...

  5. 【日记】Java学习日记(第63天)持续无聊更新

    前言 Youtube上EJ Media(up主)的视频我依次学完了HTML.CSS.Javascript.Jquery.觉得他教得挺好的(短小精悍),就继续学他教的JAVA.感觉EJ教的都是些语法什么 ...

  6. 尚学堂Java学习日记Day1

    尚学堂学习日记Day1 #今天开始写学习博客记录自己学习java的点滴成长历程,希望能成为学弟学妹们的前车之鉴. 先大概的自我介绍下,我原本从事的是网络工程师,学习的是Cisco(思科)并拥有CCNP ...

  7. Java学习日记8:文件上传工具类的实现和服务器给客户端发送图片

    文件上传的工具类: 每次文件上传要写很多东西,把这些封装成一个工具类,以后用起来就会方便很多. 先创建一个类存储上传文件的信息: package com.upload; /*** 每上传成功一个文件的 ...

  8. 黑马程序员--Java学习日记之网络编程

     ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.网络编程概述 1.计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及 ...

  9. 2019年新版Java学习路线图(内含大纲+视频+工具+书籍+面试)

    一.2019新版Java学习路线图---每阶段市场价值及可解决的问题 二.2019新版Java学习路线图---学习大纲及各阶段知识点 三.2019新版Java学习路线图---升级后新增知识点一览 四. ...

最新文章

  1. 硅谷封面|美国人要小心了!亚马逊正在监控他们的一举一动
  2. Python 列表的应用场景有哪些?你使用对了吗?
  3. Cisco Packet Tracer7.0的安装汉化与使用
  4. [云炬python3玩转机器学习] 5-3简单线性回归的实现
  5. Android开发:自定义GridView/ListView数据源
  6. java中的Sort函数,你值得看
  7. 将参数传递给Bash函数
  8. 洛谷 [P1387] 最大正方形
  9. centos7修改命令行或图形界面启动模式
  10. Atitit nlp文本挖掘和自然语言处理方面,常用的算法总结 比如tf-idf 目录 1.1. tf:词频,是指某个词在某篇文章中出现的频率 2 1.2. 去停用词算法 2 1.3. idf。
  11. 工业机器人技术基础与应用分析及编程基础
  12. win10系统下摄像头无法打开的解决方法
  13. GPS GLONASS数据文件类型解析
  14. uml的用例图中扩展关系与包含关系
  15. SDN控制器Floodlight源码学习(五)--控制器和交换机交互(3)
  16. 《大象--Thinking in UML 第二版》已于近日在当当首发,同时邀请各位加入新浪微博[大象-thinkinginUml群]:http://q.weibo.com/1483929
  17. 【Cadence17.2】Padstack Editor制作焊盘和过孔
  18. 不花钱 三分钟就可以搭建商城的详细步骤
  19. 手机病毒肆虐:恶意软件每天获取超3000美元收益
  20. 【滤波】基于最近邻算法实现多目标航迹关联附matlab代码

热门文章

  1. python每隔几秒执行一次_Python设置程序等待时间
  2. P5712 【深基3.例4】Apples(python3实现)
  3. 1.9编程基础之顺序查找 05 最大值和最小值的差
  4. 2017年最新的全国省市sql数据
  5. STM32H743+CubeMX-学习FDCAN控制器上的TxFIFO
  6. STM32学习之总线与时钟
  7. WebSocket之仿QQWeb即时聊天系统(上)
  8. 前端笔记-vue cli中使用router-link进行路由跳转
  9. C++设计模式-继承与多态影响耦合性(最基础的简单工厂模式小实例)
  10. Qt文档阅读笔记-easingCurve:QEasingCurve官方解析及实例