龙空技术网

java 核心技术-12版 卷Ⅰ- 3.6.3 字符串不可变

CC躺平混吃 81

前言:

现在大家对“java同类调用方法”大概比较讲究,同学们都想要了解一些“java同类调用方法”的相关资讯。那么小编同时在网上汇集了一些对于“java同类调用方法””的相关文章,希望同学们能喜欢,看官们快快来学习一下吧!

3.6.3 字符串不可变

这样做难道不会大大降低效率吗?看起来好像修改代码单元要比从头创建一个新字符串更简单。答案是:也对,也不对。的确,通过拼接”Hel”和”p!”来生成一个新字符串的效率确实不高。但是,不可变类有一个很大的优点:编译器可以让字符串共享。

为了弄清具体如何工作,可以想象各个字符串存放在一个公共存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串和复制的字符串共享相同的字符。

总而言之,Java的设计者认为共享带来的高效率远远超过编辑字符串(提取子串和拼接字符串)所带来的低效率。可以看看你自己的程序,你会发现,大多数情况下都不会修改字符串,而只是需要对字符串进行比较。(有一种例外情况,将来自文件或键盘的单个字符或较短字符串组装成更大的字符串。为此Java提供了一个单独的类,在3.6.9节中将详细介绍)。

C++注释

C程序员第一次接触Java字符串的时候,常常会感到迷惑,因为他们总是将字符串认为是字符数组:

char greeting[] = “Hello”;

这样对比是错误的,实际上,Java字符串大致类似于char* 指针,

char* greeting = “Hello”;

当把greeting 替换为另一个字符串的时候,Java 代码大致完成以下操作:

char* tmep = malloc(6);

strncpy(temp,greeting,3);

strncpy(temp +3,”p!”,3);

greeting = temp;

的确,现在greeting 指向字符串 “Help!”。即使最顽固的 C程序员也得承认Java 语法比一连串的 strncpy 调用要简洁得多。不过,如果再对 greeting 赋值会怎么样呢?

greeting = “Howdy”;

不会产生内存泄漏吗?毕竟,原始字符串在堆中分配。十分幸运,Java会自动完成垃圾回收。如果一个内存块不再使用了,系统最终会将其回收。

如果你是C++ 程序员,并使用 ANSI C++ 定义的string 类,会感觉使用 Java的String 类型更舒服。C++ string 对象也会自动完成内存的分配与回收。要通过构造器、赋值操作符和析构器显式完成内存管理。不过 C++字符串是可修改的,也就是说,可以修改字符串中的单个字符。

标签: #java同类调用方法 #java 比较两个字符串的相似度 #java比较两个字符串的相似度