🔭学习内容
掌握String类的特点及其主要的操作方法。
对引用传递的概念更加清晰
✈️目录
🔭1、String
(1)实例化String对象
(2)String的内容比较
(3)字符串的内容不可改变
(4) String类中常用方法
🔭2、引用传递及基本应用
(1)引用传递
(2)接收本类的引用
🔭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); //结果为false System.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)); //结果为true System.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