Java字符串相关知识

mac2026-09-02  5

一.创建字符串: 1.直接赋值一个字符串常量。 2.通过new操作符创建一个字符串对象。 直接赋值:例:String S=“hello” 通过new来创建:例:String s=new String。 String是一个类,我们实际上是创建了一个用来操作字符串的引用。 注意:String的字符串无论创建方式为何,都是不可变的常量! 直接赋值的特点是在Java源代码编译生成的.class文件的常量池中生成了一个,常 量字符串,我们所创建的引用指向它。 注:常量池中只能有一份内容相同的字符串变量,但是堆上可以创建多个对象! new 操作符创建的引用是创建了一个指向堆中的引用。 直接赋值和new的主要区别就在于:直接创建生成的字符串是在.class的常量池里,也就是在编译的过程中就能知道的常量字符串;new创建的字符串,则是必须要在编译完成后才能在堆中存储的常量字符串。这两种不同的字符串,所存在的位置是不一样的,即也就是,这两种类型的引用是不一样的! (1)字符串的比较,== 和equals方法(面试考点): ** 首先:如果两个对象具有相同的类型以及相同的属性值,则称这两个对象相等。如果两个引用对象指的是同一个对像,则称这两个变量同一。 由于Object 类是所有类的最高基类,所有其他类都继承类Object类的equals()方法。Object类中定义的equals 函数原型为:public boolean equals(Object);他是判断两个对象是否同一,并不是是否相等。在java中 “==” 是判断两个对象是否同一,而不是判断相等。因此Object类中的equals方法也是判断两个对象是否同一所以要判断两个对象是否相等,就需要重写equals()方法。 而在比较字符串时,由于String类重写了equals方法,使其比较引用类型时,比较的是值。** (2)字符串的拼接(面试考点): 1.使用“+”拼接 2.String类中concat方法 使用+拼接 首先,强调一下String类的不变性:长度和内容是不可变的! 由于String的不可变性,+创建一个新的字符串对象,遇到+首先创造StringBuilder对象,使用该对象的append方法, 追加字符串,最终将StringBuilder转换为String字符串 而用concat方式拼接效率会更高,因为已经假定两个量都为字符串,做底层优化时不需要额外判断或转换就可以完成字符串拼接。 concat使用方法举例:

String a="a"; String b="b"; String c= a.concat(b);

此时c字符串的值为“ab”。 字符串的一些其他常用方法: length():求字符串的长度。 charAt(index):求字符串index位置的字符 toUpperCase():将字符串全部转换成大写 toLowerCase():将字符串全部转换成小写 trim():去掉字符串中的空格。 new 操作符得到的字符串对象,要用“.”来调用方法。 例:int a=c.length()就是定义一个int类型的变量,将字符串c的长度赋值给它。 String StringBulider StringBuffer之间的一些简单区别: 1.运行速度的区别:运行速度快慢为:StringBuilder > StringBuffer > String 2.String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。 总结:String适用于少量的字符串操作的情况,StringBuilder、StringBuffer 适用于在字符缓冲区进行大量操作的情况。 但是由于关键字的原因,StringBuilder适用于单线程,StringBuffer适用多线程下在字符缓冲区进行大量操作的情况。 例1:

String str1="abc"; String str2="de"; String str=str1+str2` //在该代码中,用String类要不断的创建新对象,但是如果用StringBuilder则只需直接操作故更加便捷。 ```java String str="abc"+"de"; StringBuilder stringBuilder=new StringBuilder().append("abc").append("de"); System.out.println(str); System.out.println(stringBuilder.toString()); //在该代码中str是直接定义的没有任何操作就得到了,但是StringBuilder则是经过了多种操作,故String更为便捷。

注:在String类中 String str="Hello"与String str=“He”+"llo"是两种完全一样的定义方法。

字符串例题: 判断字符串对象是否相同

String str1 = "hello"; //"hello"是final,str1不是final的,需要运行时才能确定值。 String str2 = "llo"; //"llo"是final的,str2不是final的,需要运行期才能确定值。 final String str3 = str2; //str3是final的,是编译期就可以确定的值,在编译的时候直接用str2取代。 //但是str2不是final的,需要运行期才能确定。 final String str4 = "llo"; //str4是final的,是编译期就可以确定的值,在编译的时候直接用"llo"取代。 //"llo"是final的,编译器就可以确定。 String str5 = "he" + str2; //"he"编译期可以确定,但是str2是运行期才可以确定, //所以这个“+”实际上就是生成了stringbulider然后再用tostring方法得到的 //tostring方法实际上就是new一个string让它等于stringbulider的内容。 String str6 = "he" + str3; //"he"编译期可确定,"str3"编译期确定直接替换为"str2",但是str2不是编译期可以确定 //所以str6同str5. String str7 = "he" + str4; //"he"编译期可以确定,"str4"是final的,编译期确定直接替换为"llo", //"llo"也是编译器可以直接确定的,故str7和str8的生成是类似的。 String str8 = "he" + "llo"; //string类型的“+”如果运算符两边都是可以确定的值,那么就不会执行new的操作。 //直接在常量池里边新建立一个运算之后的结果的字符串,这里就是str8的值直接等于hello的引用 //假如字符串常量池中现在只有"he"和"llo",那么相加后的结果就是在字符串常量池中直接生成一个新的"hello" System.out.println(str1 == str5);//false System.out.println(str1 == str6);//false System.out.println(str1 == str7);//true System.out.println(str1 == str8);//true

解析: str1是显式的String常量故放在常量池中, Stringbulider类的toString方法,本质上是重新new一个String出来然后让指向Stringbulider的对象的引用指向这个new出来的String对象。

最新回复(0)