前几篇文章一直在研究 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. 理解Android虚拟机体系结构(转)

    1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...

  2. 浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)

    pinyin4j项目  官网地址 http://pinyin4j.sourceforge.net/ 我们先把资源下载下来,连同源码和jar包一起放入工程.如下图: 接下来在demo包下,我们写一个测试 ...

  3. k8s google sample - guestbook

    Redis读写分离作为存储 PHP网页作为前端 github地址 https://github.com/kubernetes/kubernetes/blob/release-1.1/examples/ ...

  4. Java多线程总结之由synchronized说开去(转)

    这几天不断添加新内容,给个大概的提纲吧,方面朋友们阅读,各部分是用分割线隔开了的: synchronized与wait()/notify() JMM与synchronized ThreadLocal与 ...

  5. Web 服务器 (IIS) 角色

    原文:Web 服务器 (IIS) 角色 1. 对于默认安装,请在命令行提示符下键入以下命令,然后按 Enter: start /w pkgmgr /iu:IIS-WebServerRole;WAS-W ...

  6. 怎么在android的XML文件里加入凝视

    android的XML文件凝视一般採用 <!--凝视内容 -->的方式进行 在XML中,形如    <Button           />      的表示方式,当中&quo ...

  7. i++与++i哪个效率更高

    简单的比较前缀自增运算符和后缀自增运算符的效率是片面的, 因为存在很多因素影响这个问题的答案. 首先考虑内建数据类型的情况: 如果自增运算表达式的结果没有被使用, 而是仅仅简单地用于增加一元操作数, ...

  8. 使用iframe从网页调起移动端应用

    比如想在网页中调起支付宝,我们可以创建一个iframe,src为: alipayqr://platformapi/startapp?saId=10000007&clientVersion=3. ...

  9. C面试题

    1.sizeof()和strlen()使用? 答案: 1.从功能定义,strlen功能,要查找字符串的长度,sizeof功能是用来寻找指定的变量或变量类型的存储器占用 尺寸: 2.sizeof是运算符 ...

  10. 使用 CodeIgniter 框架快速开发 PHP 应用(七)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(七) CodeIgniter 和对象这是玩家章节.它讲述的是 CodeIgniter 的工作原理,也就是揭开CI头上'神秘的面纱'.如果 ...