1.关于String类,主要由以下3个点:
(1)String类是final类,内容一旦声明就不可改变;
(2)String变量有两种赋值方式:直接赋值和用new开辟内存空间;
(3)String类是Java共享模式的一种应用;
2.String对象的比较,"==”和“equals”:
(1)对于“==”而言,在int或其他基本数据类型之中,可以使用“==”进行是否相等的验证,但在String中,因为String本身虽然可以直接像基本数据类型那样直接赋值,但是其用“==”比较时依然要依靠内存的指向;“==”如果直接应用在字符串上进行比较,则表示比较的是内存地址的值;
(2)如果要比较字符串里面的内容,则肯定要使用一个方法:此方法为String类的内部提供的一个方法:public boolean equals(String str) ==> 比较两个字符串是否相等;equals比较两个字符串的内容是否相等的;
由于String类是final类,虽然当我们想要用代码去改变其内容时看到的似乎是改变了字符串的内容,但是实际上我们只是改变了String变量的地址指向,下面我们以一个例子来进行分析:
例:String str = "ab";
String str += "cd";
实际我们可以看到最后得到的变量str的字符串内容是abcd,但是我们分析便知其中的原理;首先匿名对象"ab"在对内存中开辟了内存空间,然后String变量str指向"ab"所在的内存,然后到了第二句代码,匿名对象"cd"也在堆内存中开辟了内存空间,然后在执行期进行字符串连接操作,得到了字符串"abcd",然后"abcd"也会在对内存中要空间,所以最后str指向新的内存地址,即"abcd"所在的内存地址,所以说实际上只是改变了String变量的地址指向;注意:在以后的编程中,不要以这样的方式试图去改变字符串内容,这样很影响程序的性能,因为每一次的改变都需要变量对内存地址引用的连接和断开。
综上,我们可以引入下一个点,即StringBuffer类,String的缓冲操作,这个类所声明的变量是可以改变的。
3.StringBuffer
(1)StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类;如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
(2) 在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。
(3)但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。
(4)由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
4.关于String的两个内在特别理解
(1)例:
String str1 = "a";
String str2 = "a";
System.out.println(str1 == str2);
上面输出的是true;在String类中,如果一个字符串已明确有了一个对象的指向,则以后其他的String对象如果声明的内容是一样的,则他们自动指向同一个空间。
(2)对于String str = new String("a")的理解
首先匿名对象"a"在堆内存中开辟了内存空间,然后new String("a") 使用new在堆内存中又开辟了一个空间“a”,最终str指向最后生成的那个"a"的内存空间,而最早的那个“a”就没使用到;
综合以上来说,肯定是直接使用赋值的方式比较合适一些,因为只产生一个对象,而如果使用new 关键字开辟,则会产生两个对象。
5.String类常用方法汇总
(1)求出字符串的长度:public int length() ;
(2)将一个字符串变为字符数组:public char[] toCharArray();
(3)将一个字符串按指定的字符分割:public String[] split() ;
(4)截取字符串
public String subString(int beg)
public String subString(int beg,int end)
(5)替换方法,把一个字符串中的某个指定的字符替换成其他内容
public String replaceAll(String 原字符串,String 要替换的新字符串)
(6)去掉左右空格,输入数据的时候常使用
public String trim() ;
(7)判断一个字符串是否以指定的字符串开头或结尾
public boolean startsWith(String str):判断是否以str开头
public boolean endsWith(String str):判断是否以str结尾
(8)查找在一个字符串中是否有指定的字符串存在。
public int indexOf(String str):查找在一个字符串中是否包含了str,如果包含了,则返回位置,如果没有查到,则返回-1;
6.总结
(1)String类是不可改变,如果要改变,改变的是内存地址的指向
(2)String类两种赋值方式的区别,使用直接赋值
(3)String的内容比较使用equals,==比较的是内存地址的值