java中String类详解

在java中,使用String类型来表示字符串。String类使用final关键字修饰,即该类不可被继承,String类中封装了丰富的用于对字符串进行操作的相关方法。底层使用字符数组实现。

//JDK中String类
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    private final char value[];
    ...
}
String类型为引用类型,由于其使用频繁,因此java中可以使用类似于基本类型的方式创建String类对象(内存中不同)。以下为创建String类的两种方式

public static void main(String[] args) {
        //字面量方式赋值,String引用类型可使用基本数据类型的方式创建
        String s="helloworld";
        String s2=new String("helloworld");
    }
使用String s="hello"这种方式创建String类型变量时,java虚拟机会现在常量池中寻找有没有存在的"hello"字符常量,如果存在直接使用,如若不存在,则在常量池中创建新的"hello"常量。最后将栈中的引用s指向该字符串常量。

使用String s=new String("hello");这种方式创建对象时,jvm不仅会在字符串常量池中创建"hello"字符串常量,而且会在堆空间中new一个对象指向该常量(所有new出来的对象都在堆空间中分配),最后栈空间的引用s指向堆空间new出来的对象。等于创建了两个对象,所以推荐使用String s="hello";这种方式创建String对象性能会好一点。

以下是由此得出的字符串间==比较的结果,==比较的是引用的地址是否相同。

@Test
    public void test2(){
        //字面量创建,先去常量池查找是否有该字符串对象.
        String s1="123abc";
        String s2="123abc";
        System.out.println(s1==s2);//true
        //new 一定会创建新的对象
        String s4=new String("123abc");
        System.out.println(s1==s4);//false
    }
再看下面两个可能会引起疑惑的例子
@Test
    public void test03(){
        String s1="123abc";
        String s5="123"+"abc";//编译期 如果发现一个计算表达式,两边全是字面量,自动计算.如果计算表达式含变量,不运算,
        System.out.println(s1==s5);//true
        
        String s6="123";
        String s7=s6+"abc";
        System.out.println(s1==s7);//false
    }
在创建String s5="123"+"abc";时,编译期 如果发现一个计算表达式,两边全是字面量,会自动计算。也就是说该行代码等价于String s5="123abc"。

但是.如果计算表达式含变量,编译期则不会运算,s7对象创建的过程实际等价于以下的过程:

String s7=new StringBuilder(s6).append("abc").toString();
所以s1==s7结果为false

String类的对象是不可变对象,即:String对象内容不可改变,若改变 字符串的内容一定是创建了新的对象。

@Test
    public void test01(){
        String s1="12a";
        String s2=s1;
        System.out.println(s1==s2);//true
        s1=s1+"b";
        //String为不可变对象  当String里内容改变时,实为创建新的对象,s1的引用地址改变
        System.out.println(s1==s2);//false
    }

String重写的equals()方法则用来比较两个字符串的具体内容是否相同。使用equals()方法时的一个注意点,使用字符串 常量.equals(String str)的方式可以有效避免空指针异常。

/**
     * @author zc
     */
    @Test
    public void testEquals(String str){
        String s="zc";
        if("zc".equals(str)){
            System.out.println("");
        }
    }
后面的文章中再接着介绍String中的相关方法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyingZCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值