1,javaSript
var str1="123";
var str2="123";
console.log(str1==str2);//true
console.log(str1===str2);//true
这个没什么要说的
js里面引入了严格执行的=== 符号,两个等号和三个等号的区别在于
1,""表示 等同,会在比较之前进行类型转换,将等号两边转换成相同的类型进行比较,就算类型不同,只要值一样,就可以
2,"="表示相等,不会进行类型转换
var str3=123;
console.log(str1==str3);//true
console.log(str1===str3);//false
进行字符串截取的时候和上面的相同,不会出现Java里面的截取之后不相等的情况
var str4=str2.slice(0,2);
console.log(str4=="12");
console.log(str4==="12")
2,Java
关于字符串常量池可以先看这边文章:Java中的字符串常量池详细介绍
1,""是属于运算符号,等号两边是基本数据类型的时候,仅仅是比较值的异同,当等号两边是字符串等引用类型的时候,就会比较引用类型的地址,只有地址相同的时候才会相等
2,equals是方法,比较的双方只能是引用类型,equals源码是通过 比较内存地址的,一般的类都会重写equals方法,比较两个的值,String里面就是这样
String str1="1234";
String str2="1234";
System.out.println(str1==str2);//true
System.out.println(str1.equals(str2));//true
使用字面常量的形式创建字符串时候,会先扫描常量池,例子中的str2创建的时候就会扫描,不会重复创建.
String str3=str2.substring(0,2);//字符串截取
System.out.println(str3=="12");//false
System.out.println(str3.equals("12"));//true
字符串截取,看源码的时候 发现其实是使用new String 创建的,创建了对象没有加入常量池,所以内存地址不相同.==比较的结果是false
如果将截取的字符串加入常量池,再次比较.就会为true了
String str3=str2.substring(0,2).intern();//使用intern(),字符串加入常量池
System.out.println(str3=="12");//true
System.out.println(str3.equals("12"));//true