ziJava学习笔记

java基础——String

2016-12-05  本文已影响66人  陈晨_Fly

特性

不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。以下几点保证了String的不可变性:

成员变量

private final char value[];
private final int offset;
private final int count;

其中,value存放具体字符串,offset表示偏移量,count表示char的数量。同时注意到,三者均为final修饰,根据java中final的要求所修饰变量要么在声明时候初始化,要么在构造函数中初始化。

常量池

jvm虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集合,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。

对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。常量池中保存着很多String对象; 并且可以被共享使用,因此它提高了效率。
字符串常量池优势:

// str1指向在常量池中生成一个字符串123
String str1 = "123";
// str2通过new的形式指向了堆中生成的字符串,常量池中已经有123
String str2 = new String("123");
// str3在常量池和堆中各生成一个字符串,自身指向堆中数据
String str3 = new String("456");

常见问题

String s1 = new String(“xyz”); 创建了几个对象?

String真的不能修改吗?
可以用反射完成String修改,参考如下demo:

Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
char[] value = (char[]) valueField.get(s);
value[5] = '_';

java.lang.String.intern()本质

上一篇下一篇

猜你喜欢

热点阅读