Java中的字符串

字符串的本质是char类型的数组,但在java中,所有用双引号""声明的字符串都是一个String类的对象。这也正体现了Java完全面向对象的语言特点。


String 类

1、String类对象表示的是一个常量字符串。它是不可变长度的。也就是说,一旦创建了一个String类的实例,那么这个实例所表示的串是不可改变的。类似于

str = str + "Hello";

这样的操作,实质上是将 str 和 "Hello" 这两个String对象合起来创建了一个新的String对象,然后将新String对象的引用赋给了str。大量使用这种操作,就会造成性能上的缺陷。如果需要经常改变字符串的内容,应该使用StringBuffer类或StringBuilder类。我们可以用一段小程序来看看 String 和 StringBuffer类的性能差异到底有多大。

class StringTest
{
    public static void main(String[] args)
    {
        /**
        * 分别用String 对象和 StringBuffer 对象执行10,000次追加操作,测试执行时间
        * 2013.3.18
        */
        String constStr = "";
        long lTime = System.currentTimeMillis();
        for(int i = 0 ; i < 10000 ; ++i)
            constStr += i;
        System.out.println("Const String : " + (System.currentTimeMillis() - lTime));
        
        StringBuilder strBuf = new StringBuilder("");
        lTime = System.currentTimeMillis();
        for(int i = 0 ; i < 10000 ; ++i)
            strBuf.append(String.valueOf(i));
        System.out.println("Buffered String : " + (System.currentTimeMillis() - lTime));
    }
}
执行结果:

可以看到,StringBuilder秒过,而String类却要用300ms的时间,可见性能差异之巨大。

StringBuilder 和 StringBuffered都表示一个可变长度(mutable)的字符串对象,它们之间的区别在于,StringBuffered类会在线程同步方面做一些安全性处理,而StringBuilder则反之。所以如果只是在单线编程的话,StringBuilder要比StringBuffered效率稍高一些(其实区别也并不大)


2、"Hello World" 是一个String对象

我们可以直接把"Hello World"当作一个对象来使用,如:

if("Hello".equals("Hello"))
            System.out.println("Yes");
输出结果为Yes

.


3、字符串对象比较要用equals()方法,而不能单纯地使用 == 来判断。因为 == 比较的是两个引用名称所引用的实例是否相同,equals()方法则比较的是两个对象中的字符串是否相等。

一个常见的问题是,下面的代码片断一共产生了几个String对象?

String str1 = new String("Hello");
String str2 = new String("Hello");
可能多数人会回答,2个。但事实上这里一共产生了3个String对象。除了str1 和str2,别忘了"Hello"也是一个String对象哦。


4、String池(Pool)

Java执行时会维护一个String池。当出现一个由双引号声明的字符串时,JVM会首先核查在内存中是否存在相同的String对象(字符相同),如果存在,则返回内存中已经存在的对象的引用 ,如果不存在才会创建一个新的String对象。这样可以节约内存。如下面一段代码,str1和str2实际上是指向的同一个String对象.

String str1 = "Hello";
String str2 = "Hello";

5、接收命令行参数

我们在声明main方法时,会声明一个String[] 类型的形参。这个String对象的数组就保存了用户在执行这个程序的时候所传递进来的命令行参数。注意,与C语言不同的是,Java里的命令行参数是从程序名称后第一个变量开始的。也就是说,String[]数据并不包括应用程序名。例如:

class strCmd
{
    public static void main(String[] args)
    {
        if(args.length > 0)
        {
            for(String str : args)
                System.out.println(str);
        }
    }
}
执行 java strCmd Hello World!时的输出结果为:


6、字符串的分离

类似于C语言中的strtok,String类也有一个split的方法可以以指定的格式分离一个字符串。split方法返回一个String对象的数组,表示分离出的每一段字符串。如:

class strSplit
{
    public static void main(String[] args)
    {
        String str = "Hello\tWorld\tI\tLove\tYou!";
        System.out.println("Original String : " + str);
        
        String[] strArr = str.split("\t");
        for(String s : strArr)
            System.out.println(s);
    }
}


其中,split()方法的参数可以是正则表达式。可以使用java.util包中的Matcher类的静态方法matches()来判断一个字符串是否符合正则表达式


String类还有更多其它强大的功能,我们应该学会阅读API文档。在这里就体现了英语的重要性了、、

转载于:https://www.cnblogs.com/whongfei/archive/2013/03/18/5246997.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值