java String类与StringBuffer类实例讲解

时间:2018-08-20
本文章向大家介绍java String类与StringBuffer类实例讲解,需要的朋友可以参考一下

一、String

String又称不可变字符序列。

我们看JDK源码中用于字符存储的数组有final修饰,final修饰变量就代表变量不能改变。

我们可以看API文档中对String的描述。

String 代表字符序列。在java程序中所有的字符串字面量,如“abc”实现实例都属于这个类。

String是不可改变的;它的values不能在创建之后改变。String buffers是支持可变的字符串。因为String对象是

不可变的它们能共享。

1.String实例化方法

public class Test {
    public static void main(String[] args) {
        String str1 = "abc";              //实例化方法1
        String str2 = new String("efg");   //实例化方法2
        
        System.out.println(str1);
        System.out.println(str2);
    }    
}
运行结果:
abc
efg

这两种实例化方法都可以,具体区别后面会有补充。

2.字符串的比较

public class Test {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = new String("abc");
        
        System.out.println(str1 == str2);
        System.out.println(str2.equals(str1));
    }    
}
运行结果:
false
true

首先第一个==比较比较的是对象的地址值,这里str1和str2是两个地址,所以直接比较地址会使false。

而str2.equals(str1)是比较字符串的内容是否相等。

str1和str2的内容虽然一样,但是两个对象,各自存储一个abc。所以直接比较地址会不相同。

我们再来看下列代码

public class Test {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = new String("abc");
        String str3 = "abc";
        
        System.out.println(str1 == str2);
        System.out.println(str1 == str3);
        System.out.println(str2.equals(str1));
    }    
}
运行结果:
false
true
true

我们会发现,str1和str2直接比较是false,但是str1和str3直接比较确是false。

这就说下之前说的到两种构造方法的区别,String str1 = “abc”;这种构造方法,当指向的内容一致时,两个实例会指向相同的地址,而不会重新创建实例。

String str2 = new String("abc");这种方法无论内容相同与否都会重新创建一个新的实例。

3.字符串内容不可变

一开始就说了String又称为不可变字符序列。

我们看下列代码:

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        String str2 = "world";

        str2 = str1 + str2;        
        
        System.out.println(str1);
        System.out.println(str2);
    }    
}
运行结果:
holle
holleworld

看到这段代码,大家可能会有疑问,这str2变了呀,变成了holle world.

其实变的是str2指向的地址值,内容并没有改变。

只是断开了原有指向,重新指向新的地址。

由于String的不可变特性,要避免一下代码:

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        for(int i = 0; i < 100; i++){
            str1 = str1 + i;    //由于String是不可变的,所以会不停指向新的地址。
        }
        System.out.println(str1);
    }    
}

 4.Strign常用方法

4.1 charAt(int index)

获取字符串中指定下标的字符。

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        char ch;
        ch = str1.charAt(1);
    
        System.out.println(ch);
    }    
}
Test_charAt
运行接过:
o
运行结果

4.2 indexOf(String str)

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        int i;
        i = str1.indexOf("le");
    
        System.out.println(i);
    }    
}
Test_indexOf
运行结果:
3
运行结果

4.3 substring(int start, int end)

截取指定开始位和结束位前一位之间的字符串。

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        
        System.out.println(str1.substring(2, 4));
    }    
}
Test_substring
运行结果:
ll
运行结果

4.4 toUpperCase();

将字符串变为大写

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        
        System.out.println(str1.toUpperCase());
    }    
}
Test_UpperCase
运行结果:
HOLLE
运行结果

还有很多方法就不一一介绍了,JDK里面的源码和文档有详细的说明。

二、StringBuffer

StringBuffer是线程安全、可变的字符序列。线程安全也就意味着效率较低。

StringBuffer基本操作方法。

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        StringBuffer b1 = new StringBuffer("abc");
        StringBuffer b2 = new StringBuffer("def");
        StringBuffer b3 = new StringBuffer("gh");
        
        System.out.println(b1.append(b2).append(b3));
    }    
}
运行结果:
abcdefgh

StringBuffer不能向String那样使用+连接,必须是用连接函数append()来连接。

连接后不是向String那样指向新的地址,而是将b2和b3的内容追加到b1里面。

append()的功能非常强大可以连接很多东西。这个大家可看下JDK的源码。

当前数组长度不够时,StringBuffer会自动扩大当前数组长度。

不会像String那样直接创建新的。

StringBuffer是可变的字符序列,主要特性是可变可修改的。

它的很多方法与String类锁,下面举几个例子。

1.indexOf(String str)

查找指定字符串所在下标

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        StringBuffer b1 = new StringBuffer("hello");

        System.out.println(b1.indexOf("ll"));        
    }    
}
Test_indexOf
运行结果:
2
运行结果:

2.insert(in toffset, String str)

在指定位置加上指定字符串。

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        StringBuffer b1 = new StringBuffer("hello");

        System.out.println(b1.insert(2,".."));        
    }    
}
Test_insert
运行结果:
he..llo
运行结果

3.revers()

将内容反转。

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        StringBuffer b1 = new StringBuffer("hello");

        System.out.println(b1.reverse());        
    }    
}
Test_reverse
运行结果:
olleh
运行结果

4.delete(int start, int end)

删除指定范围的内容

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        StringBuffer b1 = new StringBuffer("hello");

        System.out.println(b1.delete(2,4));        
    }    
}
Test_delete
运行结果:
heo
运行结果

5.substring(int start int end);

截取指定范围的字符串

public class Test {
    public static void main(String[] args) {
        String str1 = "holle";
        StringBuffer b1 = new StringBuffer("hello");

        System.out.println(b1.substring(2,4));        
    }    
}
Test_substring
运行结果:
ll
运行结果

6.toString()

将内容转换为String类型。

public class Test {
    public static void main(String[] args) {
        String str1;
        StringBuffer b1 = new StringBuffer("hello");
        str1 = b1.toString();
        System.out.println(str1 + "");        
    }    
}
Test_toString
运行结果:
hello
运行结果

还有很多方法这里只是举几个例子,有兴趣深入了解可以去查看JDK源码或API文档。