Java核心技术卷I基础知识3.6.3 不可变字符串
String类没有提供用于修改字符串的方法。如果希望将greeting的内容修改为“Help!”,不能直接地将greeting的最后两个位置的字符修改为‘p’和‘!’。这对于C程序员来说,将会感到无从下手。如何修改这个字符串呢?在Java中实现这项操作非常容易。首先提取需要的字符,然后再拼接上替换的字符串:
上面这条语句将greeting当前值修改为“Help!”。
由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串“Hello”永远包含字符H、e、l、l和o的代码单元序列,而不能修改其中的任何一个字符。当然,可以修改字符串变量greeting,让它引用另外一个字符串,这就如同可以将存放3的数值变量改成存放4一样。
这样做是否会降低运行效率呢?看起来好像修改一个代码单元要比创建一个新字符串更加简洁。答案是:也对,也不对。的确,通过拼接“Hel”和“p!”来创建一个新字符串的效率确实不高。但是,不可变字符串却有一个优点:编译器可以让字符串共享。
为了弄清具体的工作方式,可以想象将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。
总而言之,Java的设计者认为共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。查看一下程序会发现:很少需要修改字符串,而是往往需要对字符串进行比较(有一种例外情况,将来自于文件或键盘的单个字符或较短的字符串汇集成字符串。为此,Java提供了一个独立的类,在3.6.9节中将详细介绍)。
C++注释:在C程序员第一次接触Java字符串的时候,常常会感到迷惑,因为他们总将字符串认为是字符型数组:
这种认识是错误的,Java字符串大致类似于char*指针,
当采用另一个字符串替换greeting的时候,Java代码大致进行下列操作:
的确,现在greeting指向字符串“Help!”。即使一名最顽固的C程序员也得承认Java语法要比一连串的strncpy调用舒适得多。然而,如果将greeting赋予另外一个值又会怎样呢?
这样做会不会产生内存遗漏呢?毕竟,原始字符串放置在堆中。十分幸运,Java将自动地进行垃圾回收。如果一块内存不再使用了,系统最终会将其回收。
对于一名使用ANSI C++定义的string类的C++程序员,会感觉使用Java的String类型更为舒适。C++ string对象也自动地进行内存的分配与回收。内存管理是通过构造器、赋值操作和析构器显式执行的。然而,C++字符串是可修改的,也就是说,可以修改字符串中的单个字符。
Java基础知识之 throws和throw:声明和抛出异常 你好看官,里面请!今天笔者讲的是Java基础知识之 throws和throw:声明和抛出异常。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
Java基础知识面试题 this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
相关文章
- java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片
- java基础知识回顾之java Socket学习(二)--TCP协议编程
- java基础知识回顾之java Socket学习(一)--UDP协议编程
- java基础知识回顾之---java String final类普通方法的应用之“按照字节截取字符串”
- 【Java】java扩展机制SPI 实现
- 基础知识《四》---Java多线程学习总结
- JAVA学习(四):Java流程控制语句(顺序结构、if条件语句、switch条件语句、循环语句与跳转语句)
- Java实现【USACO】1.1.2 贪婪的礼物送礼者 Greedy Gift Givers
- java实现第六届蓝桥杯熊怪吃核桃
- Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
- 【JAVA】java中split以"." 、""、“|”分隔字符串
- 【JAVA】Java循环语句中的continue跳转进入下一次循环是否判断循环条件
- Java — java.lang.NullPointerException - 如何处理空指针异常
- Java 日期时间获取和显示
- java 连接数据库mysql的方法
- Java Instrumentation 内存马——主要是利用Instrumentation Java API来做内存注入,会用到反射机制,文中提到检测思路:注入jar包-> dump已加载class字节码->反编译成java代码-> 源码webshell检测
- 【java】Java 封装
- 【java】Java线程池实现原理及业务中的实践
- JAVA面向对象特征之——封装
- 如何提升Java基础知识?从这6点出发