前几篇文章一直在研究 WEB 安全的问题,并且近期工作中也一直在解决这些安全漏洞。当然,兴许的博客中还会就这些暴露出来的问题谈谈我的解决方式,仅仅只是,在这篇博客中,我想谈点别的问题。并且对于我们开发人员来说。是一个老生常谈的问题。



简单介绍


关于 String 类,我想大家一定不陌生。毕竟每天都打交道。早已经滚瓜烂熟了。我今天要说的不是整个 String 类。而是当中的一个方法,这种方法也许你都没有听说过。当然更别提用过了。废话不多说。进入正题。



正文


相信绝大多数的人不会去用 String 类的 intern() 方法,打开String类的源代码发现这是一个本地方法,定义例如以下: 

public native String intern();     该方法返回一个字符串对象的内部化引用。

String 类维护一个初始为空的字符串的对象池。当 intern() 方法被调用时,假设对象池中已经包括这一个相等的字符串对象则返回对象池中的实例。否则加入字符串到对象池并返回该字符串的引用。


我们在 new 一个 String 对象的时候。新产生的 String 在堆中,而不在字符串池中,即 CONSTANT_String_info 中。而 intern() 方法是到字符串池中查找是否存在该内容为指定字符串的 String 对象,假设有,则返回一个已有的引用,否则。创建在字符串池中创建新的引用。并返回该引用。

而採用 new 创建的字符串对象不进入字符串池。字符串相加的时候,都是静态字符串的结果会加入到字符串池,假设当中含有变量不会进入字符串池中。可是字符串一旦进入字符串池中,就会先查找池中有无此对象。

假设有此对象,则让对象引用指向此对象。

假设无此对象。则先创建此对象。再让对象引用指向此对象。



样例


Java语言规范中定义了字符串文字以及更一般的常量表达式的值的字符串是被内部化的,以便它们共享同一个实例。

我们试验一下以下的代码:


String s1="你好,Java";
String s2="你好,"+"Java";
System.out.println(s1==s2);
System.out.println(s1.intern()==s2.intern());

这段代码将打印两个 true 。也就是说字符串 s1 和 s2 是共享同一个实例。

只是前提是虽然使用了表达式,可是表达式中必须都是常量。


了解这个处理机制也能够让我们在用到字符串常量的时候了解怎样节省这些字符串所占用的内存。 


结束语


最后,推荐一篇关于 String 类的文章,建议大家有时间去看一下,感觉非常有帮助的,尤其是对正在面试或将要面试的童鞋们。





版权声明:本文博客原创文章,博客,未经同意,不得转载。

你不明白 String 类别的更多相关文章

  1. 改写String类别

    主要4默认功能重写: 代码: #include <iostream> using namespace std; class Cstring{ private : char * data; ...

  2. [FAQ]String(字串相連)與StringBuilder的差別、原理與優缺點?

    原文位於 http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/09/msdn_string_stringbuilder.aspx [FAQ]St ...

  3. String.valueOf()

    1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下 ...

  4. Java基础知识强化59:String(字符串)和其他类型的相互转化

    1. String类型 ---> 其他类型 (1)使用基本类型包装类的parseXXX方法 e.g:String(字符串)转化为int(整型) String MyNumber ="12 ...

  5. 转 C#String与string的区别

    C#是区分大小写的,但是我却发现C#中同时存在String与string,于是我很困惑,于是我上网搜索了一下,于是我了解了一些小知识. MSDN中对string的说明:string is an ali ...

  6. c#中关于String、string,Object、object,Int32、int

    在java中,string和String有着明显的区别,后者就是前者的一个封装.在c#中,好像是通用的,大部分情况下,两者互换并不会产生问题.今天特意查了一下资料,了解了一下两者的关系. 简单的讲,S ...

  7. String.valueOf() 方法的使用

      1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 ...

  8. java里String类为何被设计为final

    前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...

  9. Integer与String的知试点(java中常见面试题)

    1.==符号使用 Integer a = 1000,b=1000; Integer c = 100,d=100; System.out.println(a==b); System.out.printl ...

随机推荐

  1. 备忘录模式设计模式入门Memento

    //备忘录模式定义: //在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. //这样以后就能够将该对象恢复到原先保存的状态 //实例:測试两种方案.两种方案在第一阶段的过程 ...

  2. PLSQL:[1]plsql中文乱码,显示问号

    PLSQL运行sql语句,不识别中文.输出的中文标题显示成问号?? ?? 工具/原料 PLSQL Developer 9 方法/步骤 1 登陆plsql,运行sql语句.输出的中文标题显示成问号??? ...

  3. android app启动过程(转)

    Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...

  4. JavaEE(18) - JPA原生SQL查询和存储过程

    1. 使用原生SQL执行查询 2. 映射原生SQL查询的结果集 3. 使用原生SQL查询执行实体查询 4. 命名原生SQL查询 5. 在JPQL查询中调用存储过程

  5. char* 和char[]差异

    从因特网以下内容.笔者和总结汇总. 1. 问题介绍 问题引入: 在实习过程中发现了一个曾经一直默认的错误.相同char *c = "abc"和char c[]="abc& ...

  6. 华为OJ: 公共字符串计算

    有几个需要注意的地方,这个问题是不是大写和小写之间的区别.这样你就输入字符串大写或小写转换的计算前. 第二个,定要清晰.先将s1从[i]处開始与s2的[j]開始匹配,不相等则j++直到j等于s2.le ...

  7. Mysql编写定时任务事件

    原文:Mysql编写定时任务事件 场景: 例如:某系统,用户每天只能拥有一次的抽奖机会,抽过后当天就不可再抽,但是过了24:00点后用户就重新拥有一次抽奖机会.像这种需要数据库定时对某个字段进行更新操 ...

  8. shell变量赋值进阶

    首先,要理解shell中变量的3种赋值情况: unset 例子. unset a 空字符串, null 例子. a='' 非空,即不是unset,并且不是空字符串 例子: a=1 or a=b等 然后 ...

  9. javascript中用来定义引用类型的一种"默认"模式

    // 终极版:组合使用构造函数模式和原型模式:***************************** // 评价:集构造函数模式和原型模式之大成: 用来定义引用类型的一种默认模式 function ...

  10. 通俗易懂的语言描述JavaScript原型

    这是一个翻译.原文地址http://javascriptissexy.com/javascript-prototype-in-plain-detailed-language/# 原型(prototyp ...