Java面试---Day1

Java面试—Day1

Java面试---Day1_第1张图片

星光不问赶路人,时间不负有心人

文章目录

  • Java面试---Day1
    • 1、栈、堆、方法区区别
    • 2、Java中 == 和 equals 和 hashCode 的区别
    • 3、int、char、long 各占多少字节数
    • 4、int 和 Integer 的区别
    • 5、谈谈对Java多态的理解
    • 6、String、StringBuffer、StringBuilder的区别
    • 7、什么是内部类?内部类的作用
    • 8、抽象类和接口的区别
    • 9、抽象类的意义
    • 10、抽象类与接口的应用场景
    • 11. 接口的意义

1、栈、堆、方法区区别

堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 。
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的值和对象以及基础数据的引用
2.每个栈中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

20161101164523853 (613×368) (csdn.net)

2、Java中 == 和 equals 和 hashCode 的区别

Java中的数据类型可分为两类,基本数据类型和引用类型。基本数据类型:byte、short、char、int、long、float、double、boolean。他们之间的比较用双等号(),比较的是。引用类型:类、接口、数组。当他们用双等号()进行比较的时候,比较的是他们在内存中的存放地址。对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见,双等号是对栈中的值进行比较的。如果要比较堆中对象是否相同,那么就要重写equals方法了。

默认情况下(没有覆盖equals方法)下的equals方法都是调用Object类的equals方法,而Object的equals方法主要是用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。下面是Object类中的equals方法:

public boolean equals(Object obj) {  
    return (this == obj);  
} 

定义的equals方法与==是等效的。

但是,要是类中覆盖了equals方法,那么就要根据具体代码来确定equals方法的作用了。**覆盖后的一般都是通过对象的内容是否相等来判断对象是否相等。**下面是String类对equals方法进行了重写:

public boolean equals(Object anObject) {  
    if (this == anObject) {  
        return true;  
    }  
    if (anObject instanceof String) {  
        String anotherString = (String)anObject;  
        int n = count;  
        if (n == anotherString.count) {  
        char v1[] = value;  
        char v2[] = anotherString.value;  
        int i = offset;  
        int j = anotherString.offset;  
        while (n-- != 0) {  
            if (v1[i++] != v2[j++])  
            return false;  
        }  
        return true;  
        }  
    }  
    return false;  
}

hashCode()方法返回的就是一个数值,从方法名上来看,其目的就是生成一个hash码,hash码的主要用途就是在对对象进行散列的时候作为key输入

3、int、char、long 各占多少字节数

类型 位数 字节数
boolen 8 1
int 32 4
float 32 4
double 64 8
char 16 2
byte 8 1
short 16 2
long 64 8

4、int 和 Integer 的区别

Java 为每一个基本数据类型都引入了对应的包装类,从Java 5 开始引入了自动装箱 / 拆箱机制,使得两者可以相互转化。所以最基本的一点区别就是:Integer 是int的包装类,int的初始值为零,而Integer的初值为null。int与Integer相比,会把Integer自动拆箱为int再去比。

参考自:[http://blog.csdn.net/login_sonata/article/details/71001851]

5、谈谈对Java多态的理解

多态即:事物在运行过程中存在不同的状态。多态的存在有三个前提:

  1. 要有继承关系

  2. 子类重写父类方法

  3. 父类数据类型的引用指向子类对象。

    弊端就是:不能使用子类特有的成员属性和子类特有的成员方法。如果非要用到不可,可以强制类型转换。

参考自:https://item.btime.com/m_2s22uri6z16

6、String、StringBuffer、StringBuilder的区别

String:字符串常量,使用字符串拼接时是不同的两个空间。

StringBuffer:字符串变量,线程安全,字符串拼接直接在字符串后追加。

StringBuilder:字符串变量,非线程安全,字符串拼接直接在字符串后追加。

StringBuilder执行效率高于StringBuffer高于String。String是一个常量,是不可变的,所以对于每次+=赋值都会创建一个新的对象,StringBuilder和StringBuffer都是可变的,当进行字符串拼接的时候采用append方法,在原来的基础上追加,所以性能要比String高,因为StringBuffer是线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率高于StringBuffer。对于大数据量的字符串拼接,采用StringBuffer、StringBuilder。另一种说法,JDK1.6做了优化,通过String声明的字符串在进行用+进行拼接时,底层调用的是StringBuffer,所以性能基本上和后两者没什么区别。

7、什么是内部类?内部类的作用

Java 常见的内部类有四种:成员内部类、静态内部类、方法内部类和匿名内部类。

内部类可以很好的实现隐蔽,一般的非内部类,是不允许有private和protectd等权限的,但内部类(除方法内部类)可以通过这些修饰符来实现隐蔽。

内部类拥有外部类的访问权限(分静态与非静态情况),通过这一特性可以比较好的处理类之间的关联性,将一类事物的流程放在一起内部处理。

通过内部类可以实现多重继承,Java默认是单继承的,我们可以通过多个内部类继承实现多个父类,接着由于外部类完全可访问内部类,所以就实现了类似多继承的效果。

参考自:[https://www.jianshu.com/p/7fe3af7f0f2d]

8、抽象类和接口的区别

抽象类使用abstract class 定义,抽象类既可以有抽象方法也可以有其他类型的方法,既可以有静态属性也可以有非静态属性。

接口使用interface定义,属性用public final static 修饰,如果没有写关键字,虚拟机默认会加上关键字。JDK8之后接口里的方法既可以有抽象方法也可以有默认方法。

抽象类是一种类别,具有构造方法。接口是一种行为规范,没有构造方法。抽象类中可以没有抽象方法,他有自己的构造方法但是不能直接实例化对象,所以必须被子类继承之后才有意义。

抽象类只能单继承,接口可以被多个类实现,接口和接口之间可以多继承。

抽象类可以由默认的方法实现,接口根本不存在方法的实现。实现抽象类使用extends关键字来继承抽象类,如果子类不是抽象类,它需要提供抽象类中所有抽象方法的实现。子类使用关键字implements来实现接口,它需要提供接口中所有声明的方法的实现。

抽象方法可以有public、protectd 和 default 这些修饰符,而接口方法默认修饰符是public,不可以使用其他修饰符。

抽象类比接口速度快,接口是稍微有点慢的,这是因为它需要时间去寻找类中实现的方法。

参考自:[http://www.importnew.com/12399.html]

9、抽象类的意义

为子类提供一个公共的类型;封装子类中重复的内容;定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的;

10、抽象类与接口的应用场景

如果你拥有一些方法并且想让它们中的一些默认实现,那么就用抽象类;如果你想实现多继承,那么必须实用接口;如果基本功能在不断变化,那么就需要使用抽象类,如果不断改变基本功能并且使用接口,那么就要改变所有实现了该接口的类。

11. 接口的意义

规范、扩展、回调。

对一些类是否具有某个功能非常关心,但不关心功能的具体实现,那么就需要这些类实现一个接口。

实现多继承,那么必须实用接口;如果基本功能在不断变化,那么就需要使用抽象类,如果不断改变基本功能并且使用接口,那么就要改变所有实现了该接口的类。

你可能感兴趣的:(Android,面试,java,面试,开发语言)