本文共 2259 字,大约阅读时间需要 7 分钟。
Java中的String是一个类,而并非基本数据类型。
string是值传入,不是引用传入。
对String的修改其实是new了一个StringBuilder并调用append方法,然后调用toString返回一个新的String。
所有 new 的对象都会在 Heap 中
多次创建相同的字符串文字,只存储每个不同字符串值得副本
编译期字符串常量会被自动留驻
运行期字符串留驻:调用intern()把创建的字符串拘留在方法区
创建的是不可变对象
方法不会改变它自身,而是返回一个新的字符串
如果需要一个字符串被修改,我们最好使用 StringBuffer 或者 StringBuilder,否则,由于每次操作字符串都会创建一个新的对象,而旧的对象不会有引用指向它,这样我们会浪费很多垃圾回收的时间
不可继承
对String类型最好的重用方式是关联(HAS-A)而不是继承(IS-A)。
length()获取字符串的长度
indexOf()搜索字符串出现的位置
charAt()获取指定索引的字符
trim()去除首位空格和制表符(\t)
replaceAll(reg,s)替换指定的所有字符
str.startsWith(),str.endWith()判断字符串的开始和结束
str.toLowerCae()和str.toUpperCase()字母大小写转换
str.split(String sign)和str.split(String sign,int limited) 字符串分割
str.format(格式,参数) 格式化字符串
str1.concat(str2); 方法合并字符串:
tail()表示取字符串的尾部
head()表示取字符串的头
concat()表示字符串拼接。
slice() 方法可从已有的数组中返回选定的元素。
reverse() 方法用于颠倒数组中元素的顺序。
StringBuffer允许多线程进行字符操作。 这是因为在源代码中StringBuffer的很多方法都被关键字 synchronized 修饰了,而StringBuilder没有。
StringBuffer是在StringBuilder基础上加锁,加锁是一个重量级的操作,需要调用操作系统内核来实现,比较耗时。
StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选。
StringBuilder是JDK 1.5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer略高。
StringString(大姐,出生于JDK1.0时代) 不可变字符序
<StringBuffer(二姐,出生于JDK1.0时代) 线程安全的可变字符序列
<StringBuilder(小妹,出生于JDK1.5时代) 非线程安全的可变字符序列
JVM运行程序主要的时间耗费是在创建对象和回收对象上。
String str = hello"+"java";
在编译时就能确认,编译器会直接将其拼接成一个字符串放在常量池:“hello java”;
String a ="hello";String b = "java";String c = a+b;
运行时才会确认c,编译器不会进行优化
字符串池(String intern pool)是方法区域中的一个特殊存储区域。
当创建一个字符串时,如果该字符串已经存在于池中,那么返回现有字符串的引用,而不是创建一个新对象。
所以说,如果一个字符串是可变的,那么改变一个引用的值,将导致原本指向该值的引用获取到错误的值
字符串的hashcode在Java中经常使用。
在HashMap或HashSet中,不可变保证hashcode始终是相同的,这样就可以在不担心更改的情况下兑现它。
这意味着,不需要每次使用hashcode时都计算它。这样更有效率。
String被广泛用作许多java类的参数,例如网络连接、打开文件等。
如果字符串不是不可变的,连接或文件将被更改,这可能导致严重的安全威胁。
该方法认为它连接到一台机器上,但实际上并没有。可变字符串也可能导致反射中的安全问题,因为参数是字符串。
由于不可变对象不能被更改,所以它们可以在多个线程之间自由共享。这消除了同步的需求。
转载地址:http://mofli.baihongyu.com/