`

Java容器

 
阅读更多

Set    一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

数学概念集合:一定范围的,确定的,可以区别的事物,当作一个整体来看待,就叫做集合,简称集,其中各事物叫做集合的元素或简称元。

 

HashSet

 

@Test
    public void testFor() {
        Set<String> sets = new HashSet<String>();
        sets.add("1");
        sets.add("2");
        sets.add("3");
        sets.add("4");
        sets.add("5");
        for (String str : sets) {
            System.out.println(str);
        }
        // s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
    }

 这段代码到输出顺序是:3,2,1,5,4。而且输出顺序有固定的,也就是说String的HashCode是和它的值一一映射的,而且不好整顺序。

 

@Test
    public void testFor2() {
        Set<Integer> sets2 = new HashSet<Integer>();
        sets2.add(1);
        sets2.add(2);
        sets2.add(3);
        sets2.add(4);
        sets2.add(5);
        for (Integer i : sets2) {
            System.out.println(i);
        }
        // value
    }@Test
    public void testFor3() {
        Set<Integer> sets3 = new HashSet<Integer>();
        sets3.add(5);
        sets3.add(4);
        sets3.add(3);
        sets3.add(2);
        sets3.add(1);
        for (Integer i : sets3) {
            System.out.println(i);
        }
        // value
    }

 这两段代码的输出一样的顺序:1,2,3,4,5。原因在与Integer的HashCode是该整型常量的值。

 

 

@Test
    public void testFor4() {
        Set<User> users = new HashSet<User>();
        User user1 = new User();
        user1.setId("user1");
        users.add(user1);
        
        User user2 = new User();
        user2.setId("user2");
        users.add(user2);
        
        for (User user : users) {
            System.out.println(user.getId());
            System.out.println(user.hashCode());
        }
        // public native int hashCode();
    }
 

 

这段代码的输出顺序不固定,User的HaseCode每次执行都在变化,HashCode是由本地代码提供的,它的值和对象的内存地址有关系。

 

从上面几段代码可以得出结论:HashSet的存储顺序由Hash值的大小决定。

 

Java语言规范规定如下:

 

  1. 两个对象equals(),hashCode()值相同
  2. 两个对象不equals(),hashCode()可以相等,如果hashCode()不相等,可以提高Hash查找的性能。

 

下面的代码是合法的,但是Hash查找的性能等于ListList查找的性能。

 

@Override
public int hashCode() {
    return 42;
}

 

 hashCode简单的实现方法:

  1. 确定整型散列码
  2. 域是boolean类型,计算(f ? 0 : 1)
  3. 域是byte,char,short,int,计算int()f
  4. 域是long,计算(int)(f ^ ( f >>> 32))
  5. Why
  6. 域是float,计算Float.floatToIntBits(f)
  7. 域是double,计算Double.doubleToLongBits(f),GoTo long
  8. 域是对象,调用hashCode()
  9. 域是null,返回0

确定了以上的属性hashCode

 

@Override
public int hashCode() {
        int result = 17;
        result = 31 * result + code1;
        result = 31 * result + code2;
        result = 31 * result + code3;
        return result;
}

 

 17是随意选的,选择31的原因是:

  1. 31即使乘法溢出,信息仍然可以保持
  2. VM优化,31 * i = (i << 5) – i 

TreeSet

<!-- Generated by javadoc (build 1.6.0-beta2) on Thu Jan 11 21:34:52 CST 2007 -->

<script type="text/javascript"></script>

<noscript></noscript>

 

分享到:
评论

相关推荐

    Java容器详解

    1.什么是容器在Java当中,有一个类专门用来存放其它类的对象,这个类就叫做容器,它就是将若干性质相同或相近的类对象组合在一起而形成的一个整体。2.常用的Java1.List有序的collection(也称为序列)。此接口的用户...

    java容器详细解析

    Java容器详细解析 Java容器是一种基本的数据结构,用于存储和管理对象。Java容器主要分为两大类:Collection和Map。 Collection Collection是一个独立元素的序列,这些元素都服从一条或多条规则。Collection接口...

    Java容器总结

    在IT领域,Java容器是一个非常重要的概念,尤其对于软件开发者来说,它们是理解和构建高效、可扩展的应用程序的关键。本文将深入探讨Java容器,并结合标签“源码”和“工具”,从源码层面和实用工具角度来分析这些...

    java容器类知识点详细总结

    容器接口是 Java 容器类的基础,使用接口可以将容器的实现与容器接口分开,因而可以使用相同的方法访问容器而不需关心容器具体的数据结构。常用的容器接口有 Collection、Map 和 Iterator。 Collection 接口 ...

    JAVA容器讲解.pdf

    Java容器讲解PPT,Collection Map(HashMap TreeMap LinkedHashMap) List (ArrayList LinkedList Vector) Set (HashSet TreeSet LinkedHashSet)

    java容器超详细

    Java容器,也被称为Java集合框架(Java Collection Framework, JCF),是Java编程语言中的核心组件之一,它为开发者提供了一套高效、灵活的数据结构和算法,用于存储、管理和操作对象。这一框架包括了多种不同类型的...

    JAVA容器总结

    后缀为.mmap的思维导图,总结了JAVA容器的常见类

    Java容器类学习心得体会

    Java容器类是Java编程语言中用于存储和管理对象集合的核心组成部分,包括Collection和Map两大接口体系。Collection接口主要包括List、Set以及其各自的实现类,如ArrayList、LinkedList、HashSet、TreeSet等。Map接口...

    java容器

    Java容器是Java编程中一个非常重要的概念,它主要用于管理和组织对象。在Java中,容器可以是集合、框架或服务提供者等,它们为其他对象提供存储、管理以及生命周期控制等功能。容器广泛应用于企业级开发,尤其是在...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...

    JAVA容器对象整理

    这篇博客"JAVA容器对象整理"可能涵盖了关于Java中的不同容器类、接口以及它们的使用方式。在这里,我们将深入探讨一些核心的Java容器知识点。 1. **ArrayList与LinkedList** - `ArrayList`是一个基于数组实现的...

    基础深化和提高-java容器

    Java容器提供了一种统一的方式来组织和管理多个对象,使得开发者能够更加方便地对这些对象进行操作和处理。 Java容器主要分为两大类:Collection 和 Map。 Collection: Collection表示一组对象,它的主要子接口...

    java容器学习心得

    ### Java容器学习心得详解 在Java编程中,容器(Containers)是存储和操作对象集合的重要工具,主要包括集合(Collections)和映射(Maps)。本文将深入解析Java容器的关键概念、特性以及不同容器类型的应用场景。 ...

    Java容器起源

    ### Java容器起源与JSP容器背景解析 #### 容器技术概述 容器技术在现代IT领域扮演着极其重要的角色,特别是在云计算和微服务架构中。本文将深入探讨容器技术的起源,尤其是针对Java环境中JSP容器的发展历程及其...

    docker-java:Java容器

    docker-java Java 容器 Versions: 7, 8 每个版本都有自己的分支。

Global site tag (gtag.js) - Google Analytics