• java之set接口


    1.set集合不能存储重复的元素,

    2.HashSet集合不能保证的迭代顺序与元素存储顺序相同。

    3.HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。

    4.hashset集合的存储结构为哈希表(实质上为数组机制的链式存储),在存储对象时,会调用对象的hashcode(),判断hash值是否一致,若一致则调用equals(),判断内容是否一致,不一致则进行存储从而保证了数据的唯一性。【自定义对象必须重写hashcode()和equals()方法】。

    如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。

    总结:保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。

    5.基本数据的包装类、引用数据类型;

     1 package com.oracle.demo01;
     2 
     3 import java.util.Iterator;
     4 import java.util.LinkedHashSet;
     5 
     6 public class Demo04 {
     7 public static void main(String[] args) {
     8     //仍不能存储重复元素,但有序有堆栈数据存储结构的效果
     9     LinkedHashSet<String> set=new LinkedHashSet<String>();
    10     set.add("a");
    11     set.add("b");
    12     set.add("c");
    13     set.add("a");
    14     //获取迭代器对象
    15     Iterator<String>  i=set.iterator();
    16     while(i.hasNext()){
    17         System.out.println(i.next());
    18     }
    19 }
    20 }

    6.存储自定义数据类型时,需要重写hashcode()和equals()

    自定义对象:成员属性、成员方法、有参构造、无参构造、get-set方法、tostring()、hashcode()、equals().

     1 package com.oracle.demo01;
     2 
     3 //自定义类型,存哈希
     4 public class Person {
     5     private String name;
     6     private int age;
     7 
     8     public String getName() {
     9         return name;
    10     }
    11 
    12     public void setName(String name) {
    13         this.name = name;
    14     }
    15 
    16     public int getAge() {
    17         return age;
    18     }
    19 
    20     public void setAge(int age) {
    21         this.age = age;
    22     }
    23 
    24     @Override
    25     public String toString() {
    26         return "Person [name=" + name + ", age=" + age + "]";
    27     }
    28 
    29     public Person(String name, int age) {
    30         super();
    31         this.name = name;
    32         this.age = age;
    33     }
    34 
    35     public Person() {
    36         super();
    37     }
    38 
    39     @Override // 输入hashcode alt+/
    40     //source   hashcode()
    41     public int hashCode() {
    42         // TODO Auto-generated method stub
    43         //乘以31,避免重复
    44         return name.hashCode() + age*31;//String类调用hashcode();  31  65  33
    45     }
    46 
    47     @Override
    48     public boolean equals(Object obj) {//此时obj为集合中原有的元素
    49         if(obj==this){
    50             return true;
    51         }
    52         if(obj==null){
    53             return false;
    54         }
    55         if(obj instanceof Person){
    56             Person p=(Person)obj;
    57             return this.name.equals(p.name)&&this.age==p.age;
    58         }
    59         // TODO Auto-generated method stub
    60         return false;
    61     }
    62 }

    添加对象,遍历对象

    linkedhashset:双向链表,保证存取有序,是链表和哈希表组成的一个数据存储结构。

     1 package com.oracle.demo01;
     2 
     3 import java.util.Iterator;
     4 import java.util.LinkedHashSet;
     5 
     6 public class Demo05 {
     7 public static void main(String[] args) {
     8     LinkedHashSet<Person>  p=new LinkedHashSet<Person>(); 
     9     p.add(new Person("阿布都",18));
    10     p.add(new Person("易建联",28));
    11     p.add(new Person("郭艾伦",38));
    12     p.add(new Person("郭艾伦",48));
    13     //迭代器迭代
    14     /*    public String toString() {
    15         return "Person [name=" + name + ", age=" + age + "]";
    16     }*/
    17     //迭代器
    18     Iterator<Person> pp=p.iterator();
    19     while(pp.hasNext()){
    20         System.out.println(pp.next());//重写的String toString()方法
    21     }
    22     //增强for循环
    23     for(Person ppp:p){
    24         System.out.println(ppp);
    25     }
    26 }
    27 }
  • 相关阅读:
    算法笔记_182:历届试题 核桃的数量(Java)
    算法笔记_181:历届试题 回文数字(Java)
    算法笔记_180:历届试题 国王的烦恼(Java)
    算法笔记_179:历届试题 数字游戏(Java)
    算法笔记_178:历届试题 邮局(Java)
    算法笔记_177:历届试题 城市建设(Java)
    算法笔记_176:历届试题 最大子阵(Java)
    算法笔记_175:历届试题 蚂蚁感冒(Java)
    redis集群与分片(2)-Redis Cluster集群的搭建与实践
    redis集群与分片(1)-redis服务器集群、客户端分片
  • 原文地址:https://www.cnblogs.com/mlf19920916/p/12147200.html
Copyright © 2020-2023  润新知