十.String类特点分析

1.String类对象实例化的两种方式

语法:

  • String 变量名 = “值”;
  • String 对象名 = new String(“值”);

第一种跟数据类型赋值一样,直接赋值就行了。第二种和new对象一样,因为String不是数据类型而是一个类,所以String类有构造方法,用构造方法来赋值就行了。

public String(String str)… 构造方法的参数列表还有一个String

例子:

public class Test {
	
    public static void main( String[] args ){
    	String stra = "值";
    	
    	String strb = new String("值");
    
    	System.out.println(stra);
    	System.out.println(strb);
    }
}

2.String类对象两种实例化比较

实例化:

  • 直接赋值:String str = “值”;
  • 构造赋值:String str = new String(“值”);

直接赋值

public class Test {
	
    public static void main( String[] args ){
    	String stra = "word";
    	String strb = "holle";
    	String strc = "holle";
    	String strd = "holle";
    	
    	System.out.println(stra);
    	System.out.println(strb);
    	System.out.println(strc);
    	System.out.println(strd);
    }
}

在这里插入图片描述

因为JVM底层都会有一个对象池,而当使用直接赋值的时候会把String对象里面的值存储在对象池中。当你用直接赋值实例化一个String对象,它的值就存入了对象池,然而在用直接赋值实例化一个String,对象池会分析这个值和在对象池里的值是不是相同的内容,如果是就直接引用,如果不是就开辟一个空间用来存放新的值。

构造赋值

public class Test {
   
   public static void main( String[] args ){
   	String stra = new String("holle");
   
   	System.out.println(stra);
   }
}

在这里插入图片描述

构造方法public String(String str) 它new对象开辟一个空间,然后方法参数又有个String对象所以会开辟两个,但是我们调用的是new 对象指向的空间,另外一个被当做垃圾空间来处理,这样会很浪费空间。

因为是构造赋值所以是没有把值存入到对象池中的,当然我们可以自己手动加入对象池

public class Test {
	
    public static void main( String[] args ){
    	String stra = new String("holle").intern();
    
    	System.out.println(stra);
    }
}

intern()方法就是把值加入到对象池.

总结
  • 直接赋值的方式只会开辟一个空间,把值存入到对象池中,不会给相同的值内容重新开辟空间直接引用
  • 构造赋值的方式会开辟两个空间,其中一个会被当做垃圾空间处理,不会把值存入到对象池中,可以手动加入到对象池intern().

3.字符串比较

有两种比较的方式,先来看第一种“==”

public class Test {
	
    public static void main( String[] args ){
    	String stra = "abc";
    	String strb = new String("abc");
    	String strc = stra;
    	
    	System.out.println(stra == strb);	//false
    	System.out.println(stra == strc);	//true
    }
}

“==”是判断两个字符串是否指向同一个地址,因为strb是new对象定义的所以没有存入到对象池,这样就和stra不是指向同一个地址的所以为false,而strc是和stra指向同一处地址所以为true。

在这里插入图片描述
第二种“equals()”

public class Test {
	
    public static void main( String[] args ){
    	String stra = "abc";
    	String strb = new String("abc");
    	String strc = stra;
    	
    	System.out.println(stra.equals(strb));	//true
    	System.out.println(stra.equals(strc));	//true
    }
}

这种是String里面自带的方法用来比较两个字符串的内容是否相同,这里我就不画图了。

总结
  • “==”:只对String判断两个字符串地址是否相同,对于数据类型是用来判断两个值是否相同。
  • “equals”:String类自带的方法,判断两个字符串的内容是否相同。

4.字符串常量

字符串常量就相当于一个匿名对象,在没有被赋值的情况下被双引号括起来的0个或者多个字符就是字符串常量。

String str = "holle";

像直接赋值就是给匿名对象一个名字好方便调用,构造赋值也差不多一样。

给大家看一个例子

public class Test {
	
    public static void main( String[] args ){
    	String stra = "holle";
    	String strb = "wole";
    	
    	
    	System.out.println("1212");
    	System.out.println("holle".equals(stra));	//true
    	
    }
}

匿名对象因为没用调用的名字所以定义的时候就直接用“”括起来就行了,因为是String常量所以也是可以调用String类的所有方法,匿名对象是由系统自动生成的不用用户自己去创建了

如果要判断字符串是否是你想要的那个,把匿名对象放到前面输入你想要的字符串,这样就不会因为字符串为null而报错了,因为为null不能调用String类的方法

5.字符串对象常量池

给大家分析一下常量池

public static void main(String[] agre){
	String str = "abc";		//用直接赋值的方式就会把值存入到常量池中
	String stra = new String("abc");		//用构造赋值的话是把值存储到堆内存中
	String strb = "abc";
	String strc = "aaa";		
}

在给大家画个图
在这里插入图片描述

因为用直接赋值的方式String的值会存入到常量池而构造赋值不会,每个存入到常量池的值都会做做个比较,如果值相同就直接引用已有的就行了,如果没有再开辟一个空间存储。
intern()函数可以帮助构造赋值存入常量池

6.字符串修改分析

注意一点字符串是不可修改的,平常我们在字符串后面追加字符或者直接修改字符,看起来是原来的其实不是,而是新开辟了一个空间用来存储追加或修改后的字符串,而之前的存储的字符串空间就被当做垃圾空间不再引用。

public class Test {
    public static void main( String[] args ){
    	String stra = "holle";
    	String strb = "wole";
    	
    	stra += "holle wold";
    	strb = "abc";
    	
    	System.out.println(stra);
    	System.out.println(strb);
    }
}

在这里插入图片描述

因为字符串是被final给修饰的,final我后面讲

如果你定义一个字符串name,给它修改1000次,那么你将获得1000个垃圾。

7.主方法组成分析

public static void main(String[] args){
	
}
  • public:访问权限修饰符,表示公开的
  • static:静态修饰,表示用类名运行
  • void:表示无返回值
  • main:是一个系统定义好的方法名称
  • String[] args:字符串的数组,运行时可以接受参数

注意每个单词都是用空格隔开的,写好之后就可以在主方法里面写输出代码了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值