1. 原由:字符串恒等推断
//String is reference type String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1==str2); // false System.out.println(str1.equals(str2)); // true
在线进修视频分享:java在线进修
2. 关联操作符 “==”
要点:“==”只可以处置惩罚基础数据范例对应值的恒等推断,不实用援用数据范例(其值存的是地点)
public class Main { public static void main(String[] args) { int n=3; int m=3; // true System.out.println(n==m); String str = new String("hello"); String str1 = new String("hello"); String str2 = new String("hello"); // false System.out.println(str1==str2); str1 = str; str2 = str; // true System.out.println(str1==str2); } }
n==m效果为true,这个很轻易明白,变量n和变量m存储的值都为3,肯定是相称的。而为什么str1和str2两次比较的效果差别?要明白这个实在只需要明白基础数据范例变量和非基础数据范例变量的区分。
Java中的8个基础数据范例
浮点型:float, double;整型:byte, short, int , long; 字符型: char; 布尔型: boolean。
关于这8种基础数据范例的变量,变量直接存储的是“值”,因而在用关联操作符==来举行比较时,比较的就是 “值” 自身。要注意浮点型和整型都是有标记范例的,而char是无标记范例的.
关于非基础数据范例的变量(援用范例),如String范例,援用范例的变量存储的并非 “值”自身,而是与其关联的对象在内存中的地点。如,str1并非直接存储的字符串"hello",而是该对象所对应的地点。
因而在用==对str1和str2举行第一次比较时,获得的效果是false。由于它们离别指向的是差别的对象,也就是说它们现实存储的内存地点差别。 而在第二次比较时,str1和str2同时指向了str指向的对象,那末获得的效果毫无疑问是true(地点雷同)。
3. Object要领 “equals()”
equals要领是基类Object中的要领,因而关于一切的继续于Object的类都邑有该要领。 在Object类中,equals要领是用来比较两个对象的援用是不是相称,即是不是指向同一个对象.
public class Main { public static void main(String[] args) { String str1 = new String("hello"); String str2 = new String("hello"); // true System.out.println(str1.equals(str2)); } }
String类对equals要领举行了重写,用来比较指向的字符串对象所存储的字符串是不是相称。 其他的一些类诸如Double,Date,Integer等,都对equals要领举行了重写用来比较指向的对象所存储的内容是不是相称。
小结:
关于==:假如作用于基础数据范例的变量,则直接比较其存储的 “值”是不是相称; 假如作用于援用范例的变量,则比较的是所指向的对象的地点
关于equals要领:假如没有对equals要领举行重写,则比较的是援用范例的变量所指向的对象的地点; 诸如String、Date等类对equals要领举行了重写的话,比较的是所指向的对象的内容(equals要领不能作用于基础数据范例的变量)。
更多相干文章教程请接见:java入门
以上就是java中字符串恒等推断的细致内容,更多请关注ki4网别的相干文章!