我们可以参考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里的字符串. 1.3 为什么说java里的字符串是常量, 不可修改的. 1.3.1 一般的类指向的是变量关于这点, 需要对比才能讲得清楚.
这里我们利用1个自定的类来举个例子:
[java] view plaincopy