🔭学习内容
- 掌握String类的特点及其主要的操作方法。
- 对引用传递的概念更加清晰
✈️目录
🔭1、String
String本身是一个类本类,但是此类在使用时却有很多的要求,此类在Java中也算是一个比较特殊的类
(1)实例化String对象
- ✒️直接赋值
String name=“张三”;
一个字符串已经被一个名称所引用,以后再有相同的字符串声明时,不会再重新开辟空间
- ✒️调用String类中的构造方法
在String类存在构造方法:public String(String original)
String name=new String(“张三”);
一个字符串就是一个String类的匿名对象,使用new关键字,不管如何都会再开辟一个新的空间
(2)String的内容比较
- ✒️对于基本数据类型可以通过“==”进行内容的比较
⚜️比较基本数据类型:
int x=2;
int y=2;
System.out.println(x==y); //运行结果为true
⚜️比较字符串的内容:
String s1=“Hello”;
String s2=new String(“Hello”);
String s3=s2;
System.out.println(s1==s2); //结果为falseSystem.out.println(s1==s3); //结果为false
System.out.println(s2==s3); //结果为true
每个String对象的内容实际上都是保存在堆内存之中的,而且堆中的内容是相等的。但是对s1和s2来说,其内容分别保存在了不同的空间,所以即使内容相等,但是地址的值也是不相等的,==是用来进行数值比较的,所以s1和s2比较不相等。而s2和s3指向了同一个堆内存,所以相等。
- ✒️使用equals方法对String的内容进行比较
String s1=“Hello”;
String s2=new String(“Hello”);
String s3=s2;
System.out.println(s1.equals(s2)); //结果为trueSystem.out.println(s1.equals(s3)); //结果为true
System.out.println(s2.equals(s3)); //结果为true
equals()方法的作用是将内容进行比较,所以此处的返回结果都为true
(3)字符串的内容不可改变
字符串的内容一旦声明则不可改变
⚜️修改字符串内容:
String str=“Hello”;
str=str+“World!”; //此处结果为Hello World!
🧑🏽🍳String对象的内容真的改变了吗?下面通过内存分配图来说明
(4) String类中常用方法
⚜️下面介绍几种方法的具体应用
- ✒️字符串与字符数组的转换
字符串可以使用toCharArray()方法变成一个字符数组,也可以使用String类的构造方法把一个字符数组变为一个字符串。
⚜️代码如下:
public class Demo{
public static void main(String[] args){
String str1="Hello";
char[] c=str1.toCharArray(); //将字符串变为字符数组
for(int i=0;i<c.length;i++){
System.out.print(c[i]+"\t");
}
System.out.println();
String str2=new String(c); //将全部字符数组变为String
String str3=new String(c,0,3); //将部分字符数组变为String
System.out.println(str2);
System.out.println(str3);
}
}
⚜️运行结果:
H e l l o
Hello
Hel
- ✒️从字符串中取出指定位置的字符
可以直接使用string类中的charAt()方法取出字符串指定位置的字符。
⚜️代码如下:
public class Demo{
public static void main(String[] args){
String str="Hello";
System.out.println(str.charAt(3));//取出第四个字符
}
}
⚜️运行结果:
l
- ✒️把一个字符串变成一个byte数组,也可以把一个byte数组变成一个字符串
字符串可以通过getBytes()方法将String变为一个byte数组,然后可以通过String的构造方法将一个字节数组重新变为字符串。
⚜️代码如下:
public class Demo{
public static void main(String[] args){
String str1="Hello";
byte[] b=str1.getBytes();
System.out.println(new String(b));
System.out.println(new Srting(b,1,3);
}
}
⚜️运行结果:
Hello
ell
- ✒️取得一个字符串的长度
在String中使用length()方法取得字符串的长度。
⚜️代码如下:
public class Demo{
public static void main(String[] args){
String str="Hello ZhangSan";
System.out.println(" \"" + str + " \"的长度为:" + str.length());//取出第四个字符
}
}
⚜️运行结果:
"Hello ZhangSan " 的长度为:14
在数组操作中,使用length取得数组的长度但是操作的最后没有“()”,而字符串调用length是一个方法,只要是方法后面都有“()”。
- ✒️按照指定的字符串拆分字符串
在String可以通过split()方法拆分字符串,拆分的数据以字符串数组的形式返回。
⚜️代码如下:
public class Demo{
public static void main(String[] args){
String str="Hello World!";
String s[]=str.split(" ");//按空格进行字符串的拆分
for(int i=0;i<s.length;i++){
System.out.println(s[i]);
}
}
}
⚜️运行结果:
Hello
World!
🔭2、引用传递及基本应用
(1)引用传递
⚜️定义:所谓的引用传递就是指将堆内存空间的使用权交给多个栈内存空间。
- ✒️引用传递范例一
⚜️代码如下:
class Demo{
int temp=30;//属性暂不封装
}
public class Test{
public static void main(String[] args){
Demo d1=new Demo();
d1.temp=50;
System.out.println("调用前;"+d1.temp);
fun(a1);
System.out.println("调用后;"+d1.temp);
}
public static void fun(Demo d2){
d2.temp=1000;
}
}
⚜️运行结果:
调用前;50
调用后;1000
⚜️内存分析图如下:
- ✒️引用传递范例二
⚜️代码如下:
public class Demo{
public static void main(String[] args){
String str1="Hello";
System.out.println("调用前;"+str1);
fun(str1);
System.out.println("调用后;"+str1);
}
public static void fun(String str2){
str2="MLDN";
}
}
⚜️运行结果:
调用前;Hello
调用后;Hello
⚜️内存分析图如下:
(2)接收本类的引用
⚜️也可以在一个类中接收自己本类对象的实例
⚜️代码如下:
class Demo{
private int temp=30;
public void fun(Demo d2){
d2.temp=50;
}
public int getTemp(){
return temp;
}
public void setTemp(int t){
temp=t;
}
}
public class Test{
public static void main(String[] args){
Demo d1=new Demo();
d1.setTemp(50);
d1.fun(d1);
System.out.println("temp="+d1.getTemp());
}
}
⚜️运行结果:
temp=50