基础
- 谈谈你对Java的理解
- 平台无关性
- GC
- 语言特性
- 面向对象
- 类库
- 异常处理
- 谈谈你对一次编译,到处运行这句话的理解?
- 在Java中,我们使用Javac命令对程序进行编译,他会生成一个.class文件,我们可以直接在不同的操作系统上运行这个.class文件,因为每一个操作系统有不同的JVM,Java语言在不同系统运行时不需要进行编译,Java虚拟机在执行字节码的时候,把字节码转换从具体平台上的机器指令.
数据类型
- Java的基本数据类型
- 基本数据类型有:byte/8位,char/16位,short/16位,int/32位,float/32位,long/64位,double/64位
- 什么是自动装箱,自动拆箱
- 每一个基本数据类型都有一个对象的包装类,基本类型和包装类型之间的赋值使用自动装箱与拆箱完成.int的包装类是Integer,比如说
Integer a = 3;
自动装箱,调用了Integer.valueOf(2);
new Integer(123)
和Integer.valueof(123)
的区别在哪里?
-
new Integer(123)
每次都会新建一个对象; -
Integer.valueof(123)
会使用IntegerCache里面的对象,多次调用取得同一个对象的引用 - Integer缓存池的大小是-128 ~ 127;
String
- 讲讲String类为什么不可变?为什么这样设计?
- String被声明为final,因此它不可被继承.
- String内部使用char类型的数组存储数据,并且char数组用final修饰,数组不可变,保证String不可变
- String类不可变,线程安全;
- 保证HashCode哈希值的不可变性
- String类不可变.每次都要在堆里面创建一个对象,性能价差
- String,StringBuffer,StringBuilder区别?
- String是一个不可变类,一旦一个String对象被创建之后,包含在这个对象中的字符串是不可修改,直到销毁.
- StringBuffer对象表示一个字符序列可变的字符串,可以通过提供的,append().insert(),reverse()等方法改变这个字符串,一旦获得了自己想要的字符串,可以通过toString()方法将他转变成一个String对象.
- StringBuilder和StringBuffer类似,只不过,StringBuilder线程不安全,StringBuffer线程安全.但是StringBuilder效率高.
- String str = "i" 和 String str = new String("i")一样吗?
- 不一样,内存分配方式不一样,前者Java虚拟机会将其分配到常量池中,而后者会被分配到堆内存中,堆用来存放对象.
- 请你讲讲&和&&的区别?
- & 和 && 都能作为逻辑与操作,但是 && 具有短路功能,当左边的条件表达式返回false则无需继续执行右边表达式,而 & 都需要进行.
- & 还能作为与运算符
- 你还知道哪些运算符?
-
~
按位非,单目运算符,将操作数的每个位全部取反 -
^
按位异或,两位相同返回0,不相同返回1 -
<<
左移运算符 -
>>
右移运算符 -
>>>
无符号右移运算符
- ==和equals的区别?
- ==: 如果比较的是基本数据类型,则比较的是数值是否相等,如果比较的是引用类型,比较的是他们的对象的地址是否相等.
- equals:用来比较两个对象的内容是否相等,equals不能用来比较基本数据类型,如果没有重写equals,判断两个对象的内存地址是否相等
- 为什么重写equals还要重写hashcode?
- equals():判断两个对象的内存地址是否相等
- hashcode(): 根据两个对象的内存地址生成的hash码是否相等
- 当你HashMap里面key存储的是引用类型的数据的时候,HashMap中put时候会判断key是否有重复,先求出key的hashcode(),若相等在比较equals(),若相等,则认为他们是相同的,不能两个都put进去;
- 如果你只重写了equals()方法,那么会出现,表面两个对象的地址相等,但还是能够put进去,因为本质上他们的hashcode()还是不同的.
- 重写hashcode()是为了同一个key,能够得到相同的hashcode值,这样Hashmap能够定位到我们指定的key上;重写equals()是为了向Hashmap表明当前对象的key上保存的对象是相等的,这样我们才真正获得了这个key所对应的键值对.
关键字
- 讲讲Java里面的final关键字
- final可以用来修饰基本类型变量,表明变量不可变;也可以修饰引用类型变量,表示引用的地址不会改变.
- final可以用来修饰方法:表明方法不能被重写
- final可以用来修饰类:表明方法不能被继承
- 讲讲static关键字
- static可以用来修饰变量,说明这是一个静态变量,或者类变量,可以直接使用类名来访问
- static可以用来修饰方法,说明这是一个静态方法,说明他在类加载的过程中就存在了,它不依赖任何实例,可以通过类名访问.
- 静态语句块在类初始化时只运行一次
面向对象
- Java的三个特性?谈谈理解
- 封装:他指的就是将对象的状态信息,属性等,隐藏在对象的内部,不允许外部程序直接访问对象内部信息,而是通过该类向外暴露的方法来实现对内部信息的操作和访问.
- 继承:通过关键字extends赖实现,一个类只能继承一个父类
- 多态:Java的引用类型有两种类型,一个是编译类型(方法重载),一个是运行类型(方法重写),编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋予该变量的对象决定,所以当编译和运行时类型不一致,就会出现所谓的多态.
- 访问控制符?各自的作用范围?
- private只能访问同一个类中的信息
- default可以访问同一个类和同一个包下中
- protected可以访问同一个类,同一个包,以及子类中
- public可以访问全局范围内.
- 重写和重载的区别
- 重载,是编译时多态,同一个类中相同的方法具有不同的参数列表,不能根据返回值类型区分
- 重写:是运行时多态,子类重写父类里面的方法,具有相同的返回值,参数列表.
- 构造器不能被重写,但是能够被重载
- 能否重写一个private或者static方法
- 重写方法,就是意味着你要继承,不能继承.
- private修饰的方法只能在当前类中使用,你继承肯定是一个子类,而不是当前类
- 方法重写是根据运行时冬天绑定的,而static是编译时静态绑定的,所以static方法跟任何类的实例都不相关.所以不能继承,不能重写.
- 抽象类和接口有什么区别
- 抽象类是一个类,用来被继承,接口用来被实现
- 抽象类中可以定义构造方法,接口不能
- 抽象类中可以有具体的方法和抽象的方法,但是接口中只能有抽象的方法
- 抽象类的权限可以是public,默认和protected,不能是private,接口默认是public
- JDK1.8之后,接口中可以有默认的具体的实现方法.抽象类中也可有静态方法
- 深克隆和浅克隆的区别?
- 浅克隆:拷贝对象和原始对象的引用类型引用同一个对象。浅克隆只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅克隆。
- 深克隆:拷贝对象和原始对象的引用类型引用不同对象。深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse() 和 JSON.stringify(),但是此方法无法复制函数类型)。
异常
- Error和Exeption有什么区别?
- Error类和Excepttion类都是Throwable类
- Error类一般是指虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足等,这类错误将导致应用程序中断.
- Exception类分位运行时异常和受检查异常,运行时异常如空指针异常,指定的类找不到,数组越界,方法传递参数错误,类型转换;受检查异常:可以用try...catch捕获.
- throw和throws有什么区别
- Throw用于抛出异常对象,后面跟异常对象,用在方法体内部
- Throws是方法可能抛出异常的声明,在方法体外.后面跟异常类名
- 主线程可以捕捉到子线程的异常吗
- 线程的设计理念是线程的问题应该线程自己本身来解决,而不要委托到外部.
- 正常情况下,主线程不会捕捉到子线程的异常
- Java 的泛型是如何工作的 ? 什么是类型擦除 ?
- 泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如:List<String> 在运行时仅用一个 List 来表示。