Java自学笔记—String类

本文详细探讨了Java中String类的构造器行为,包括常量池与堆的区别,字符串连接的优化,以及对象创建和内存分配。通过实例演示了equals与==的区别,并介绍了String的intern方法。还涵盖了内存图和常用方法的讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java自学笔记—String类

构造器

String a = "abc";String对象a直接指向常量池而不会在堆中创建对象
String x = new String("abc");先在堆中创建对象,再指向常量池

/**
 * @author Lspero
 * @version 1.0
 */
public class String02 {
    public static void main(String[] args) {
        String a = "abc";//a->常量池"abc"
        String b = "abc";//b->常量池"abc",同一个地址
        System.out.println(a.equals(b));//t
        System.out.println(a == b);//t

        String x = new String("abc");//x->堆中对象->常量池"abc"
        String y = new String("abc");//y->堆中对象->常量池"abc",两个堆的地址不一样
        System.out.println(x.equals(y));//t
        System.out.println(x == y);//f
        //String的intern()方法返回该字符串在常量池中所对应的对象(地址)
        System.out.println(a == x.intern());//t
        System.out.println(x == x.intern());//f
    }
}

对象创建细节

package com.hz.String_;

/**
 * @author Lspero
 * @version 1.0
 */
public class StringExercise01 {
    public static void main(String[] args) {
        //在常量池创建两个对象
        String s = "hello";
        s = "abc";
        //编译器会自动优化,等价与String a = "helloabc",只创建了一个对象
        String a = "abc" + "def";
        String x = "hello";
        String y = "adc";
        //常量相加看池,变量看堆
        /*追源码
        1.先创建一个StringBuilder sb = StringBuiler();
        2.执行 sb.append("hello")
        3.执行 sb.append("abc")
        4. 再sb的ToString方法,返回"helloabc"对象给xy,返回一个value数组,ToString是new一个对象
        最后xy指向堆中对象(String) value[] = "helloabc"
        */
        String xy = x + y;
        String xy0 = "helloabc";
        System.out.println(xy == xy0);//flase,xy指向堆,xy0指向常量池
    }
}

题目

求以下输出

/**
 * @author Lspero
 * @version 1.0
 */
public class StringTest01 {
    //字符串放在常量池中,堆中对象的str属性->String的属性,堆中的value[]->常量池"lspero"
    String str = new String("lspero");
    //字符数组在堆中,堆中对象的ch属性->堆中"java"
    final char[] ch= {'j', 'a', 'v', 'a'};
    public void change(String str, char ch[]){
        str = "java";
        ch[0] = 'l';
    }

    public static void main(String[] args) {
        StringTest01 ex = new StringTest01();
        ex.change(ex.str, ex.ch);
        //结果 lspero and lava
        System.out.print(ex.str+" and ");
        System.out.println(ex.ch);
    }
}

内存图如下

在这里插入图片描述

String常用方法

equals            //区分大小写,判断内容是否相等 
equalsIgnoreCase  //忽略大小写,判断内容是否相等 
length            //获取字符的个数即字符串的长度
indexOf           //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,则返回-1
substring(a, b)   //截取指定范围的子串,左闭右开
trim              //去前后空格
charAt            //获取索引处的字符,注意不能使用Str[index]这种方式,String为一个对象,value是其中一个属性
toUpperCase       //转大写
toLowerCase       //转小写
concat            //拼接字符串
replace           //替换字符串中的字符,原来字符串不变,返回新串
split             //分割字符串,对于某些分割字符,我们需要转义比如|和\\等,如'\|'代表|
compareTo         //比较两个字符串的大小,长度相同则返回不同依次字母之间的差值,不同返回长度差值 
toCharAiray       //转化成字符数组
format            //格式字符串,%s字符串  %c字符  %d整型  %.2f浮点型

总结

  1. String a = "abc";String 对象a直接指向常量池而不会在堆中创建对象String x = new String("abc"); 先在堆中创建对象,再指向常量池
  2. String常量相加看池,变量看堆
    String a = "abc" + "def"; //编译器会自动优化,等价与String a = "helloabc",只创建了一个对象
    String xy = x + y; //利用StringBuilder
  3. String的value属性指向常量池,char[ ]指向堆
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值