- 浏览: 200186 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
ouyangshixiong:
...
秒杀Eclipse查看Jar包源码乱码问题 -
cs6641468:
WatchKey都没有reset,第二次loop妥妥的捕获不到 ...
Java7 使用WatchService监听文件变化 -
ck_2036:
...
秒杀Eclipse查看Jar包源码乱码问题 -
asialee:
复杂对象就需要使用framedecorator了
Netty对象传输
Set 一个不包含重复元素的 collection。更正式地说,set 不包含满足 e1.equals(e2)
的元素对
e1
和 e2
,并且最多包含一个 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语言规范规定如下:
- 两个对象equals(),hashCode()值相同
- 两个对象不equals(),hashCode()可以相等,如果hashCode()不相等,可以提高Hash查找的性能。
下面的代码是合法的,但是Hash查找的性能等于ListList查找的性能。
@Override public int hashCode() { return 42; }
hashCode简单的实现方法:
- 确定整型散列码
- 域是boolean类型,计算(f ? 0 : 1)
- 域是byte,char,short,int,计算int()f
- 域是long,计算(int)(f ^ ( f >>> 32))
- Why
- 域是float,计算Float.floatToIntBits(f)
- 域是double,计算Double.doubleToLongBits(f),GoTo long
- 域是对象,调用hashCode()
- 域是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的原因是:
- 31即使乘法溢出,信息仍然可以保持
- 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>
发表评论
-
Netty对象传输
2013-03-06 15:45 3134转自:http://www.xiaoyaochong.ne ... -
Java ArrayBlockingQueue源码解析
2013-03-01 17:43 4807转自:http://www.xiaoyaoch ... -
Eclipse常用快捷键
2013-03-01 15:10 960Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ct ... -
Java7 TransferQueue入门实例
2013-03-01 10:10 2667转自:http://www.xiaoyaochong.ne ... -
Java7 使用WatchService监听文件变化
2013-02-26 13:56 8952Watch service 用来观察被注册了的对象的变化和 ... -
Java7 AutoCloseable入门实例
2013-02-26 10:03 5016本文转自:http://www.xiaoyaochong. ... -
Java7 ForkJoin入门实例
2013-02-19 10:37 10011本文转自:http://www.xiaoyaochong. ... -
Java原子变量与ABA问题(转发)
2013-01-07 23:12 4380原文地址:http://www.xiaoyaochong.ne ... -
Java简单迭代器例子
2013-01-04 14:18 3854一直好奇Foreach的语法,想ArrayList和HashM ... -
Java NIO实例
2012-12-28 09:48 1536一个可运行的简单NIO实例,首先是一个抽象的服务端类Abstr ... -
Java NIO选择器Selector
2012-12-27 13:07 1600Selector消息选择器一般作为SelectableChan ... -
Java Channel解析与实例
2012-12-24 16:09 1306文件IO FileChannel是处理 ... -
Java Comparable接口分析与实践
2012-12-20 14:22 1334此接口对实现它的每个类的对象进行整体排序。这种排序被称为类的自 ... -
PHP远程调用Java服务
2012-12-18 14:16 2378一种比较常见的语言搭配:PHP + Java。 整体架构时这 ... -
Java AIO 入门实例
2012-12-13 16:15 11596原文出处:http://tigerlchen.iteye.co ... -
Java BIO NIO 机制原理资料整理
2012-12-12 14:33 1320转自:http://www.xiaoyaocho ... -
JavaSE Buffer与Netty Buffer比较
2012-12-04 16:15 1385Buffer数据结构: 3 ... -
SWT/JFace的工具类
2012-11-26 14:35 1291自己写的一个SWT/JFace的工具类,有了它,构建Label ... -
Java 读取Zip文件中的某个子文件
2012-11-26 14:26 6778在test.zip文件中读取test.xml文件内容。 ... -
Java Socket
2012-08-17 09:28 1068比较经典的用法,使用ServerSocket构建服务端,用a ...
相关推荐
Java容器详细解析 Java容器是一种基本的数据结构,用于存储和管理对象。Java容器主要分为两大类:Collection和Map。 Collection Collection是一个独立元素的序列,这些元素都服从一条或多条规则。Collection接口...
在IT领域,Java容器是一个非常重要的概念,尤其对于软件开发者来说,它们是理解和构建高效、可扩展的应用程序的关键。本文将深入探讨Java容器,并结合标签“源码”和“工具”,从源码层面和实用工具角度来分析这些...
### Java容器学习心得详解 在Java编程中,容器(Containers)是存储和操作对象集合的重要工具,主要包括集合(Collections)和映射(Maps)。本文将深入解析Java容器的关键概念、特性以及不同容器类型的应用场景。 ...
这篇博客"JAVA容器对象整理"可能涵盖了关于Java中的不同容器类、接口以及它们的使用方式。在这里,我们将深入探讨一些核心的Java容器知识点。 1. **ArrayList与LinkedList** - `ArrayList`是一个基于数组实现的...
Java 容器详解 Java 容器是 Java 语言中的一种集合类库,主要包括 Collection 和 Map 两种类型。Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 Collection Collection 是一种集合接口...
Java容器类是Java编程语言中不可或缺的一部分,它们主要用于存储和管理对象。这些类和接口位于`java.util`包中,为开发者提供了灵活的数据结构和数据操作方式。在Java中,容器类主要分为两大类:Collection和Map。 ...
在Java编程中,容器是用于...总之,理解并掌握这些Java容器的特性和效率差异,能够帮助我们在实际开发中做出更合适的选择,提高程序的性能和可维护性。在具体应用时,还需要结合业务需求和性能测试,才能做出最佳决策。
Java容器讲解PPT,Collection Map(HashMap TreeMap LinkedHashMap) List (ArrayList LinkedList Vector) Set (HashSet TreeSet LinkedHashSet)
Java容器是Java编程中至关重要的一个部分,它们用于存储、管理和操作对象集合。在这个主题下,我们将深入探讨Java中的核心容器类,包括数组、List、Set和Map,以及它们各自的特点和使用场景。 1. **数组**:数组是...
题目摘要:考虑下列的信息系统。出版社需要记录下列书籍和作者的信息: P1: 每一本书有一个title,一个description和一个ISBN number 还有 出版的日期(包括年/月) P2: 每一本书有1个或多个作者。...
### Java容器起源与JSP容器背景解析 #### 容器技术概述 容器技术在现代IT领域扮演着极其重要的角色,特别是在云计算和微服务架构中。本文将深入探讨容器技术的起源,尤其是针对Java环境中JSP容器的发展历程及其...
对于java容器的一些归纳整理,顺着思维导图能方便自己的理解,提高运用能力
JAVA 容器用法详解,关于JAVA容器的详细讲解
Java容器是Java编程中不可或缺的一部分,它们主要用于存储和管理对象,提供了一种高效且灵活的方式来组织和操作数据。本文将简要介绍Java容器的主要概念、API以及常用的容器类。 首先,Java容器分为两大主要类别:...
Java容器类是Java集合框架的重要组成部分,它们提供了一种存储、管理和操作对象的方式。在Java中,容器类包括数组、列表、队列、集、映射等数据结构,它们为开发者提供了灵活的数据处理能力。本篇文章将深入探讨Java...
Java容器是Java编程中一个非常重要的概念,它主要用于管理和组织对象。在Java中,容器可以是集合、框架或服务提供者等,它们为其他对象提供存储、管理以及生命周期控制等功能。容器广泛应用于企业级开发,尤其是在...
后缀为.mmap的思维导图,总结了JAVA容器的常见类
Java容器是Java编程中至关重要的部分,它们是用于存储、管理和操作对象的工具。Java集合框架,包括List、Set、Map、ArrayList、LinkedList等,构成了Java容器的主要元素。以下是对这些概念的详细解释: 1. **集合...
Java容器学习笔记: 容器概览, 容器中的设计模式, 容器源码分析 - List, 容器源码分析 - Map, 容器源码分析 - 并发容 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...