基本的数据类型都放在stack(栈)中;引用类型变量放在stack(栈)中,真正的内容放在heap(堆)中。
堆:首先堆是动态分配的,JVM并不会自动释放这部分内存。只用等待系统的gc来进行内存回收。
栈:是在类加载中有系统静态分配的,而且分配时按照内存的高低地址分配。这部分内存系统会自动进行释放。
类Object是类层次结构的根类,每个类都使用Object作为超类,所有的对象(包括数组)都实现这个类的方法。
对于一个类一般都会重写Object类中的equals()、HashCode()、toString()方法,全部继承下来。
在String类中对equals方法进行了重写(改变父类中的函数功能以满足自己的需求)功能是比较两个字符串的值是否相同。
类似的还有Integer,Integer比较的也是值而非地址。
==:对于基本数据类型(int/long/short/float/double/byte/char/boolean)比较的是值;
对于封装类比较的是对象的引用---在堆中存储的地址是否相同。
equals:不能用于基本的数据类型,只能用于类变量;
Object类中的equals方法和“==”是一样的,Object的equals源码是比较hashcode的,没有区别;
而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,此时equals比较的是内容值。
当自己创建类时,自动继承了Object的equals方法,此时比较自定义类用equals和==是一样的,但是要想实现不同的等 于比较,必须重写equals方法。例如创建一个Student类,new了几个student实例,我们在程序中怎么判断这几个实例是否是同一个学生呢?这时候就可以重写equals方法了(定义按学号来比较,学号相等则对象实例相等)。
例如,两个对象值相同(x.equals(y) == true),他没说是谁的对象,如果是Object类的对象,,equals(
)比较的是地址值,
如果是String类的对象,,,String类重写了equals( )比较的是内容