`
jsycbc
  • 浏览: 8209 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

set,HashMap,List重复初步探索

 
阅读更多
             
Set:
               Set<String> set = new HashSet<String>();
                set.add("a");
                set.add("b");
                set.add("b");
                set.add("a");
                System.out.println("set.size = " + set.size());
                for (Iterator<String> it = set.iterator(); it.hasNext  ();) {
                        String str = (String) it.next();
                        System.out.println("str=" + str);
                }

结果:
set.size = 2
str=b
str=a
           
  
HashMap:              
                Map<String,String> map = new HashMap<String,String>();
                map.put("a", "1");
                map.put("b", "2)");
                map.put("a", "3");
                map.put("b", "4");
                for(Iterator<String> it = map.keySet().iterator(); it.hasNext();) {
                        String key = (String)it.next();
                        String value = (String)map.get(key);
                        System.out.println("key = " + key + " value = " + value);
                }
          

结果:
key = b value = 4
key = a value = 3


  
 
List:
                List<String> list = new ArrayList<String>();
                list.add("a");
                list.add("b");
                list.add("b");
                list.add("a");
                for(int i = 0; i < list.size(); i++) {
                        System.out.println("list[" + i +"] = " + list.get(i));
                }

结果:                       
list[0] = a
list[1] = b
list[2] = b
list[3] = a

由此得出结论,只有List是可以有重复元素的,Map以及Set都不可以有重复元素。
欢迎讨论指正。
另附一篇引用文章如下:
关于hashCode与equals方法的说明:

1)对于一个程序的一次执行过程中,同一个对象的hashCode计算的结果一定相同,但是对于同一个程序的不同执行过程中,不要求其hashCode一定相同。

2)对于两个对象,如果使用equals方法比较,结果为true,那么这两个对象的hashCode值一定相同

3)对于两个对象,如果使用equals方法比较,结果为false,那么这两个对象的hashCode值不要求一定不同(但是如果不同可以提高程序性能)



当我们向HashSet中add对象,它首先调用它的HashCode方法,得到这个HashCode的返回整数值,这个整数值就会映射到set里面的某一个位置。如果这个对象里没有对象存在,就把这个对象直接放发哦set里面;如果这个位置已经有对象存在了,这个时候就用equals方法比较这两个方法,如果比较结果相同,就不进行插入。比如下面问题



Set set = new HashSet();

set.add("zhangsan");

set.add("lisi");

set.add("wangwu");

set.add("zhangsan");

这个最后一个set.add("zhangsan");是无法插入成功的,因为String重写了Object的equlas和HashCode方法,按照String的HashCode方法,相同的字符串的HashCode一定是一样的

下面详细分析最后一个set.add("zhangsan")具体插入过程

1.首先根据"zhangsan"调用HashCode方法,获得一个返回值

2.Set根据这个返回值获得一个位置

3.查找这个位置上是否有对象,结果发现有一个对象。值也是“zhangsan”

4.对两个对象调用equals方法,由于String重写了equals方法,这个方法返回true。

所以最后插入失败。



再看下面这个例子

People p1 = new People("zhangsan");

People p2 = new People("lisi");

People p3 = new People("wangwu");

People p4 = new People("zhangsan");

People p5 = new People("zhangsan");



set.add(p1);

set.add(p2);

set.add(p3);

set.add(p4);

set.add(p5);



由于People 继承自Object类,且没有重写equals和HashCode方法,而object的HashCode方法每个不同对象的返回值都是不同的,所以第一步查找插入位置的时候各个对象的位置就不一样,所以一定可以插入进去。



Object类的HashCode实际上根据对象的地址生成的,所以不同对象的HashCode必然不一样,但是String的HashCode是根据字符串的内容和大小生成的,所以相同字符串的HashCode是一样的。





HashSet和HashMap

1. HashSet底层采用HashMap实现

HashMap内部是无序的,取出的顺序和放入的顺序没有关系。java提供了TreeMap是有序的。



2. 这个HashMap的key就是放进HashSet中的对象,而value就是一个Object类型的对象,这个value我们不关心它到底是什么,事实上这是一个随意生成的object对象。



3. 当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet中增加的那个对象,该行的value就是一个Object类型的常量



4. HashMap底层采用数组维护,这个数组中每个元素实际上又是一个单链表,拥有相同HashCode值的key对应的键值对就放在这个单链表中。

当调用add方法,首先根据这个key的HashCode方法算出一个int值,这个int对应到数组的一个位置,由于可能会有不同的key有相同的HashCode值,所以这个位置上存放的是一个链表。然后这个新加进来的key会和这个链表中的每个元素的key调用equals方法进行比较。如果返回true,就用这个新的键值对替换掉链表中原来那个老的键值对。如果找到最后都没有返回true,就把这个新的键值对添加到链表的头。(之所以不添加到链表的尾是为了提高检索效率,新添加的数据被检索的可能性要高。)



5. 调用增加的那个对象的hashCode方法,来得到一个hashCode值,然后根据该值计算出一个数组的下表索引(计算出数组中的一个位置)



6. 将准备增加到Map中的对象与该位置上的对象进行比较(equals方法),如果相同,那么就将该位置上的那个对象(Entry类型)的value值替换掉;否则,沿着该Entry的链继续重复上述过程,如果到链的最后依然没有找到与此对象相同的对象,那么这个时候就会将该对象增加到数组中,然后将数组中该位置上的那个对象链到这个新对象的后面。



7. 对于HashSet,HashMap来说,这样做的原因就是为了提高查找的速度,使得查找时间不随Set或者Map的大小而改变。
1
1
分享到:
评论

相关推荐

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...

    51. ArrayList LinkedList Set HashMap介绍.txt

    `Set` 接口代表一个不允许重复元素的集合。Java 中有多种 `Set` 的实现类,如 `HashSet` 和 `TreeSet`。 #### 实现类介绍 - **HashSet**:基于哈希表实现,提供高效的元素插入、删除和查找操作。元素无序,不能保证...

    set.list.map接口

    在Java编程语言中,集合框架是处理对象的重要工具,其中包括Set、List和Map三大接口。这些接口提供了多种数据结构和操作方法,使得开发者能够高效地组织和管理数据。 1. **Set接口**: Set接口表示一个不包含重复...

    集合概述set、List、Map

    ### 集合概述:set、List、Map #### 一、集合框架概述 ##### 1.1.1 容器简介 在Java编程中,集合框架是一个非常重要的概念,它提供了一种灵活的方式来存储、操作和管理不同类型的对象集合。集合框架的主要目标是...

    set,list,map区别与联系

    ### set、list、map的区别与联系 #### 一、概述 在Java编程语言中,`set`、`list`和`map`是非常重要的数据结构,它们分别代表了不同的集合类型,各自有着独特的特性与用途。 - **List**:有序集合,可以包含重复...

    Set用法及与List的区别

    1. **数据存储**:List允许元素重复,而Set不允许。List中的元素有顺序,可以通过索引访问,而Set中的元素没有固定的顺序。 2. **插入与查找效率**:由于Set基于哈希表,通常查找和插入操作比List快。List的插入和...

    Set-List-Map.rar_DEMO_list set map

    在Java编程语言中,集合框架是处理对象组的重要工具,主要包括`List`、`Set`和`Map`接口。这些接口及其实现类提供了丰富的功能,适用于各种数据存储和操作需求。`Set-List-Map.rar_DEMO_list set map`这个压缩包文件...

    list,set,map,数组间的相互转换

    将数组转换为`Set`的操作类似于将`List`转换为`Set`,因为`Set`不允许重复元素,所以转换过程中会自动去除重复项。 **示例代码:** ```java import java.util.Arrays; import java.util.HashSet; import java.util...

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别

    List、ArrayList、Vector及map、HashTable、HashMap分别的区别 List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List...

    Java中的Set,List,Map的区别.pdf

    Java中的集合框架是编程中非常重要的部分,它提供了一种...Set适合存储不重复元素,List适合存储有序并可能重复的元素,而Map则用于存储键值对应的数据。理解它们的特性和使用场景,有助于在编程中选择合适的集合类型。

    Set,List,Map的区别

    ### Set,List,Map 的区别与应用 在 Java 编程语言中,集合框架是一个非常重要的概念,它提供了存储和操作对象的方式。集合框架主要包括三种类型的集合:`Set`、`List` 和 `Map`。这三种集合各自拥有独特的特性和...

    List,set,Map 的用法和区别

    Java 集合框架中 List、Set、Map 的用法和区别 Java 集合框架(Java Collections Framework)是 Java 语言中的一个重要组件,提供了一些基本的数据结构和算法来操作和存储数据。其中,List、Set、Map 是三个非常...

    Collection,List,Set和_Map用法和区别

    Collection, List, Set 和 Map 用法和区别 Collection 是 Java 中的一种对象集合,提供了许多有用的方法来操作集合元素,例如添加、删除、遍历等。Collection 是一个接口,下面有两个子接口:List 和 Set。 List ...

    Java集合Collection、List、Set、Map使用详解

    ### Java集合Collection、List、Set、Map使用详解 #### 1. 集合框架概述 集合框架是Java编程语言中最基本且最重要的组成部分之一。它提供了处理数据集合的强大工具,这些工具不仅支持基本操作(如添加、删除和查找...

    hashmap 集合

    其中,Map接口不同于Set和List,因为它不存储重复元素,而是通过键来唯一标识每个值。HashMap就是实现Map接口的一个具体类,允许null键和null值,并且提供了快速的插入、删除和查找操作。 HashMap的工作原理基于...

    Collection List Set Map 区别记忆

    3. 重复性:`List`允许重复元素,`Set`不允许,`Map`的键(key)不允许重复,但值(value)可以重复。 4. 排序:`List`可以通过索引保持元素顺序,`Set`中的元素通常无序,但`TreeSet`可以按特定顺序排列;`Map`的`...

    List Set Map以及子类的比较 .docx

    Collection 集合框架的顶级接口是 Collection,下面有三个主要的子接口:List、Set 和 Map。 List 集合是一种有序集合,可以存储重复元素,每个元素都有索引。ArrayList 和 LinkedList 是 List 集合的两个常用的...

    java中list、set和map 的区别

    ### Java中List、Set和Map的区别 在Java编程语言中,`List`、`Set`和`Map`是集合框架中的三个核心接口,它们分别代表了不同类型的集合数据结构,各自有着独特的特性和应用场景。 #### List `List`接口是最常用的...

    java中三种集合set、map、list的区别与联系

    - **`List`与`Set`**:`List`与`Set`最大的不同在于`List`允许重复元素,并且保持元素的插入顺序。`Set`则确保元素唯一,不关心元素的插入顺序。 在选择使用哪种集合时,应考虑以下因素: - **数据是否需要唯一性**...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    ArrayList和LinkedList虽然不是Set,但它们的父接口List属于Collection,而Collection接口有一个子接口Set,例如HashSet是Set接口的一个实现,它内部基于HashMap实现,保证元素唯一性。 7. WeakHashMap WeakHashMap...

Global site tag (gtag.js) - Google Analytics