Java String 详解

Java String 详解

目录


String详解

1. String实现的接口

 public final class String
      extends Object
      implements Serializable, Comparable<String>, CharSequence
final修饰的好处:
1.不可变对象是线程安全的,可以用于多线程;
2.不可变对象拷贝只需要拷贝地址,效率高;
3.不可变类的每个实例中的内容必须在该实例创建的时候就提供出来,并且在该对象的整个生命周期内保持不变。

2.创建String对象的方法比较:

 String(byte[ ] bytes):通过byte数组构造字符串对象。
 String(char[ ] value):通过char数组构造字符串对象。
 String(Sting original):构造一个original的副本。即:拷贝一个original。
 String(StringBuffer buffer):通过StringBuffer数组构造字符串对象。

  
  两种比较常见的创建string对象的方式比较:

String str1 = "test";
String str2 = new String("test");

  第一种创建方法,也就是通过“”创建的都是常量,首先检查String pool中是否存在字符串”test”,如果存在则直接将”test” 的地址赋值给变量str1,如果不存在则在String pool中新建一个字符串”test”,然后再将其地址赋给变量str1;
  第二种创建方法,实际上创建的是两个String对象,一个是“test”,通过“”创建,并且在编译期就已经添加到String pool中了;另一个是在运行期,new String() 方法将在heap中创建一个String对象,并将heap中的对象的引用返回给str2变量。
  两种方法的区别:new String()方法无论String pool中是否存在需要创建的对象,都会在heap中创建一个新的对象。

示例

/**
 * @ClassName JavaString
 * @Description TODO(这里用一句话描述这个类的作用)
 * @author eric
 * @Date 2016年10月26日 上午11:13:13
 * @version 1.0.0
 */
public class JavaString {
    public static void main(String[] args) {
        String str1 = "test";
        System.out.println(str1 == "test"); //true 

        String str2 = new String("test");
        System.out.println(str2 == "test");//false 

        String str3 = new String("test");
        System.out.println(str3 == str2);//false

        String str4 = "te" + "st";  
        //该行语句关联的String类的实体还是一个,在编译的时候,先执行了 + 操作,"test"还是一个对象
        System.out.println(str4 == str3);//false
        System.out.println(str4 == str1);//true

        String a = "te";
        final String b = "te";
        String str5 = a + "st";  //左边的是一个变量,在运行期才会执行+操作,并在heap中新建一个对象
        String str6 = b + "st";  //两个常量的+号在编译时就已经执行了
        System.out.println(str5 == "test");//false
        System.out.println(str6 == "test");//true
    }
}

String() 常见方法

intern()
  当String类对象调用intern()方法时,如果String pool中存在等于该String对象的字符串的时候,则返回该字符串的地址;否则向常量池中添加一个相等的字符串并返回该地址。

String concat(String str)
  将str连接到该字符串的后面,返回连接之后的字符串,但是不会影响原来的字符串。示例:

    public static void main(String[] args) {
      String test = "hello";
      String test2 = "world";
      String test3 = test.concat(test2);
      System.out.println(test);
      System.out.println(test2);
      System.out.println(test3);
    }
    /*结果输出:
    hello
    world
    helloworld

    */

public String trim()
  返回该字符串去掉开头和结尾空格后的字符串。

public String[] split(String regex)
  将一个字符串按照指定的分隔符进行分割,返回分割之后的字符串数组。

StringBuilder 和 StringBuffer 比较

  由于String是不可变的,每次对String进行修改的时候,都在创建一个新的字符串对象,如果对字符串进行大量的修改,那么Java虚拟机就会浪费大量的资源来创建新的字符串对象。而StringBuilder和StringBuffer则是可变的字符串类,能够提高对字符串进行修改的效率。
  StringBuilder是线程不安全的;
  StringBuffer是线程安全的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值