java 关于String的问题,以下第一种比较方法为什么结果和第二种不一样?

一:

String s1 = "hello" ;
String s2 = "hello" ;
System.out.println(s1==s2) ;
System.out.println(s1.equals(s2)) ;
出来的结果都为true
二:
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
出来的结果第一个为false,为什么呢?
此外:
char a [] = {'h','e','l','l','o'} ;
System.out.println(s1.equals(a)) ;
System.out.println(s1.equals(new String (a))) ;
为什么第一个不可以呢?

先多谢各位的热心解答!

这个涉及到java常量池的知识和==,equals的区别。
对于第一种情况 你只是在s1的时候在常量池创建了 hello 当你在s2使用时 因为常量池已经存在 所以直接将s2链接在上面
对第二种情况 你是在常量池中创建了两个hello 这种操作是安全的 因为不会引起元有对象的改变
== 和 equals有点区别
==表示的是两个二者是同一个对象(可以理解为具有相同的地址)。
而equals是指二者具有相同的内容
所以第二个会出现错误
你可以加我qq 3091972872 一起学习。

equals ,只要值相同,==内存地址相同,内存地址相同,字面量的值一定相同。但是值相同,内存地址不一定相同。

还有一个问题 你使用 a[] 是创建了一个索引 他表示的是a[]这个对象类型 但是他却并没有映射到相应的物理地址上 那么这时候你直接赋值肯定会出现错误
我知道的一种写法是char[] a = new char[]{'a','b'};

看看equal实现。弄清楚 字符串常量 对象引用。这个问题就清晰了

首先你要区分好 “==”和equals,
==
1)当比较的是基本类型变量时,而且都是数值类型(不一定要求数据类型严格相同),只要两个变量的值大小相等,就会返回true.
例如 int it = 65; float f1 = 65f; 判断”it == f1“是返回true的
2)当比较的是引用类型时,只有两个引用类型它们所指向的是同一个对象时,==判断才会返回true.

equals
  Object类中的equals()方法,当用来比较两个引用类型时,与==是一样的,两个引用类型指向对一对象,则返回true.  因此Object中的equals()方法是没有太大的实际意义的,如果希望采用自定义的相等标准,往往需要重写equals方法来实现。
    例如String类中就是已经重写了Object的equals()方法,它的判断标准是,即使两个引用对象不同,只要对象里面的值相等,就返回true.

    出于

一、String s1 = "hello" ;会在常量池中创建一个hello(s1指向它),当接下来继续有String xxx = "hello"时,由于常量池中已有"hello",xxx会直接指向“hello”不会重新创建,这也是常量池的优点所在,有相同内容的不会创建新的,减少了内存的占用。

二、String str1 = new String("hello"),只要是new了,就会在堆内存中新建一个对应的对象。new了两次自然就是创建了两个不同的对象。所以判”str1==str2“必定为false.