Java的String详解(涉及面试题与String底层原理)

Java的String详解

1.字符串是常量,创建之后不可改变
2.字符串字面值存储在字符串池中,可以共享
3.String s = new String(“hello”);//产生两个对象,堆,池中各存储一个

产生两个对象并不会浪费空间,因为实际上在真正运行的时候堆中的对象不存在“hello”,而是指向字符串池中的“hello”,使用的是字符串池中的对象

通过下面的图来理解:

在这里插入图片描述

触发面试题:

public class Test {
    public static void main(String[] args) {
        String s = "hello";//"hello"存储在字符串池中
        s = "yuan";
        //"yuan"赋值给了s变量,给字符串赋值时,并没有修改数据,而是在字符串池中重新开辟了空间
        //所以说字符串是不可变的
        String s1 = "yuan";
        String s2 = new String("java");//产生两个对象,堆,池中各存储一个
        String s3 = new String ("java");
        System.out.println(s2==s3);//false(比较的是两个对象的地址)
        System.out.println(s2.equals(s3));//true(比较的是两个对象的值)
    }
}

问: String s2 = new String(“java”);这行代码创建几个对象?

答:

创建两个对象,一个在堆,一个在字符串池中

根据以上代码,这一行System.out.println(s2==s3);//false输出false的原因是?

字符串变量比较如果用==去比较那么比较的是地址值,所以相同的字符串比较结果为false,所以字符串之间的比较必须用equals

String的常用方法

1.length();返回字符串的长度

2.charAt(int index);返回某个位置的字符

3.contains(String str);判断是否包含某个字符串

4.toCharArray();返回字符串对应的数组

5.indexOf();返回字符串首次出现的位置

6.lastIndexOf();返回字符串最后一次出现的位置

7.trim()去掉字符串前后的空格,不会去掉字符串中的空格

8.toUpperCase();把小写字母转换成大写,toLowerCase()把大写字母转换成小写

9.endWith(String str);判断是否以str结尾,startWith(String str)判断是否以str开头

10.replace(char old,char new);用新的字符或字符串替换旧的字符或字符串

11.split();对字符串进行拆分,如果遇到空格和逗号都要拆分的话就在中括号里面加上空格与逗号,例如:

String []arry2 = say2.split("[ ,]"),

如果字符串中含有多个空格,那就在[ ,]后面加个+号,例如:

String []arry2 = say2.split("[ ,]+")

代码实现

public class Test {
    public static void main(String[] args) {
        String content= "java是世界上最好的java语言,java真好";

        System.out.println("-----------------------字符串方法的使用1-----------------------------");
        //返回字符串的长度
        System.out.println(content.length());
        // 获取某个位置的字符
        System.out.println(content.charAt(content.length() - 1));
        //System.out.println(content.charAt(content.length()));
        //System.out.printlncontent.charAt(content.length())出现java.lang.StringIndexOutOfBoundsException异常,
        // 因为该字符串长度下标越界了
        //判断是否包含某个字符串
        System.out.println(content.contains("java"));
        System.out.println(content.contains("php"));

        System.out.println("-----------------------字符串方法的使用2-----------------------------");
        //返回字符串对应的数组
        System.out.println(Arrays.toString((content.toCharArray())));
        //返回字符串首次出现的位置
        System.out.println(content.indexOf("java"));//0
        //返回字符串java出现的位置
        System.out.println(content.indexOf("java", 4));//44
        //第二个参数是指从第几个下标开始数
        //返回字符串最后一次出现的位置
        System.out.println(content.lastIndexOf("java"));//18

        System.out.println("-----------------------字符串方法的使用3-----------------------------");
        String content2 = " Hello World";
        //trim()去掉字符串前后的空格
        System.out.println(content2.trim());//Hello World
        //toUpperCase();把小写字母转换成大写
        System.out.println(content2.toUpperCase());// HELLO WORLD
        //toLowerCase()把大写字母转换成小写
        System.out.println(content2.toLowerCase());// hello world
        String filename = "hello.java";
        //endWith(String str);判断是否以str结尾
        System.out.println(filename.endsWith(".java"));//true
        //startWith(String str)判断是否以str
        System.out.println(filename.startsWith("hello"));//true
        System.out.println("-----------------------字符串方法的使用4-----------------------------");
        //用新的字符或字符串替换旧的字符或字符串
        System.out.println(content.replace("java", "php"));
        //对字符串进行拆分
        String say = "Java is the best programing language,java 真好";
        String say2 = "Java is the best programing  language,java 真好";
        String []arry = say.split(" ");
        String []arry2 = say2.split("[ ,]+");//遇到空格与逗号都拆分,中括号里面加上空格与逗号
        System.out.println(arry.length);
        for(String arr:arry){
            System.out.println(arr);
        }
        for(String arr2:arry2){
            System.out.println(arr2);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yuan_boss

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

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

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

打赏作者

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

抵扣说明:

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

余额充值