没有合适的资源?快使用搜索试试~ 我知道了~
String、StringBuilder和StringBuffer超详解
0 下载量 129 浏览量
2020-12-21
04:04:43
上传
评论
收藏 60KB PDF 举报
温馨提示
试读
2页
一、String类 String的部分源码如下 public final class String implements java.io.Serializable, Comparable, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 public String
资源详情
资源评论
资源推荐
String、、StringBuilder和和StringBuffer超详解超详解
一、一、String类类
String的部分源码如下
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
可以看出:
String类是final的。在java中,被final修饰的类是不允许被继承的,并且该String的成员方法都默认是final方法。
String实例的字符串的值是通过字符数组来存储的。
字符串一旦创建就不能改变字符串一旦创建就不能改变
String中的任何操作(substring、concat、replace等)都会重新生成一个新的字符串对象。而不是在原来的字符串的修改。
对于replace, 会创建新的字符串,然后将新字符串对象引用返回, 老的字符串会由垃圾回收机制处理。
二、字符串常量池二、字符串常量池
字符串的分配和其他对象分配一样,是需要消耗高昂的时间和空间的,而且字符串使用的非常多。JVM为了提高性能和减少内
存的开销。在实例化字符串的时候进行了一些优化:使用字符串常量池。使用字符串常量池。
每当我们创建字符串常量是,每当我们创建字符串常量是,JVM会首先检查字符串常量池,如果该字符串已经存在于常量池中,那么就直接返回常量池中会首先检查字符串常量池,如果该字符串已经存在于常量池中,那么就直接返回常量池中
的实例引用。如果字符串在常量池中不存在,就会实例化该字符串并将其放到常量池中。由于的实例引用。如果字符串在常量池中不存在,就会实例化该字符串并将其放到常量池中。由于String字符串的不可变性,常量字符串的不可变性,常量
池中不会存在两个相同的字符串。池中不会存在两个相同的字符串。
三、创建字符串的两种基本形式区别分析三、创建字符串的两种基本形式区别分析
String s1 = “str”;
在编译期就对常量池进行判断是否存在该字符串。不存在就会创建字符串实例再返回实例的引用给s1,存在就直接返回.编译
期的常量池是静态常量池。编译器会尽可能多的将已知的字符串拼接,比如String s1 = “str” + “ing”; 则在常量池中是“string”。
String s3 = new String(“str”);
一定会在堆里创建对象。JVM先检查字符串常量池,如果不存在,就会实例化该字符串并将其放到常量池中,然后在堆中复制
该对象的副本,然后将推中对象的地址赋值给引用s2. 此时是运行期,字符串常量池是运行时常量池。
@Test
public void create_string() {
String s1 = "str"; //创建字符串方式一
String s2 = "str";
String s3 = new String("str"); //创建字符串方式二
String s6 = new String("str");//会创建对象,但是跟s1/s2/s3在常量池中指向同一个
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s3==s6);//判断的是地址,所以不一样
}
weixin_38590541
- 粉丝: 6
- 资源: 937
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0