Java :String类学习分享

1.前言

作为java学习的新手来说,都只会认为String 是在声明字符串的时候使用;其实你们会发现String在声明时单词的首写字母大写,所以String本身也是一个类,但是在使用时也会有很多要求,今天我就给大家分享一下我自己对String的学习分享。

2.实例化 String 对象

对于String其实可以直接赋值,代码如下:
方法一:

public class StringTest01{
    
    
public static void main(String args[]){
    
    
String name = "zjdzka"//实例化对象
System.out.println("姓名:"+name)}
}

String 的使用还有一种实例化方法,即直接调用String中的构造方法:
方法二:

public class StringTest02{
    
    
public static void main(String args[]){
    
    
String name = new String("zjdzka");//实例化对象
System.out.println("姓名:"+name);
}
}

2.String的内容比较

大家应该知道,对于基本数据类型可以通过”==“进行内容的比较。
那么我们用来比较一下字符串:

public class StringTest03{
    
    
public static void main(String args[]){
    
    
String str1 = "zjd";//直接赋值
String str2 = new String ("zjd");//通过new赋值
String str3 = str2;
System.out.println("str1 == str2-->"+(str1 == str2));
System.out.println("str1 == str3-->"+(str1 == str3));
System.out.println("str2 == str3-->"+(str2 == str3);
}
}

我们不妨猜一下结果?

在这里插入图片描述
通过结果我们发现,虽然String的内容都是一样的,可是运行的结果却不一样,这是为什么呢?
我给大家看一下内容分布图就知道了:
在这里插入图片描述
1. 每一个String对象的内存存储其实都是在堆内存中。
2. "=="是进行数值比较的,因为str1和str2的在堆内存的地址不一样所以:str1和str2不相等–>false

思考:那既然==无法判断,我们应该用什么呢?
其实在我们的java中,String类中有专门的判断方法:equals()。

public class StringTest04{
    
    
public static void main(String args[]){
    
    
String str1 = "zjd";//直接赋值
String str2 = new String ("zjd");//通过new赋值
String str3 = str2;
System.out.println("str1 equals str2-->"+(str1.equals(str2)));
System.out.println("str1 equals str3-->"+(str1.equals(str3)));
System.out.println("str2 equals str3-->"+(str2.equals(str3)));
}
}

我们再看一下结果:

在这里插入图片描述
因为equals()方法的作用是将内容进行比较,所以此处返回的结果都为true。

3.两种实例化对象的区别

在这里,我首先给大家声明一个重要的概念:
一个字符串就是一个String 类中的匿名对象,匿名对象就是已经开辟了堆内存空间可以直接使用的对象。
我们可以直接通过刚才的equals()来验证一个字符串是否就是一个匿名的对象。

public class StringTest05{
    
    
public static void main(String args[]){
    
    
System.out.println("\"hello\" equals \"hello\"-->"+("hello".equals("hello")));
}
}

从我们的运行结果可以发现:因为可以调用String类中的方法,所以野就证明了一个字符串也就是一个String类的匿名对象。

public class StringTest06{
    
    
public static void main(String args[]){
    
    
String str1 = "zjd";//直接赋值
String str2 = "zjd";
String str3 = "zjd";
System.out.println("str1 == str2-->"+(str1 == str2));
System.out.println("str1 == str3-->"+(str1 == str3));
System.out.println("str2 == str3-->"+(str2 == str3);
}
}

结果代码:
在这里插入图片描述
大家可以发现这次运行的结果,三个都是True.
注意: String str1 =“hello”;
实际上就是把一个在堆内存中开辟好的空间使用权给str1,并且如果一个字符串已经被一个名称所引用,则以后再有相同的名称的字符串声明时,就不会重新开辟新地址了
在这里插入图片描述

重点: 对于以上操作,在java中被称为共享,因为在java中形成一个对象池,在这个对象池中保存多个对象,新的实例化对象如果已经在池中定义,则不再重新定义,而是从池中直接取出使用。

而通过new的方式实例化的对象:

public class StringTest07{
    
    
public static void main(String args[]){
    
    
String str1 = new String("zjd");
}
}

一个字符串就是一个String的匿名对象,而通过new关键字,则再会开辟一个新的空间,但是两者的内容都是一样的还是hello,所以这种方式实际上开辟了两种空间内存。
在这里插入图片描述

4.字符串内容不可以改变

在String中还有一个特别重要的点:字符串的内容一旦被声明则不可能改变。

public class StringTest06{
    
    
public static void main(String args[]){
    
    
String str1 = "zjd";
str1 =str1+"zka";
System.out.println(str1);
}
}

在这里插入图片描述
运行结果是正确的,可是真的改变了内容嘛?
其实,内存占用图是这样的:
在这里插入图片描述

5.StringBuffer类

前面我说过String一旦声明了内容,则不能改变,如果改变也只是改变了地址,那么一个字符串要是被经常性的使用,我们用String类就会非常的不方便,今天,我就为大家引入一个可以改变字符串的StringBuffer类

拼接方式不同:

 //String类
 "hello" + "zjd"
 //StringBuffer类
 "hello" append "zjd"

注意: StringBuffer类和String类支持的方法大部分相似,但是StringBuffer类提升了代码的性能使用率较高。
代码应用:

public class StringBufferTest{
    
    
public static void main(String args[]){
    
    
StringBuffer buf = new StringBuffer();
buf.append("zjd");
for(int i=0;i<100;i++){
    
    
buf.append(i);
}
System.out.println(buf);
}
}

代码展示结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zjdzka/article/details/109522376