前几篇文章一直在研究 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. Linux概念架构的理解(转)

    英文原文:Conceptual Architecture of the Linux Kernel 摘要 Linux kernel成功的两个原因:(1)架构设计支持大量的志愿开发者加入到开发过程中:(2 ...

  2. mysql及powerdesigner的初次使用

    原文:mysql及powerdesigner的初次使用 MYSQL的下载与安装: 下载与安装指导教程: http://jingyan.baidu.com/article/597035521d5de28 ...

  3. RSA JS 加密解密DEMO

    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script&g ...

  4. java数据结构系列——排列(2):有序阵列

    package Array; /** * 对数组排序.当添加到阵列保持有序数组元素: * @author wl * */ public class MyOrderArray { private lon ...

  5. HDU 4292Food(网络流的最大流量)

    职务地址:HDU 4292 水题. 因为每一个人仅仅能有1份,所以须要拆点限制流量.建图方法为,建一源点与汇点.将食物与源点相连,权值为食物额数量,将饮料与汇点相连,权值为饮料数量..然后将人进行拆点 ...

  6. 基于PHP的crontab定时任务管理

    BY JENNER · 2014年11月10日· 阅读次数:6 linux的crontab一直是server运维.业务开展的利器.但当定时任务增多时,管理和迁移都变得非常麻烦,并且easy出问题.以下 ...

  7. POJ 1066 Treasure Hunt(相交线段&amp;&amp;更改)

    Treasure Hunt 大意:在一个矩形区域内.有n条线段,线段的端点是在矩形边上的,有一个特殊点,问从这个点到矩形边的最少经过的线段条数最少的书目,穿越仅仅能在中点穿越. 思路:须要巧妙的转换一 ...

  8. SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数

    原文:SQL Server中的CLR编程--用.NET为SQL Server编写存储过程和函数 很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之 ...

  9. Mysql sql声明召回2 --正则表达式

    这里简单回顾mysql在过滤后的数据使用正则表达式时.主要利用每方法将样品,或添加一些简短的说明. 下面说说提前,使用正则表达式是用来过滤数据 REGEXPkeyword 基本字符相匹配: SELEC ...

  10. Spring学习使用标签来标记资源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)

    首先,在xml其中新增部分标有下划线的文件,容器初始化的时候需要扫描包 注意: a.     包款扫描(下划线部分)一定要加,默认是不扫描整个包.与每一包之间','开.如过具有同样的父包,那么我们能够 ...