一: java.lang.String,java.lang.StringBuilder,java.lang.StringBuffer
参考:http://blog.csdn.net/rmn190/article/details/1492013
1.String 字符串常量
String 类型和 StringBuffer 类型的主要区别在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候都等同于指向了一个新的字符串,所以需要经常改变内容的字符串最好不要用 String ,一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的。
2.StringBuffer 字符串变量(线程安全)
StringBuffer 对象代表一个字符序列可变的字符串,当一个StringBuffer对象被创建以后,通过其append,insert,reserse及setCharAt等方法可以改变这个对象的字符序列。
Java.lang.StringBuffer是线程安全的可变字符序列,一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容,可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中,append 方法始终将这些字符添加到缓冲区的末端,而 insert 方法则在指定的点添加字符。例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中,append 方法始终将这些字符添加到缓冲区的末端,而 insert 方法则在指定的点添加字符。例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
3.StringBuilder 字符串变量(非线程安全)
java.lang.StringBuilder类是JDK1.5新增的,此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快,两者的方法基本相同。
二: 字符串比较(equals,compareTo,==)
参考:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
http://blog.sina.com.cn/s/blog_69dcd5ed0101171h.html
1. 双等号==
(1)基本数据类型(也称原始数据类型)。byte,short,char,int,long,float,double,boolean 他们之间的比较,双等号==比较的是他们的值。(2)复合数据类型(类)
当他们用==进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号==进行比较的,所以比较后的结果跟双等(==)的结果相同。
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
{
System.out.println("s1 == s2");}
else{
System.out.println("s1 != s2");}
}
}
编译并运行程序,输出:s1 == s2说明:s1 与 s2 引用同一个 String 对象 "Monday"。
2.equals
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}
我们将s2用new操作符创建
程序输出:
s1 != s2
s1 equals s2
说明s1 s2分别引用了两个"Monday"String对象。
3. 常量池
三: Object类
四: 正则表达式
正则表达式是一个用于匹配字符串的模板,可以匹配一批字符串,所以创建正则表达式就是创建一个特殊的字符串。
五: String与基本数据类型间的转换
基本数据类型-->String
String类的ValueOf()方法,基本数据类型+" "
String-->基本数据类型
利用基本数据类型包装类提供的静态parseXxx(String s)静态方法,利用包装类提供的Xxx(String s)构造器
六: toString方法
该方法是Object类里的一个实例方法,所有的java类都是Object类的子类,因此所有的java对象都具有toString()方法。当java对象和和字符串进行连接运算时,系统自动调用java对象toString()方法的返回值和字符串进行连接运算。