既有适合小白学习的零基础资料,也有适合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 字符串常量不可变更
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)