1.局部变量一般存放在栈中,成员变量一般存放在堆中
2.什么是多态?谈谈对多态的理解?
在面向对象语言中,接口的多种不同的实现方式即为多态。用白话来说,就是多个对象调用同一个方法,得到不同的结果。
多态中存在向下转型是为了调用子类特有的方法。一般需要先向上转型,再经过instanceof判断,再进行向下转型
3.谈一谈深拷贝,浅拷贝和引用拷贝的区别?
引用拷贝是多个对象指向同一内存地址,操作其中一个变量会影响其他变量。浅拷贝创建新对象,但是对象中引用类型成员仍然指向原对象,修改了会互相影响,深拷贝则是完全修改,互不影响,重写clone方法,需要自己手动添加引用类型变量的复制逻辑。
4.Object类的常见方法有哪些?
- getClass方法,获取当前运行对象的Class对象
2.hashCode 返回对象的哈希码
3.equals,比较2个对象的内存地址是否相同
4.clone() 返回当前对象的一份拷贝
5.toString 返回类全限定名@对象哈希码的十六进制表示
6.finiliaze()实力被垃圾回收时候触发的操作
5.== 和equals的区别?
1.== 基本数据类型比较值,引用类型比较地址
2.equals用于引用数据类型,一般是需要重写后比较值是否相等
6.hashCode有什么用?为什么需要有hashCode?
hashCode是为了获取哈希码。哈希码是为了或许哈希表中的索引位置
把对象加入hashset,先计算hashcode,如果hashset中没有一致的就加入,有一致的再计算下equals判断是否真的存在,大大减少了equals的判断
hashcode和equals都是为了判断对象是否相等
7.为什么重写equals时同时要重写hashCode?
如果重写了equals没有重写hashCode,会导致equals判断相等,hashCode判断不一样,如果加入hashset就可能倒置出现重复元素。
equals判断两个对象是相等的,那么hashCode也要相等
hashCode相等,也不一定是同一个对象,可能存在哈希碰撞
8.String,StringBuilder,StringBuffer之间的区别?
1.String修饰的变量是不可变的,修改后是创建一个新对象并返回
2.StringBuilder线程不安全,不会返回新对象,是在原有的对象上进行操作
3.StringBuffer是线程安全的,原因是底层用了synchronied修饰(效率折中)
4.StringBuilder和StringBuffer都继承自AbstractStringBuilder
5.String不能被修改的原有,保存字符串的数组被final修饰且是私有的,String类没有暴露修改他的方法
String类被final修饰不能被继承
9.字符串常量池了解吗?
字符串常量池是JVM为了提升性能和减少内存消耗针对字符串(String类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建
10.String的intern()方法有什么作用?
1.是一个本地方法(native),处理字符串常量池中字符串的引用,常量池中有会直接返回该对象的引用,否则在常量池中先创建再引用
11.Exception和Error的区别是什么?
属于Throwable的子类。
Exception属于程序本身可以处理的异常,可以通过catch进行捕获。Exception又分为受检查异常(必须处理)和不受检查异常(可以不处理)
Error属于程序无法处理的错误,不建议通过catch捕获,如虚拟机运行错误/内存不足
12.Checked Exception和Unchecked Execption有什么区别?
checked Execption 受检查异常,如果没有被catch或者throw处理的话,就没办法通过编译。比如IO相关,SQLEXecption等
unchecked execption不受检查异常,不处理也可以通过正常的编译, RunntimeExecption及其子类。空指针,算数错误,类型转换错误,数组越界错误等。
13.Throwable常用方法有哪些?
getMessage()返回异常发生的详细信息
toString() 返回异常发生的简要描述
getLocalizedMessage()返回异常对象的本地化信息。默认情况下和getMessage()相同
printStackTrace() 返回详细的调用栈信息,快速定位位置
14.try-catch-finally如何使用?
try用于捕获异常,catch用于处理捕获到的异常,finally语句都会被执行。
不要再finally语句块中使用return,try和fianlly中都有return语句的时候,try中的语句会被忽略
15.finally代码一定会被执行吗?
不一定,当被虚拟机终止的时候,代码就不会执行。程序所在的线程死亡,关闭CPU也会不执行
16.什么是序列化和反序列化?
序列化:将对象转换为可以存储或传输的形式,比如二进制字节流,也可以是JSON,XML等形式
反序列化:序列化生成的数据形式转换为原始的对象
17.如果有些字段不想进行序列化怎么办?
1.用transient修饰。但是对象反序列化时候这个变量不会被持久化和回复,会被重置为类型的默认值,比如int重置为默认值0
18.JAVA的IO流了解吗?
1.IO 输入和输出。数据输入到计算机内存即为输入,输出到外部存储比图数据库就是输出。
IO流分为输入流和输出流
根据数据的处理方式又分为字节流和字符流
InputStream/Reader 字节输入流/字符输入流
OutputStream/Writer 字节输出流/字符输出流
19.为什么要分为字节流和字符流呢?
文件传输本质上是通过字节传输。字符流是java虚拟机将字节转换得到的,这个过程比较耗时