Java

1.equals与==的区别

JAVA中的数据存储

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.

 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。) 

3. 堆:存放所有new出来的对象。

4. 静态域:存放静态成员(static定义的) 

5. 常量池:存放字符串常量和基本类型常量(public static final)。有时,在嵌入式系统中,常量本身会和其他部分分割离开(由于版权等其他原因),所以在这种情况下,可以选择将其放在ROM中 。 

6. 非RAM存储:硬盘等永久存储空间 。

JAVA 中堆和栈的区别

基本数据类型比变量和对象的引用都是在栈分配的

堆内存用来存放由new创建的对象和数组

类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中

实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置”,实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

equals与==

java中的所有类都继承了Object.class,因此,所有类都继承了Object类中的equals()方法,要想知道运行结果的本质原因必须查看Object.class的源码。 打开Object.class的源码找到定义equals()方法的位置:

public boolean equals(Object obj) {

return (this == obj);

}

发现Object.class给出equals()方法的定义,竟然只是简单地通过==去实现判断。而==在java中用于判断存储在栈中的值是否相等。我们的基本数据类型像int的比较都用==,因为基本数据类型就存放在栈中,同样存放在栈中的,还有引用数据类型的引用,而真正的对象本身则存放在堆中。因此,这里给出的equals()方法就只是比较两个对象在内存中的引用(即地址)是否相等。但对于String类它重写了equals()方法,看一下源码:

public boolean equals(Object anObject) {

        if (this == anObject) {

            return true;

        }

        if (anObject instanceof String) {

            String anotherString = (String)anObject;

            int n = value.length;

            if (n == anotherString.value.length) {

                char v1[] = value;

                char v2[] = anotherString.value;

                int i = 0;

                while (n-- != 0) {

                    if (v1[i] != v2[i])

                        return false;

                    i++;

                }

                return true;

            }

        }

        return false;

    }

重写后equals()要判断两个字符串的字符是否全部相等。 

2.ArrayList、LinkedList、Vector的区别

ArrayList 和Vector底层是采用数组方式存储数据,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差

LinkedList使用双向链表实现存储,随机存取比较慢

你可能感兴趣的:(Java)