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);//trueSystem.out.println(str1.equals(str2));//true

使用字面常量的形式创建字符串时候,会先扫描常量池,例子中的str2创建的时候就会扫描,不会重复创建.

String str3=str2.substring(0,2);//字符串截取System.out.println(str3=="12");//falseSystem.out.println(str3.equals("12"));//true

字符串截取,看源码的时候 发现其实是使用new String 创建的,创建了对象没有加入常量池,所以内存地址不相同.==比较的结果是false
如果将截取的字符串加入常量池,再次比较.就会为true了

String str3=str2.substring(0,2).intern();//使用intern(),字符串加入常量池System.out.println(str3=="12");//trueSystem.out.println(str3.equals("12"));//true