@xmruibi
2015-05-03T19:24:26.000000Z
字数 3086
阅读 825
Java_Foundation
String is immutable (once created can not be changed ) object. The object created as a String is stored in the Constant String Pool.
Thread Safe, Sychronized; Mutable and stored in heap
Not sychronized, not thread safe;
java.lang.String类,不属于8种基本数据类型,String是一个对象,表示字符串常量。
因为对象的默认值是null,所以String的默认值也是null,但它又是一种特殊的对象,有其他对象没有的特性。
new String()和new String("")都是声明一个新的空字符串,是空串不是null。区别:空串是经过new运算符分配了内存,即实际存在了(定义了)。而null则没有(只声明),调用null的字符串的方法会抛出空指针异常。
从根本上认识java.lang.String类和String池
String对象的创建:
String的不可变性:
不可变字符串具有一个很大的有点:编译器可以把字符串设置为共享。
String类型是不可改变的,比如当你想改变一个String对象时,如:
String s = "abc"; s = "fuck";
JVM不会改变原来的对象("abc"),而是生成一个新的String对象("fuck",当然先检查String池中是否已经有"fuck"字符串对象,有则引用,无则新建),然后让s去指向它,如果原来那个"abc"没有任何对象引用它,虚拟机的垃圾回收机制会接收它。这样可以提高运行效率!
注意:Java中字符串内容的比较用的是专门的方法如equals,compareTo等。==比较的是字符串的引用是否相同。
字符串变量。可修改的字符串序列,该类的对象实体内存空间可以自动改变大小,便于存放一个可变的字符序列。
StringBuffer类有3个构造方法:
StringBuffer()
StringBuffer(int size)
StirngBuffer(String s)
当使用第1个无参数的构造方法时,分配给该对象的实体初始容量可以容纳16个字符,当该扩展字符序列长度>16时,实体容量自动增加以适应新字符串。
当使用第2个构造方法,可以指定分配给该对象的实体的初始容量为参数size指定的字符个数。当对象实体长度>size时自动增加。
当使用第3个构造方法,分配给该对象的实体的初始容量为参数字符串s的长度+16个字符,当对象实体长度大于初始容量时,实体容量自动增加。
StringBuffer对象可以通过length()放发获取实体存放的字符序列长度。通过capacity()方法获取当前实体的实际容量。
使用java.util.StringTokenizer类,分析一个字符串并分解成可独立使用的单词。
StringTokenizer类有两个常用构造方法:
StringTokenizer(String s):为字符串s构造一个分析器。使用默认的分隔符集合,即空格符(若干个空格符被看做一个空格)、换行符、回车符、Tab符、进纸符(\f)。
StringTokenizer(String s, String dilim):为字符串s构造一个分析器。参数dilim中的字符被作为分隔符。
把StringTokenizer对象称作一个字符串分析器。一个分析器可以使用nextToken()方法逐个获取字符串中的语言符号(单词),每当调用nextToken()时,都将在字符串中获得下一个语言符号,每获得一个语言符号,字符串分析器中负责计数的变量值自动减1,该计数变量的初始值等于字符串中的单词数目(可以用StringTokenizer对象调用countTokens()方法获得计数值)。
如:
String str="we are stud,ents";StringTokenizer fenxi = new StringTokenizer(str,", "); //使用空格和逗号做分隔符int count=fenxi.countTokens();while(fenxi.hasMoreElements()){String s = fenxi.nextToken();System.out.println(s);}System.out.println("共有单词:"+count+"个。");另外,StringTokenizer可以用String类的split函数代替String str="abc;bcd;efg";String[] splitStrs=str.split(";");for(int i=0;i<splitStrs.length;i++)System.out.println(splitStrs[i]);
StringBuilder类是从 JDK 5 开始新增的,此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。与StringBuffer类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。如果可能,建议优先采用该类,因为在大多数情况中,它比 StringBuffer 要快。注意:将 StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer类