有关String类

转载 2006年05月19日 14:36:00

     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

与String相关的面试题汇总

归纳一些常见的关于String、StringBuffer、StringBuilder的面试题……
  • hai_cheng001
  • hai_cheng001
  • 2014年07月21日 22:30
  • 2034

有关String类

     java.lang.String类对大家来说最熟悉不过了,我们写java程序很少能不用String的。本文讲述如何正确的使用String,内容主要涉及初始化、串联和比较等操作。     首先...
  • itkbase
  • itkbase
  • 2008年01月03日 09:29
  • 109

线程有关的方法或类

线程有关的方法或类: ConcurrentHashMap: CopyOnWriteArrayList:用于在遍历操作为主要操作的情况下代替同步的List。 PriorityQueue:一个(非并发...
  • hotdust
  • hotdust
  • 2017年06月12日 11:57
  • 224

String类的有关方法

一、String 类构造方法: 1.  String s = "abc"; 2.  String s = new String();   //单纯的String对象。 3.   ...
  • HelloWorld_In_Java
  • HelloWorld_In_Java
  • 2016年11月15日 00:21
  • 408

String 类的有关方法

public String substring(int beginIndex,int endIndex)返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,...
  • qq_36935755
  • qq_36935755
  • 2017年11月09日 19:24
  • 40

C++中的string常用函数集锦

我们直入主题,下面是我今天要讲解的函数列表。 /* 1.查找find系列 2.插入insert系列 3.提取substr 4.删除erase */ 现在来看第一个:查找函数。 /* 函数名 ...
  • SAYA_
  • SAYA_
  • 2015年08月09日 18:11
  • 2174

String讲解

String类没有提供用于修改字符串的方法。String类对象为不可变字符串,如字符串string=”HELLO”永远只包含HELLO这几个字母,而不能修改其中任何一个字符。当然可以修改字符串变量st...
  • ZKaTT
  • ZKaTT
  • 2017年01月21日 14:27
  • 139

java中的String特殊之处

 本文属本人原创,如要转载,请指明出处http://blog.csdn.net/rypgoodjava里面,String是最特殊的一个类。说它是基本类型,它又不是,说它不是基本类型,又和基本类型很像,...
  • rypgood
  • rypgood
  • 2009年01月01日 01:10
  • 1712

【C/C++】C++ String类的实现

面试的时候被问及了String类的实现,结果没写好... 就当是重新复习一下吧。 下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数。#include #inclu...
  • moxiaomomo
  • moxiaomomo
  • 2011年05月11日 12:15
  • 38176

有关string

//逐个读取未知数量的string对象 #include #include using namespace std; int main(){    string line;    while(...
  • Nicholafs
  • Nicholafs
  • 2017年06月09日 18:35
  • 49
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关String类
举报原因:
原因补充:

(最多只允许输入30个字)