`
xlongbuilder
  • 浏览: 41751 次
  • 性别: Icon_minigender_1
  • 来自: 上海->杭州
社区版块
存档分类
最新评论

翻阅String类源代码发现几个有趣的地方

阅读更多
1、看以下代码 Stirng类的hashcode 方法
/**
     * Returns a hash code for this string. The hash code for a
     * <code>String</code> object is computed as
     * <blockquote><pre>
     * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]   * </pre></blockquote>
     * using <code>int</code> arithmetic, where <code>s[i]</code> is the
     * <i>i</i>th character of the string, <code>n</code> is the length of
     * the string, and <code>^</code> indicates exponentiation.
     * (The hash value of the empty string is zero.)
     *
     * @return  a hash code value for this object.
     */
    public int hashCode() {
	int h = hash;
	if (h == 0) {
	    int off = offset;
	    char val[] = value;
	    int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]   *
这部分说明是这个string 的char数组的ascII拼接后31位进制的值。
不知道为什么是31,有什麽依据?。

2、1、看以下代码 Stirng类的toLowerCase方法片段

/* Now check if there are any characters that need to be changed. */
	scan: {
            int c;
	    for (firstUpper = 0 ;
                    firstUpper < count ; 
                    firstUpper += Character.charCount(c)) {
		c = codePointAt(firstUpper);
		if (c != Character.toLowerCase(c)) {
                    break scan;
                }
	    }
	    return this;
	}


像是个1次循环,不过这种写法估计没怎么有人用过
何意?
我想在某些时候是可以减少点代码量的,不过貌似没多大意义

情况1:
action:{
   for(...){
    if(..)break action
   }
    do something 
}

或
  boolena flag =false;
   for(...){
    if(..){
     flag =true;
     break;
    }
   }
   if(flag)
   do something 


情况2:
action:{
   do something 1 
   if(flag) break action
   do something 2
}

或
do Some thing 1 
 if(flag)
  do Some thing 2



3、String 的intern 方法
/**
     * Returns a canonical representation for the string object.
     * <p>
     * A pool of strings, initially empty, is maintained privately by the
     * class <code>String</code>.
     * <p>
     * When the intern method is invoked, if the pool already contains a
     * string equal to this <code>String</code> object as determined by
     * the {@link #equals(Object)} method, then the string from the pool is
     * returned. Otherwise, this <code>String</code> object is added to the
     * pool and a reference to this <code>String</code> object is returned.
     * <p>
     * It follows that for any two strings <code>s</code> and <code>t</code>,
     * <code>s.intern()&nbsp;==&nbsp;t.intern()</code> is <code>true</code>
     * if and only if <code>s.equals(t)</code> is <code>true</code>.
     * <p>
     * All literal strings and string-valued constant expressions are
     * interned. String literals are defined in &sect;3.10.5 of the
     * <a href="http://java.sun.com/docs/books/jls/html/">Java Language
     * Specification</a>
     *
     * @return  a string that has the same contents as this string, but is
     *          guaranteed to be from a pool of unique strings.
     */
    public native String intern();


其实该方法没多大用,但其说明String 在内部是缓存的。

才发现,其实臧圩人已经说得很清楚了 我就不多赘述了

"在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。" 

参见
http://zangweiren.iteye.com/blog/216005
分享到:
评论
1 楼 抛出异常的爱 2009-05-07  
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]   *
这部分说明是这个string 的char数组的ascII拼接后31位进制的值。
不知道为啥不是32或30 貌似没什么区别。

如果算子是个质数的话
在hash算法时
数据更趋向正态分布


好像是说:
向一个hash树上挂时能更充分的使用空间,
不用挂一个就要扩一次.

相关推荐

    诺基亚手机短信文件处理程序(含源代码)

    欢迎大家在这个代码的基础上修改以适合其他类型的手机短信文件。 遵循GNU/GPL协议发布。简单的说就是:你可以自由修改本程序的源代码,但在将基于本程序修改而来的软件再次发布的时候必须附上源代码,并不得删去原...

    窗体版VB产品展示程序(源代码)

    【标题】:“窗体版VB产品展示程序(源代码)”是一个基于Visual Basic(VB)开发的桌面应用程序,主要用于展示各类产品的信息。该程序利用了VB的窗体界面设计功能,构建了一个用户友好的交互环境,使用户可以方便地...

    Glimmer jQuery 可视化设计工具C#源代码

    大家都听说过小巧实用的jQuery吧,交互式AJAX WEB程序设计的流行框架,不过jQuery的使用并非是可视化的,也就是说我们使用jQuery,就必须面对庞杂的代码,疯狂翻阅手册,为了给jQuery开发者有一个类似SDK一样的可视...

    ripsrc:用于翻阅git repos来分析源代码的库-git source code

    Ripsrc是一个用于分析Git存储库中的源代码的库 安装 go get -u github.com/pinpt/ripsrc 用法 您可以使用提供的示例命令行实现。 ripsrc code 这将按历史顺序(从最旧到最新)遍历所有提交,分析每个文件并转储...

    Glimmer jQuery 可视化设计工具C#源代码(vs2005)

    就必须面对庞杂的代码,疯狂翻阅手册, 为了给jQuery开发者有一个类似SDK一样的可视化操作环境, 微软的Mix博客推出了使用WPF开发的Web的设计工具,它就是Glimmer。 通过它,你可以不必书写Jquery代码实现事件触发、...

    MATAB神经网络30个案例分析,各个章节的代码实现,本人将其调试、分类、整理并附上运行结果,以供读者在翻阅更好的理解知识

    MATAB神经网络30个案例分析,各个章节的代码实现,本人将其调试、分类、整理并附上运行结果,以供读者在翻阅更好的理解知识 01-BP神经网络-分类 02-BP神经网络-拟合 03-GA-BP神经网络-拟合 04-GA-极值寻优 05-BP-...

    可翻阅上一条下一条的网站滚动广告代码.rar

    通过以上这些技术和策略,我们可以构建出一个功能完备且具有吸引力的"可翻阅上一条下一条的网站滚动广告代码",为网站增加互动性,提升用户停留时间和广告效果。在实际应用中,开发者可以根据项目需求进行调整和定制...

    相册的源码

    【标题】"相册的源码"涉及到的是一个基于FLASH技术的电子相册源代码,这种技术主要用于创建具有互动性的、可一页一页翻阅的数字相册。FLASH电子书源码是开发此类应用的基础,它提供了动画效果和用户交互功能,使得...

    atsinternals:Apache Traffic Server源代码分析

    由于ATS 6.0的变化比较大,所以如果您在使用/参照的源代码不是6.0版本,请翻阅官方git仓库中的源代码变化,以帮助理解。 联系作者 如果对内容有不理解,或者认为有错误,可以在github直接留言给我。 源代码目录结构 ...

    ASP源码ASP+ACCESS基于WEB网上留言板(源代码+论文)

    ### ASP源码ASP+ACCESS基于WEB网上留言板(源代码+论文) #### 一、项目概述 本项目是一款基于ASP技术和Access数据库开发的网上留言板系统,适用于小型网站或个人博客等场景,旨在为用户提供一个便捷的在线留言平台...

    js实现的可翻阅上一条下一条的网站滚动动态demo

    每个版本的ECMAScript都会添加新的特性,如ES6(也称为ES2015)引入了类、模块化、箭头函数等,而ES7(ES2016)则引入了数组的展开运算符和异步函数等。理解并掌握这些新特性对于编写高效、现代的JavaScript代码至关...

    在线扒站网PHP源码-在线扒站工具网站源码-一键扒取网站源代码.zip

    四处翻阅,始终没发现谁有好用的扒站工具网站,便自己写了一个 !这是一款在线的网站模板下载程序,也就是我们常说的扒站工具,利用它我们可以很轻松的将别人的网站模板样式下载下来,这样就可以大大提高我们编写...

    EasyEMag电子杂志在线翻阅模块

    如果您是一个网站的站长,您正在寻找一套.Net源代码或程序可以让您的网站轻松生成一套配合网站整体架构的电子杂志频道,那您找对了,请您继续阅读以下EasyEMag介绍。 这是一个访客直接在线阅读且无插件(连flash都...

    73、Jquery可翻阅上一条下一条的网站滚动广告代码

    【标题】中的“73、Jquery可翻阅上一条下一条的网站滚动广告代码”表明这是一个关于使用jQuery实现的网页滚动广告功能的教学或示例。这个标题可能是指一个教程或者一个具体的JavaScript代码片段,用于在网站上创建...

    JAVAWML信息查询与后端信息发布系统实现-WML信息查询设计(源代码+论文)

    系统实现的关键点可能包括以下几个方面: 1. **数据库设计**:为了存储和管理信息,系统需要一个数据库来存储各种数据。这可能涉及到数据库模式设计,如关系模型,以及SQL语句的编写,用于数据的增删改查。 2. **...

    类Flipboard效果的Android源码

    Flipboard以其独特的翻书式用户体验而闻名,使得用户在浏览信息时仿佛在翻阅一本真实的杂志。在Android开发中,实现这种效果通常涉及到自定义视图、触摸事件处理以及复杂的动画效果。 在Android应用开发中,为了...

    javadoc.rar

    使用"javadoc.rar"中的文档,开发者可以避免翻阅源代码进行学习,节省大量时间,提高开发效率。通过阅读文档,开发者能够迅速掌握"rewin.zwgtools.code.jar"库的用法,理解各个工具类和方法的工作原理,以及如何在...

    Java基础知识笔记详细版-菜鸟翻阅必备

    ### Java基础知识笔记详细版-菜鸟翻阅必备 #### 一、Java概述 1. **Java语言发展史**: - Java由Sun Microsystems公司于1995年推出。 - 最初由James Gosling领导的设计团队开发,目标是用于家用电器的编程。 - ...

    基于VB的企业数据信息管理系统(源代码+参考文献+开题报告+PPT).zip

    它的开发与应用,把企业所有技术数据存入计算机,省去了人工翻阅图纸和计算的繁重工作,大大节约了工作时间,减轻了工作人员的劳动强度;系统自动完成查询和计算的工作,打印查询报表,不再需要人工填制,不但提高了...

    Flash日历翻阅动画源文件

    本资源“Flash日历翻阅动画源文件”是一个专门展示如何利用Flash创建动态日历翻页效果的源代码示例,非常适合初学者和有一定基础的开发者用来学习和参考。 首先,让我们深入了解Flash源码。Flash源码通常指的是使用...

Global site tag (gtag.js) - Google Analytics