博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java核心技术卷I基础知识3.6.3 不可变字符串
阅读量:7052 次
发布时间:2019-06-28

本文共 1142 字,大约阅读时间需要 3 分钟。

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++字符串是可修改的,也就是说,可以修改字符串中的单个字符。

转载地址:http://lmvol.baihongyu.com/

你可能感兴趣的文章
【GIT-1】GIT 的基础教程 创建,添加,更替,追溯版本库
查看>>
【原创】公司自研缓存系统UPU的总结
查看>>
一个JavaScript的简单通用验证
查看>>
phpstorm 安装 及 使用 去掉名称类型提示
查看>>
Xp sp3 创建进程的堆栈
查看>>
Log4j的扩展-支持设置最大日志数量的DailyRollingFileAppender
查看>>
IT行业¬——Linux
查看>>
linkerd ab部署测试
查看>>
#日常杂记#Informatica 910 常见问题及可能的解决方法
查看>>
Spring Cloud Gateway 之 Only one connection receive subscriber allowed
查看>>
VoltDB 简介
查看>>
编译日志
查看>>
FieldType in Lucene
查看>>
为面试准备的知识点
查看>>
使用 CXF 做 webservice 简单例子
查看>>
Spring MVC之@RequestMapping 详解
查看>>
IE9开始支持SVG格式(VML终结)
查看>>
【转】PHP中的Hash算法
查看>>
SqlLite的工具类SQLiteOpenHelper
查看>>
chgrp chown chmod
查看>>