JAVA字符串(String)基本原理

mac2024-01-31  53

参考链接: https://blog.csdn.net/u012396308/article/details/46998187 参考链接: https://blog.csdn.net/AlbenXie/article/details/89739172

不同于C,C++,在Java中,String是引用数据类型,且java对其进行了特殊的处理,提供专有的String支持。

String对象

注:String对象内容是不可以改变的

String的实例化

直接赋值实例化: String 对象=内容。 在实例化时,只会开辟一块对内存空间,并且对象可以自动入池以实现对象之间的共享构造方法实例化: String 对象=New String(内容)【相当于调用了String类的构造方法,public String (String s)】 在实例化时,会开辟两块堆内存空间,其中堆内存开辟出的内存空间会成为垃圾,实例化的对象也不会自动入池,需要利用intern()进行手动入池 eg: public class P{ public static void main(String args[]) { String str=new String("hello").intern(); String str1=new String("hello"); String str2="hello"; System.out.println(str1==str); //false --str与str1开辟出了两块堆空间 System.out.println(str==str2); //true --str入池,str2会在对象池中寻找,所以二者地址相同 System.out.println(str2==str1); //false --str2地址与str相同,故于str1不同 } }

匿名对象

只有堆内存,没有栈内存的引用空间,用new xxx()进行调用。对象在使用一次后就会成为垃圾,所以只能使用一次。 eg: new Person(“张三”).getInfo() 而String的直接实例化本质就是为字符串的匿名对象起了一个名字

对象池

针对于几个特殊的类使用了共享设计的思路。在进行直接赋值实例化String时,字符串内容定义之后,会自动将自己保存到对象池之中,若此时其他的字符串也采用了直接赋值,并且内容完全相同,那么不会开辟新的堆内存空间,而是通过对象池直接找到堆内存空间地址而直接引用。为共享设计模式

String的比较

==:是java本身提供的关系运算符,进行数值的比较,比较的是地址(是否为同一个对象)equals:是String类的方法,比较的是字符串的内容,又因为子u穿的匿名对象永远不可能为null,故在进行equals进行比较时,应尽量使用:匿名对象.equals(String对象)来防止空指针异常。

String内置方法的使用:

略(请下载javaAPI进行查找)

StringBuilder与StringBuffer

StringBuilder与StringBuffer都继承与抽象类AbstractStringBuilder ,且底层都是用的char数组(jdk9之后用的是byte数组)

StringBuilder

在单线程情况下,如有大量的字符串操作情况,应该使用StringBuilder来操作字符串。

StringBuffer

在多线程情况下,如有大量的字符串操作情况,应该使用StringBuffer。StringBuffer源码在每个方法前加了关键字Synchronized,保证了线程安全 其余在底层上,但在效率上比StringBuilder低。StringBuffer与StringBuilder实现方法相同

底层源代码:https://blog.csdn.net/u012396308/article/details/46998187 底层源代码: https://blog.csdn.net/AlbenXie/article/details/89739172

(源代码)实现原理

StringBuilder与StringBuffer,首先在实例化时定义了一定长度的char数组,添加字符串时,若添加的字符串长度小于数组长度,则可以直接添加。若大于数组长度,则扩充容量,最后声明的新数组进行对原数组进行拷贝并添加新的字符串内容。

相互转换

StringBuffer向String转换: (1)任何对象都有toString()方法,用于转换为字符串(Object的方法) (2)利用“+”进行连接String 向StringBuffer转换: (1)通过StringBuffer构造方法, (2)先进行StringBuffer实例化,在通过append()进行调用。 public static void main(String args[]){ String str1="hello word!!"; StringBuffer sb1=new StringBuffer("I am Cyc"); StringBuffer sb2=new StringBuffer(str1); //通过构造方法将StringBuffer转换为String StringBuffer sb3=new StringBuffer(); String str2=sb1.toString(); //通过toString()方法将StringBuffer转换为String String str3=sb1+""; //通过“+”将StringBuffer转换为String sb3.append(str1); //通过append()将String转换为StringBuffer System.out.println("str2为"+str2); System.out.println("str3为"+str3); System.out.println("sb2为"+sb2); System.out.println("sb3为"+sb3); }

相比于String类,StringBuffer与StringBuilder拥有reverse(),insert()方法,与delete()方法可以进行字符串的快速处理。

最新回复(0)