《Java编程思想》第十三章 字符串

前言:

本系列是我本人阅读java编程思想这本书的读书笔记,主要阅读第五章到第十七章以及第二十一章的内容,今天的笔记是第十三章

有统计显示,计算机中最常见的行为就是操作字符串,尤其是在web大行其道的今天,就更是如此了。

1. String不可变

我们首先抛出一个结论:string对象是不可变的, string类中每一个看起来会修改string值的方法,实际上都是创建了一个新的对象,它并没有改变原来string对象的值。请看如下代码

public static String upcase(String s){
        return s.toUpperCase();
    }
    public static void main(String[] args) {
        String q="howday";
        System.out.println(q);
        String qq=upcase(q);
        System.out.println(qq);
        System.out.println(q);
    }

打印结果是这样的

howday
HOWDAY
howday

当q传到upcase方法的时候,实际上是传递了一个引用的拷贝,每当string对象被作为参数时,都会复制一份引用,而引用所指的对象就一直在它的物理位置上,从未移动。

看一下string的源码,可以看到string的底层是一个final类型的字符数组,这就说明了是string是不可继承且值是不可变的。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];//final表示不可变
}

 再来看一道面试题

String a = new String("ab"); // a 为⼀个引⽤
String b = new String("ab"); // b为另⼀个引⽤,对象的内容⼀样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,⾮同⼀对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}

从中可以看出,字面量的字符串是会放在常量池中的,当两个字符串字面量作比较的时候,java虚拟机会直接到常量池中去找有没有和他相同的字面量值。

书中介绍了很多string的api,由于api文档中都能找到,我就不在赘述了,书中还花了大量的篇幅介绍正则表达式以及正则表达式在string中的使用,我在这不做过多的记录,在这里我放一个网址https://www.runoob.com/java/java-regular-expressions.html,有兴趣的可以到这个网站去学习一下正则表达式的语法以及结合java的使用,因为正则表达式的语法稍微有些复杂,我建议还是用到的时候再去查比较好。

总结

由于书出版的时间比较早,jdk版本有些老,所以书中也没有说到在高并发状态下string怎么使用,包括stringbuffer,包括jvm对string的各种优化,但是我们知道了很重要的一点,那就是string是不可变的,每当string对象被作为参数时,都会复制一份引用。到此,本章就结束了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值