`
freesoftman
  • 浏览: 314148 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

String的深入分析

阅读更多

 java.lang.String类对大家来说最熟悉不过了,我们写java程序很少能不用String的。本文讲述如何正确的使用String,内容主要涉及初始化、串联和比较等操作。 

    首先我们必须清楚的一点是String类是final类型的,因此你不可以继承这个类、不能修改这个类。我们使用String的时候非常简单,通常都是String s = "hello",但是Java API中同时提供了一个构造函数为String(String s),因此你也可以这样使用String s = new String("hello"),对于后面这样初始化一个String的方式是不推荐的,因为new操作符意味着将会在heap上生成一个新的对象,如果这样的操作发生在一个循环中,那么代价是惨重的。比如
for(int i = 0;i<1000;i++)
{
    String s = new String("hello");
}
    这将会创建1000个String类型的对象,由于String类是final的,因此这样的操作事实上是每次都生成了一个新的String对象的。如果你使用String s = "hello";那么就可以实现复用了,为什么可以复用呢,下面会有解释。

    当我们使用"+"实现串联操作的时候,比如String s = "hello"+"world";其实是通过StringBuffer类的append()方法实现的,最后返回String给s。如果有兴趣的话,你可以写一个简单的例子,然后用javap看看虚拟机是如何工作的。在使用串联的时候我们同样应该注意String是final类,如果你需要多次串联比如:
String sql = "xxx";
sql = "xxxx";
sql = "ssssss";
那么为了提高效率节省空间,我们应该自己用StringBuffer来替代"+";

    通常对String的比较有两种情况,一个是使用==,另一个是使用equals()方法,注意==是对对象的地址进行比较的,而String中的equals()方法是覆盖了Object类的方法,并且实现为对String对象的内容的比较。所以String s1 = new String("hello");String s2 = new String("hello"),我们对s1和s2进行上述比较的时候,前者应该返回false,因为使用new生成的是两个不同的对象。后者应该返回true因为他们的内容是一样的,都是"hello"。那么如果我们还有一个String s3 = "hello";他和s1的比较应该是什么样子的呢,答案是s1==s3为false,equals的比较位true。事实上String类是维持着一个String池的,这个池初始化为空的,当我们String x = "hello"的时候,hello就会被放入这个池中,当我们再次String y = "hello"的时候,他首先去检查池中是否存在一个和hello内容一样的对象,如果存在的话就会把这个引用返回给y,如果不存在的话,就会创建一个并放入到池中。这样就实现了复用。在String有一个方法intern()他可以把String的对象放入到池冲并返回池中的对象。如果我们对s1(String s1 = new String("hello"))调用intern,s1 = s1.intern()这时候,我们再把s1和s3进行“==”的判断,你会发现结果返回true!
    看下面的例子

public class StringTest
{

    public static void main(String[] args)
    {
        String s1 = "hello";
        String s2 = new String("hello");
        String s3 = new String("hello");
       
        testString(s1,s2,s3);
        s2 = s2.intern();
        System.out.println("after s2.intern");
        testString(s1,s2,s3);   

     }
       private static void testString(String s1,String s2,String s3)
    {
        System.out.println("s1 = s2 is "+(s1==s2));
        System.out.println("s2 = s3 is "+(s2==s3));
        System.out.println("s1.equals(s2) is "+s1.equals(s2));
        System.out.println("s2.equals(s3) is "+s2.equals(s3));
    }
}
输出结果为
s1 = s2 is false
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
after s2.intern
s1 = s2 is true
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true

分享到:
评论

相关推荐

    C string深入详解2.0版_C++_string_

    学习string类相关的操作是学习c++语言很重要的一个内容,c++的string类详细讲解

    有关String类

    关于String类的一些问题 掌握String类的两种实例化方式 掌握String的两种比较操作 深入分析String类两种实例化方式的区别 掌握String的使用特点

    java中String的一些方法深入解析

    以下是对java中String的一些方法进行了详细的分析介绍,需要的朋友可以参考下

    strcat函数与strncat函数的深入分析

    所在库名:#include &lt;string&gt;函数功能:把src所指字符串添加到dest结尾处实现字符串的连接,连接过程覆盖dest结尾处的’/0’。返回说明:src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符...

    java string类方法深入解析

    以下是对java中的string类方法进行了详细的分析介绍。需要的朋友可以过来参考下

    基于PII分析法的煤矿瓦斯事故分析研究

    为了深入分析煤矿事故发生的原因,探求煤矿事故发生机理,预防煤矿事故的发生,保障广大煤矿职工的人身安全,通过介绍PII分析法,研究了PII分析法在煤矿事故致因分析中的可行性、必要性,以实际瓦斯事故案例,应用PII分析法...

    javascript下利用arguments实现string.format函数

    下面摘抄一下源码,深入分析一下他的设计实现思路: 代码如下: function format(string) { var args = arguments; var pattern = new RegExp(“%([1-” + arguments.length + “])”, “g”); return String(string)...

    Java中的length和length()深入分析

    java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个...java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法。这篇文章将介绍几个关于Java数组的关键概念。

    深入C++ string.find()函数的用法总结

    本篇文章是对C++中string.find()函数的用法进行了详细的总结与分析,需要的朋友参考下

    C#之CLR内存深入分析

    C#引用类型具体分析如下: 先来装备两个类: internal class Employee { public static Employee LookUp(string name) { return null; } public virtual string GetProgressReport() { return string.Empty;...

    用C++实现strcpy(),返回一个char*类型的深入分析

    代码如下所示: 代码如下:#include “stdafx.h”#include &lt;string&gt;#include &lt;iostream&gt;using namespace std;char* strcpy(char *src_str, char *dest_str){ char* dest = dest_str; if ((src_str == NULL)||(dest_...

    深入分析Android加载so文件

    Android系统中使用ndk进行编程,有很多的好处(Java的跨平台特性导致其本地交互的能力不够强大,一些和操作系统相关的特性Java无法完成;...System.load(String pathName) System.loadLibraray(Str

    深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例

    JavaScript中有三个可以对字符串编码的...escape(string) 参数 描述 string 必需。要被转义或编码的字符串。 返回值 已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。 说明 该方法不会对 ASCII

    php htmlspecialchars()与shtmlspecialchars()函数的深入分析

    语法htmlspecialchars(string,quotestyle,character-set) 参数 描述 string 必需。规定要转换的字符串。 quotestyle 可选。规定如何编码单引号和双引号。 ENT_COMPAT – 默认。仅编码双引号。 ENT_QUOTES – ...

    C 转移表/转换表的深入分析

    个人实现例子: 代码如下:#include &lt;stdio&gt;#include &lt;string&gt;#define M 4int add(int a, int b);int sub(int a, int b);int mul(int a, int b);int div(int a, int b);int (*oper_func[])(int, int) = { add, sub, ...

    基于C#委托的深入分析

    1.委托的定义 委托可以看成是一种数据类型,可以用于定义变量能接受的值只能是一个方法。 委托简单的示例: 代码如下:namespace DelegateDemo { class Program { public delegate int MathOptDelegate(int value...

    深入分析XmlSerializer对象的Xml序列化与反序列化的示例详解

    这篇随笔对应的.Net命名空间是System.Xml.Serialization;文中的示例代码需要引用这个命名空间。...看一段最简单的Xml序列化代码 代码如下:class Program{ static void Main(string[] args) { int i = 10; //声明X

    深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换

    本篇文章是对c++中的char*与wchar_t*与string以及wstring之间的相互转换进行了详细的分析介绍,需要的朋友参考下

    解析C#中用Process类杀死进程,执行命令的深入分析

    static void Main(string[] args){foreach (Process p in Process.GetProcesses()){Console.Write(p.ProcessName);Console.Write(“—-“);Console.WriteLine(GetProcessUserName(p.Id));}Console.Rea

    Asp.net cookie的处理流程深入分析

    一说到Cookie我想大家都应该知道它是一个保存在客户端,当浏览器请求一个url时,浏览器会携带相关的Cookie达到服务器端,所以服务器是可以操作Cookie的,在Response时,会把Cookie信息输出到客服端。...

Global site tag (gtag.js) - Google Analytics