《Java 编程思想》004 switch对字符串支持的引申思考

与您共读《Java 编程思想》 Page38~75

第三四章是关于Java操作符和控制流程的讲解,有语言基础无压力,可快速浏览。

《Java编程思想》是基于Java SE5,在此补充Java7的7个新特性:
1. 对集合类的语言支持;
2. 自动资源管理;
3. 改进的通用实例创建类型推断;
4. 数字字面量下划线支持
5. switch中使用string
6. 二进制字面量
7. 简化可变参数方法调用。

可以了解一下Java7中的switch支持String的实现细节及编译工具gd-gui。 实质上还是通过String的hashCode方法将字符串转化为数字。并配合equals方法进行判断。通过hashCode方法判断后仍要用equals方法进行判断,hashCode相同的字符串不一定是同一字符串。

1. Java数组的最大长度

Java 中数组length属性是32位的有符号整数,它的最大值是2的31次幂,就是2G。

由此想到了String,底层也是基于数组的,是一个字符数组。字符是16位的基本类型,一个String的最大长度是多少呢?就是字符数组的最大长度也是2G,占用内存是4GB。

数组具体的实现带来的限制。这会使得实际的JVM不一定能支持上面说的理论上的最大length。
例如说如果有JVM使用uint32_t来记录对象大小的话,那可以允许的最大的数组长度(按元素的个数计算)就会是:
(uint32_t的最大值 - 数组对象的对象头大小) / 数组元素大小
于是对于元素类型不同的数组,实际能创建的数组的最大length也会不同。
JVM实现里可以有许多类似的例子会影响实际能创建的数组大小。

2. 为什么hashCode是int

int长度为32位的有符号整数,对于实际的内存大小足够用。

3. euqals方法的作用

hashCode方法和equals方法是java.lang.Object类中有两个非常重要的方法。equals()方法是用来判断其他的对象是否和该对象相等,对两个对象的地址值进行的比较,即比较地址是否相同。但是很多类覆盖了equals方法,如String。equals方法具有自反性(reflexive)、对称性(symmetric)、传递性(transitive)、一致性(consistent)。

4 hashCode方法的作用

大量对象比较时,使用预存的hashCode值比较提升效率。

5. String HashCode

s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
将上次一算出的hash值乘以31 然后再加上当前字符编码值,由于这里使用的是int肯定会有一个上限,当字符长时产生的数值过大int放不下时会进行截取,一旦截取HashCode的正确性就无法保证了,所以这点可以推断出HashCode存在不相同字符拥有相同HashCode。

就延伸到这里了后续问题继续阅读《Java 编程思想》。

参考 推荐阅读:
浅谈Java中的hashcode方法
java数组的最大长度是多少?
字符串不相同出现相同HashCode
Java的hashCode相同的字符串
Java提高篇——equals()与hashCode()方法详解

发布了39 篇原创文章 · 获赞 4 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章