前几篇文章一直在研究 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. Git常用操作汇总(转)

    如果一个文件被删除了,可以使用切换版本号进行恢复.恢复方法: 先确定需要恢复的文件要恢复成哪一个历史版本(commit),假设那个版本号是: commit_id,那么 git checkout com ...

  2. &quot;伪中国移动client&quot;--伪基站诈骗

    一.简单介绍: 近日,百度安全实验室发现一款"伪中国移动client"病毒.犯罪分子通过伪基站方式大量发送伪10086的短信,诱导用户点击钓鱼链接:并在钓鱼页面诱导用户输入网银账号 ...

  3. Oracle 数据导出到PowerDesigner

    原文:Oracle 数据导出到PowerDesigner [一]配置ODBC win7 :控制面板(查看方式:小图标)→管理工具→数据源(ODBC) 在[ODBC数据源管理器]面板下,在默认[用户DN ...

  4. Babelfish (STL)

    题目描述 You have just moved from Waterloo to a big city. The people here speak an incomprehensible dial ...

  5. hdu 4831 Scenic Popularity(模拟)

    pid=4831" style="font-weight:normal">题目链接:hdu 4831 Scenic Popularity 题目大意:略. 解题思路: ...

  6. jsp页面onsubmit=&quot;return checklogin();&quot;该解决方案给

    选择Window->Preferences->MyEclipse->Validation 去掉方框里的对号,然后Apply 然后点击Yes->然后再点击ok->Yes,足 ...

  7. jQuery自定义右键菜单

    首先看下效果,效果在最下面: 代码: body { font-size: 12px; margin: 0px; padding: 0px; } form,div,ul,li { margin: 0px ...

  8. Quartz.Net任务统一调度框架

    山寨版Quartz.Net任务统一调度框架   TaskScheduler 在日常工作中,大家都会经常遇到Win服务,在我工作的这些年中一直在使用Quartz.Net这个任务统一调度框架,也非常好用, ...

  9. 纠错《COM技术内幕》之ProgID

    近期在看<COM技术内幕>,看到第六章时发现该章节在解释ProgID时有点错误,特此记录一下,也给正在学习COM的小伙伴们一个提示. 并且我发现该问题存在于一些非常多大型软件的COM组件中 ...

  10. VS2010-使用“预先生成事件命令行”和“后期生成事件命令行”功能

    原文:VS2010-使用"预先生成事件命令行"和"后期生成事件命令行"功能 xcopy /r /y $(TargetPath) $(ProjectDir)..\ ...