Java中的String类_java中无string类(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

public class TestString{
	public static void main(String[] args)
	{
		String str1="hello";
		String str2=new String("hello");
		System.out.println(str1==str2);
	}
}

在这里插入图片描述
  ==本身就是进行数值比较的,如果现在用于对象比较,那么所比较的就应该是两个对象所保存的内存地址数值,而并没有比较对象的内容,所以比较结果是false。
在这里插入图片描述
  要想比较内容,则必须采用String类提供的equals方法。

public boolean equals(String anthorString)

public class TestString{
    public static void main(String[] args)
    {
        String str1="hello";
        String str2= new String("hello");
        System.out.println(str1.equals(str2));
    }
}

在这里插入图片描述
面试题:请解释String类“==”与“equals”的区别?

  • ==:进行的是数值比较,比较的是两个字符串对象的内存地址数值。
  • equals():可以进行字符串内容的比较。

1.3 字符串常量是String类的匿名对象

public class TestString{
	public static void main(String[] args)
	{
		String str1="hello";
		String str2=new String("hello");
		System.out.println(str1.equals(str2));
		System.out.println("hello".equals(str2));
	}
}

那么在之前所出现的String str="hello",本质上就是将一个匿名的String类对象设置有名字,而且匿名对象一定保存在堆内存当中。
如何判断用户输入的字符串等同于特定的字符串??

  • 比较方法1
    将特定字符写在后面:
public class TestString{
    public static void main(String[] args)
    {
        /\*\*
 str1为用户输入的字符串
 用户极有可能没有输入
 \*/
        String str1=null;
        System.out.println(str1.equals("hello"));
    }
}

在这里插入图片描述
  若用户没有输入,则会出现NullPointerException(空指针异常)

  • 比较方法2
    若将特定字符写在前面:
public class TestString{
    public static void main(String[] args)
    {
        /\*\*
 str1为用户输入的字符串
 用户极有可能没有输入
 \*/
        String str1=null;
        System.out.println("hello".equals(str1));
    }
} 

在这里插入图片描述
  字符串常量是String的匿名对象,该对象永远不可能为空,所以即使用户输入为空,也不会造成空指针异常。
  所以,以后在开发过程之中,如果要判断用户输入的字符串是否等同于特定字符串,一定要将特定的字符串写在前面。

1.4 String类两种实例化的区别

1.4.1 采用直接赋值
public class TestString{
	public static void main(String[] args)
	{
		String str1 = "hello" ;
		String str2 = "hello" ;
		String str3 = "hello" ;
		System.out.println(str1 == str2); // true
		System.out.println(str1 == str3); // true
		System.out.println(str2 == str3); // true
	}
}		

在这里插入图片描述
  之前说过String类是在堆上开辟空间,显然由上述代码可以知道str1、str2、str3只用了一块内存空间。

在这里插入图片描述
  为什么没有新开辟空间呢?
  String类的设计使用了共享设计模式

在JVM底层实际上会自动维护一个对象池(字符串对象池),如果现在采用了直接赋值的模式进行String类对象实例化操作,那么该实例化对象(字符串的内容)将自动保存到这个对象池之中,如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用;如若没有,则开辟新的字符串对象而将其保存在对象池之中供下次使用。
所谓的对象池就是一个对象数组(目的是减小开销)。

1.4.2 采用构造方法

在这里插入图片描述
  通过分析可知,如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存空间将会变成垃圾空间。除了这一缺点外,也会对字符串共享产生问题。

public class TestString{
	public static void main(String[] args)
	{
		String str1="hello";
		String str2= new String("hello");
		System.out.println(str1==str2);
	}
}

在这里插入图片描述
  str1!=str2,所以str2并没有保存在对象池中。
手工入池:public native String intern();

public class TestString{
	public static void main(String[] args)
	{
		String str1="hello";
		String str2= new String("hello").intern();
		System.out.println(str1==str2);
	}
}

在这里插入图片描述
面试题:请解释String类两种对象实例化的区别?

  • 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中供下次使用。
  • 构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动的保存在对象池中,可以使用intern()方法手工入池。

因此,我们一般会采取第一种方式即直接赋值。

1.5 字符串常量不可变更

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值