char和String的区别
    char是字符类型,是基础数据类型,长度固定,用单引号表示 如 c='谢';
    String是字符串类型,不是基础数据类型,长度无法确定,用双引号表示 str="傻啊"。
关于String类。
    1、String类时final类,所以是不可继承的;
    2、String类是的本质是字符数组char[];
    3、Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产        生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆    栈区。
关于String的创建方式
    1、String str = new String("abc");
    需要注意的是:这条语句中str是放在栈中,new出来的字符串对象是放在堆上的,"hello"字面量是放在方法区的。
    2、String str = "abc";
    其实等效于:char data[] = {'a','b','c'}; String str = new String(data);
    3、String str = "a"+"bc";
    说明Java提供对字符串串联符号"+"以及将其他对象转换成字符串的特殊支持。
    当使用任何方式来创建一个字符串对象str时,JVM运行时会将这个str在String池中寻找是否存在内容相同的字符串对象,如若不存在就在池中创建,否则不在池中添加。
关于不可变类

    字符串是常量,它的值在创建之后不能改变,而String类的引用却可以指向不同的字符串,因为String对象时不可变的,但    是他们的地址可以共享。

public class Main {

	public static void main(String[] args) {
		String str = new String("abc");
		String str1 = new String("abc");
		String s = "abc";
		
		System.out.println(str == s);  //为false
		System.out.println(str.equals(s));   //为true
		System.out.println(str == str1);     //false
		System.out.println(str.equals(str1));   //true
	}
}

     String s = "abc" 是把String作为一个基本数据类型来使用的,因此s所引用的对象是属于String缓冲池内的。并且此时String缓冲池内并没有与其值相同的String对象存在,因此虚拟机会为此创建一个新的String对象,即new String("abc");


     String str = new String("abc"); 是把String作为一个对象来使用的,因此str所引用的对象不属于String缓冲池内的,即它是独立的。通过new关键字,虚拟机会为此创建一个     新的String对象,即为它分配了一块新的内存堆。


     所以"=="比较后的结果是false,因为s和str所引用的并不是同一个对象,它们是独立存在的。而equals()方法所返回的是true,因为这两个对象所封装的字符串内容是完全相同的。

     两个String类型的变量str和str1都通过new关键字分别创建了一个新的String对象,这个new关键字为创建的每个对象分配一块新的、独立的内存堆。
     所以通过 ==比较的是他们所引用的是否同一对象,equals比较的是两个对象多封装的字符串内容。

在Object类的equals方法的本质其实是和“==”一样的,都是比较两个对象引用是否指向同一个对象(即两个对象是否为同一对象),而String类中对equals进行了重写才会不同。