精华内容
下载资源
问答
  • java为什么吗list允许存储重复元素,而set允许存储重复元素
  • Set集合允许存储重复元素原理

    千次阅读 2020-06-22 20:46:38
    Set集合允许存储重复元素原理 package com.Set; import java.util.HashSet; /* Set集合允许存储重复元素原理 */ public class Demo02HashSetSaveString { public static void main(String[] args) { //创建...

    Set集合不允许存储重复元素原理

    package com.Set;
    
    import java.util.HashSet;
    /*
        Set集合不允许存储重复元素原理
     */
    public class Demo02HashSetSaveString {
        public static void main(String[] args) {
            //创建HashSet集合对象
            HashSet<String> set = new HashSet<>();
            String s1 = new String("abc");
            String s2 = new String("abc");
            set.add(s1);
            set.add(s2);
            set.add("重地");
            set.add("通话");
            set.add("abc");
            System.out.println(set);  //[重地, 通话, abc]
        }
    }
    

    01:Set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复。

    1. set.add(s1);
      add方法会调用s1的hashCode方法,计算字符串“abc”的哈希值,哈希值是96354
      在集合中找有没有96354这个哈希值的元素,发现没有
      就会把s1存储在集合中
    2. set.add(s2);
      add方法会调用s2的hashCode方法,计算字符串“abc”的哈希值,哈希值是96354
      在集合中找有没有96354这个哈希值的元素,发现有(哈希冲突) s2会调用equals方法和哈希值相同的元素进行比较
      s2.equals(s1),返回true 两个元素的哈希值相同,equals方法返回true,认定两个元素相同
      就不会把s2存储到集合中
    3. set.add(“重地”);
      add方法会调用"重地"的hashCode方法,计算字符串"重地"的哈希值,哈希值是1179395
      在集合中找有没有1179395这个哈希值的元素,发现没有
      就会把"重地"存储在集合中
    4. set.add(“通话”);
      add方法会调用"通话"的hashCode方法,计算字符串"通话"的哈希值,哈希值是1179395
      在集合中找有没有"通话"这个哈希值的元素,发现有(哈希冲突)
      “通话"会调用equals方法和哈希值相同的元素进行比较"通话”.equals"重地"),返回false
      两个元素的哈希值相同,equals方法返回false,认定两个元素不同
      就把"通话"存储到集合中

    02:Set集合存储不重复的元素
    前提:存储的元素必须重写hashCode方法和equals方法
    在这里插入图片描述

    展开全文
  • 原理hashSet底层是基于HashMap 来实现存储的,而set的 add方法其实调用的是map的put方法:继续探究map的put方法看其实如何实现存储不重复元素的 :可以看到在遍历table中的元素判断键和值,1,如果hash码值相同,...

    为了一探究竟我建议先上源码(以set的add方法为例)如下所示:

    原理hashSet底层是基于HashMap 来实现存储的,而set的 add方法其实调用的是map的put方法:

    继续探究map的put方法看其实如何实现存储不重复元素的 :

     

    可以看到在遍历table中的元素判断键和值, 
    1,如果hash码值不相同,说明是一个新元素,存储;

    如果没有元素和传入对象(也就是add的元素)的hash值相等,那么就认为这个元素在table中不存在,将其添加进table;

    2..1,如果hash码值相同,且equles判断相等,说明元素已经存在,不存;

    2..2,如果hash码值相同,且equles判断不相等,说明元素不存在,存;

    如果有元素和传入对象的hash值相等,那么,继续进行equles()判断,如果仍然相等,那么就认为传入元素已经存在,不再添加,结束,否则仍然添加;


    可见hashcode()和equles()在此显得很关键了,下面就来了解一下hashcode和equles这两个方法:

    首先要明确:只通过hash码值来判断两个对象时否相同合适吗?答案肯定是不合适的,因为存在两个元素的hash码值相同但是并不是同一个元素这样的情况;
    那么要问什么是hash码值? 
    在java中存在一种hash表结构,它通过一个算法,计算出的结果就是hash码值;这个算法叫hash算法; 
    hash算法是怎么计算的呢? 
    是通过对象中的成员来计算出来的结果; 
    如果成员变量是基本数据类型的值, 那么用这个值 直接参与计算; 
    如果成员变量是引用数据类型的值,那么获取到这个成员变量的哈希码值后,再参数计算

    如:新建一个Person对象,重写hashCode方法

    public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }

    可以看出,Person对象内两个参数name,age,hash码值是这两者计算后的记过,那么完全有可能两个对象name,age都不同,hash码值相同; 
    下面看下equles()方法:

    public 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;
        }

    equles方法内部是分别对name,age进行判断,是否相等。

    因此在hashSet的add方法添加元素时,仅仅依靠hash值判断是否存在是不完全的 还要依靠equals方法。

    如有披露或问题欢迎留言或者入群探讨

    展开全文
  • 使用C++类模板实现的二叉搜索树。 拥有极快的插入删除、查找能力,是折半查找的高级应用。 使用std::list双向链表实现可重复存储元素。 对于学习二叉树有很大的帮助。
  • 要点:set集合存储元素不重复的元素前提:存储的元素必须重写hashCode方法和equals方法。 example: //创建HashSet集合对象 HashSet<String> set = new HashSet<>(); String s1 = new String( ...

    要点:set集合存储元素不重复的元素前提:存储的元素必须重写hashCode方法和equals方法。

    example:

    //创建HashSet集合对象
    HashSet<String> set = new HashSet<>();
    String s1 = new String( original: "abc");
    String s2 = new String( original: "abc");
    set.add(s1);
    set.add(s2);
    set.add("重地");
    set.add("通话");
    set.add("abc");
    System.out.println(set);//[重地,通话,abc]
    

    注意:Set集合在调用add方法的时候add方法会调用元素的hashCode方法和equals方法判断元素是否重复

    set.add(s1);
    add方法会调用s1的hashCode方法计算字符串"abc"的哈希值,哈希值是96354,在集合中找有没有96354这个哈希值的元素,发现没有,就会把s1存储到集合中。
    set.add(s2);
    add方法会调用s2的hashCode方法计算字符串"abc"的哈希值,哈希值是96354,在集合中找有没有96354这个哈希值的元素,发现有(哈希冲突),s2会调用equals方法和哈希值相同的元素进行比较s2.equals(s1),返回true,两个元素的哈希值相同,equals方法返回true,认定两个元素相同,就不会把s2存储到集合中。

    set.add("重地");
    add方法会调用"重地"的hashCode方法计算字符串"重地"的哈希值,哈希值是1179395,在集合中找有没有1179395这个哈希值的元素,发现没有就会把"重地"存储到集合中。
    set.add("通话");
    add方法会调用"通话"的hashCode方法计算宇符串"通话"的哈希值,哈希值是1179395,在集合中找有没有1179395这个哈希值的元素,发现有(哈希冲突),“通话"会调用equals方法和哈希值相同的元素进行比较,"通话" .equals("重地"),返回false。两个元素的哈希值相同,equals方法返回false,认定两个元素不同,就会把“通话“存储到集合中。

     


     

    展开全文
  • Java for循环删除ArrayList重复元素陷阱,Iterator迭代器遍历删除重复元素这是一个一留神就犯下错误的Java列表ArrayList重复删除元素陷阱,并且问题比较隐蔽。问题描述,假设一个ArrayList存储若干个字符串String...
    Java for循环删除ArrayList重复元素陷阱,Iterator迭代器遍历删除重复元素

    这是一个一不留神就犯下错误的Java列表ArrayList重复删除元素陷阱,并且问题比较隐蔽。问题描述,假设一个ArrayList存储若干个字符串String元素,这些元素中存在若干重复的、一模一样的元素,编程实现把这些重复元素全部删除。
    常见的代码写法是for循环定点删除:
     ArrayList<String> mLists = new ArrayList<>();
    	        mLists.add("zhang");
    	        mLists.add("phil");
    	        mLists.add("csdn");
    	        mLists.add("csdn");
    	        mLists.add("csdn");
    
    	        for (int i = 0; i < mLists.size(); i++) {
    	            String s = mLists.get(i);
    	            if(s.equals("csdn"))
    	            	mLists.remove(i);
    	        }
    
    	        for(int i=0;i<mLists.size();i++){
    	            System.out.print(mLists.get(i)+" ");
    	        }

    运行输出:

    zhang phil csdn 
    这个例子中有5个字符串,其中“csdn”重复出现3次,代码本意是把这些重复3此的“csdn”字符串完全删除,结果还有参数,可见没有完全删除,原因是在于Java的ArrayList在删除元素时候,整个队列在动态变化,整个队列的index和长度均在变化中,所以在for循环中游标不准。

    正确的删除方法是使用Java迭代器Iterator进行删除。
    例如代码:
    ArrayList<String> mLists = new ArrayList<>();
    		mLists.add("zhang");
    		mLists.add("phil");
    		mLists.add("csdn");
    		mLists.add("csdn");
    		mLists.add("csdn");
    
    		Iterator<String> iterator = mLists.iterator();
    		while (iterator.hasNext()) {
    			String s = iterator.next();
    			if (s.equals("csdn")) {
    				iterator.remove();
    			}
    		}
    
    		for (int i = 0; i < mLists.size(); i++) {
    			String s = mLists.get(i);
    			System.out.print(s + " ");
    		}

    输出结果正确:
    zhang phil 


    展开全文
  • 且hashCode值不相等,判断两个元素不相等; 那么equals()方法和hashCode值不一致的情况呢? *上面的代码C对象 添加了一个有一个没有被添加进来,其余的都被添加进来了。 分析:  *第一种情况A对象,equals:...
  • M个元素中含有相同的元素,如何得到他们的全排列(不重复排列)? 元素表述: a1,a1,...a1, a2,a2,...a2,.....则可以证明不重复的排列种类的数目: M!/(N1!*N2!*...*Nn!)    就是将N个数字做全排列。不过对于
  • 重写后可以打印对象的属性内容 2.equals 原本Object的equals方法,是比较对象的地址是否相等(相当于==比较运算符) 重写后可以比较对象的属性内容 重写格式1 重写格式2 一般重写equals会习惯性同时重写hashCode ...
  • ③ 存储顺序和取出来的顺序一定一致存储重复的元素 可以利用②这一特点,完成去重的功能。 一:Set集合去掉List集合中重复元素 public static void main(String[] args) { //利用set集合 去除ArrayList集合中...
  • 问题描述:在由m个元素的source数组中,随机选择n个不重复元素放入新数组target 注:source数组元素本身不重复,m>n解决方案方案一: 根据数组source,在0到source.length-1范围内随机一个数作为下标,选择下标...
  • 其实一般情况下是允许存放重复元素的,但是它并非这么死板,在一些情况下是可以存放重复元素的,存了又会有引入其他问题。 问题二:能能存放null呢?正常情况下是能的,会报异常,但是经过一些处理后是可以的...
  • 第一个想到的是用hashmap存储元素,计算出现次数,然后遍历hashmap,输入值为1的元素。 但是后来发现不对,输出的是所有出现一次的元素,因为map是无序的,一定是第一个。怎么办? 在遍历数组,存入hashmap的...
  • List(列表):元素有序,元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。ArrayList:https://blog.csdn.net/houyanhua1/article/details/80494916Demo.java:package cn.xxx.demo; import java.util....
  • List删除重复元素

    千次阅读 2014-09-29 11:19:54
    ArrayList中常用到删除重复元素
  • 情景要求: (1)输入的数组元素为基本类型int。 (2)返回不含重复元素的数组,其类型为基本类型int。...方法一:重新开辟内存(创建list、set等),可以在原始数组中原地删除重复元素。 由于数组的长...
  • 删除排序链表中的重复元素

    千次阅读 2016-05-02 11:00:20
    题目描述:给定一个排序链表,删除所有重复元素每个元素只留下一个。 样例:给出 1->1->2->null,返回 1->2->null;给出 1->1->2->3->3->null,返回 1->2->3->null 遍历整个链表,同时存储遍历到的节点值,如果...
  • 存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复元素。例如(7,10,10,21,30,42,42,42,51,70)将变为(7,10,21,30,42,51,70)。 分析: 递增有序的线性表中,数值相同的...
  • C++vector容器类删除重复元素

    千次阅读 2019-05-28 22:34:14
    此处的删除,并是真的删除,而是指重复元素的位置被重复的元素给占领了,由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。 函数原型 unique有两个函数原型,分别为.....
  • 重复元素排列问题

    千次阅读 2017-04-10 15:51:07
    重复元素的排列问题 【问题描述】 设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn可能相同。试设计一个算法,列出R的所有不同排列。 【编程任务】 给定n 以及待排列的n 个元素。...
  • 如何存储元素,并保证不重复。这里可以使用HashSet来存储已经获取的随机出来的值,HashSet的作用就是能保证这里存储的值不会出现重复。 根据HashSet中已经存储的个数作为while循环的条件,来循环生成随机数。退出...
  • 删除线性表中的重复元素

    千次阅读 2017-02-27 17:32:05
    一、leetcode原题:删除已排序数组重复元素 先给出leetcode原题照片: 原题大意就是对于一个已经排好序的数组,删除重复元素。要求空间复杂度为O(1)。也就是能重新申请新的数组。 解题思路:对于已经排好序的...
  • javaSE Set集合,元素无序不重复

    千次阅读 2018-06-11 22:16:00
    基本类型需要自动装箱) 查看List(列表):元素有序,元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。 查看Set(集):元素无序,重复 (没有索引)。 遍历只能用Iterator迭代器和增强for, 能使用普通for...
  • Set集合重复元素的判断

    千次阅读 2018-06-14 08:44:06
    更重要的是Set集合能放置重复元素.她是怎么判断的呢?那么,我们首先要让对象具有比较性 一,存储的自定义对象实现接口 Comparable 复写public int compareTo()方法. 返回0表示二者相等. 如...
  • 找出数组中唯一的重复元素

    千次阅读 2016-06-26 20:49:30
    分析:由于题目要求每个数组元素只能访问一次,不用辅助存储空间,可以从原理上入手,采用数学求和法,因为只有一个数字重复一次,而数又是连续的,根据累加和原理,对数组的所有项求和,然后减去 1 至 N - 1 的和,...
  • 如何在Java的Map中存储重复键?

    千次阅读 2019-01-31 09:30:19
    在本教程中,我们将探讨用于处理具有重复键的Map的可用选项,或者换言之,允许为单个键存储多个值的Map。 2.标准Map Java有几个接口Map的实现,每个都有自己的特殊性。 但是,现有的Java核心Map实现都允许Map处理...
  • Java中的Map允许有重复元素吗?

    万次阅读 2018-06-22 14:37:05
    Java中常见的三个集合接口:List、Set、Map,已经知道List中是允许有重复元素的,而Set中是不允许有重复元素的,那么Map中允许有重复元素吗?查阅资料,发现是不可以的,因为map是无序的,它的查询需要通过key的值来...
  • 清除数组中的重复元素个数

    千次阅读 2016-11-04 20:19:42
    定义一个函数清除该数组的重复元素,返回的数组存储了那些非重复的元素而且数组不准浪费长度。 分析: 1. 确定新数组的长度。 原数组的长度-重复元素个数 import java.util.*; class Demo12 { public ...
  • 去掉数组中重复出现元素的算法

    万次阅读 2016-10-26 15:10:03
    该算法去掉进行数组中重复元素可以是字符串数组,也可以是数字数组
  • groovy找到数组里的重复元素的下标

    千次阅读 2015-06-22 10:51:26
    def haveRepetArray=[1,5,1,6,1,8,2,8,2,9,4,12] def findRepetition=[:]//找到重复的,重复的map值大于1重复的值等于1 def repetitionRes=[]//重复的结果 ... def arrElemIndex=[]//得到重复元素的下标 def m

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 396,206
精华内容 158,482
关键字:

不可以存储重复元素