Java字符串相关知识

一.创建字符串:
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对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值