[转]Java里的字符串, String类简单介绍

我们可以参考jdk api中文里对String类的解释:

public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

由上面的解析我们见到几个不易理解的地方:

例如: 

字符串是常量?

它们的值不能改?

因为..所以..  这什么逻辑?

在实际编程当中, 我们觉得字符串变量的值可以更改的呀?

本人认为, 大家没必要担心自己的理解能力, 中文jdk api的翻译实在是很没有节操的.

上面解释的最后一句话的原文是这样的:

Strings are constant; their values cannot be changed after they are created.String buffers support mutablestrings. Because String objects are immutable they can be shared

本人渣翻:

字符串是常量; 它们的值一旦创建不能更改. 然而String类的引用(变量 or 内存)却可以指向不同的字符串. 是因为字符串对象虽然是不能修改的, 但是它们的地址可以共享.

原文和本人翻译都有两种颜色的单词,  红色就是指上面第一个概念字符串.  而蓝色指的另1个概念String类.

相信即使本人修改了翻译, 仍然会有人觉得还是不能理解, 请往下看:

1.2 java里字符串的定义

注意这个不是String类的定义哦, 定义如下:

Java里的字符串就是存放于数据区(静态区)以Unicode编码的字符集合.

可见java里的字符串跟c语言的字符串如下两个本质上的区别:

1.2.1 Java里字符串用Unicode编码

c语言中的字符串里面的字符串是用ASCII编码的, ASCII只用1个字节(byte)的内存表示1个字符. 但是1个字节的内存数量不足以表示全世界那么多种字符.

例如1个汉子就需要2个字节来表示.

所以c语言里的某些字符处理函数, 如果参数传入1个汉字可能就会出错, 因为毕竟字符的占用内存长度不同.

而Unicdoe也叫万国码, 它用两个字节去表示任何1个字节, 无论是字母还是汉字. 所以利用java来做内存处理更加方便, 跨平台性非常好.

缺点就是比c语言字符处理更加耗内存.

1.2.2 Java里字符串存放在数据区(静态区).

我之前的博文见过, java程序类似于c语言, 运行时会把程序占用的内存大致分割成几个部分.

分别是

stuck(栈区), Heap(堆区), Data(数据区)和代码区 

其中数据区用于存放静态变量和字符串常量.

见下图

一, Java里的字符串.

[转]Java里的字符串, String类简单介绍

1.3 为什么说java里的字符串是常量, 不可修改的. 1.3.1 一般的类指向的是变量

关于这点, 需要对比才能讲得清楚.

这里我们利用1个自定的类来举个例子:

[java] view plaincopy

在CODE上查看代码片

派生到我的代码片

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdwyj.html