面试题自我理解
1.面向对象的深刻理解
首先面向对象就是将一个事物抽象出来,赋予它自己的特征,就比如一本书他就是可以抽象为一个对象,他拥有自己的长宽高,这就是他自己的属性,同时我们可以针对这个事物进行操作,以及去规定他和其他对象直接的关系,这样子就可以降低程序之间的耦合性,使得程序更加灵活
其次就是面向对象的三大特征: 继承,封装和多态
- 继承:就是子类可以继承父类所有的非私有的属性和方法,然后在父类的基础上可以进行扩展,子类可以拥有自己特有的属性和方法,同时子类也是可以去重写父类的方法的。构造器是不可以被继承的。
- 封装:就是将一个对象的属性私有化,就比如一个标准的javaBean,然后对外提供相应的修改属性的方法,就比如set/get方法,如果不想被访问的话,就不用提供相应的方法,但是如果一个类不提供给外界访问的方法的话,那么这个类也就没什么用了,还有就是封装可以隐藏对象的属性和实现细节,仅仅对外提供公共的访问方法,这就提高了代码的复用性和安全性
- 多态:编译时多态和运行时多态
2、Java语言和其他语语言区别?
- java语言是面向对象的
- java语言的jvm提高了java程序的可移植性,一次编译处处运行,java的jvm是世界上最好的jvm嘛
- java语言没有十分麻烦的指针,而c语言有
- java语言是支持分布式开发的,支持多线程的
- java语言的垃圾回收机制是全自动的,不需要程序猿自己去进行垃圾的回收
3、JRE、JDK、JVM区别?
- JRE是java运行时环境,如果你只需要运行java程序,只需要安装JRE即可,JRE中是包含jvm的
- JDK是java开发工具包,其中包含JRE,一些java工具,还有java基础的类库
- JVM是jre的一部分,是一个虚拟机,正是因为jvm的存在,才存在了java语言的跨平台性
4、JDK1.8之前和JDK1.8之后接口不同?
- jdk1.8之后对于接口进行了增强,jdk1.8之前只可以有抽象方法
- 接口中可以定义静态方法,默认方法和私有方法
- 私有方法是jdk9出现的,正是因为jdk8出现了静态方法和默认方法,需要使用私有方法进行相同代码的抽取操作
5、接口和抽象类区别?
- 抽象类有构造器,而接口是没有构造器的
- 抽象类中是可以有普通方法的,而接口的方法是要区别jdk版本的
- 抽象类的关键字是abstract,接口的是interface
- 抽象类的成员变量是自己定义权限修饰符的,而接口默认使用的是public static final 进行权限修饰
8、Java中的常用容器有哪些?
- Collection 和 Map
- Collection 是一个接口,子接口有List,Set
- List 的 实现类 有 ArrayList 、 LinkedList 和 Vector , Set的实现类有 HashSet 和 TreeSet
- Map 也是一个接口 , 实现类有 HashMap , TreeMap , HashTable
9、线程和进程有什么区别?
- 进程里面是包含很多线程的
- 进程是操作系统中的一个应用程序
11、final、finally、finalize区别,怎么使用?
- final 修饰基本数据类型,其值就不可以被改变的
- final 修饰引用数据类型,其地址值是不可以被改变的
- final 修饰方法的话,则被修饰的方法不可以被重写
- final 修饰类的话,则这个类不可以被继承
- finally 是java中异常处理的关键字,和try…catch..配合使用,程序在运行过程中无论是否出现异常,都是会执行finally
- finalize 属于 Object类中的方法,表示一个对象可以被垃圾回收器回收了
12、局部变量和成员变量区别?
- 位置不同,局部变量是在方法中,或者代码块中,成员变量是在类中
- 局部变量是安全的,不存在安全问题,而成员变量是存在安全问题的
- 局部变量是需要初始化才可以进行使用的,成员变量是默认JVM进行初始化
13、值传递和引用传递区别?
14、创建对象在JVM中的位置?
- 对象的创建都在 堆 中
15、==和equals区别?
- “==” 如果比较的是基本数据类型的话,比较的是值;比较的如果是引用数据类型,比较的是地址值
- “equals” 是 Object 中的方法,比较的是地址值,没有进行重写的话和“==”没有区别,因为Object中的equals方法就是通过“==”去进行比较的,重写后的equals方法比较的是属性值。
16、Hashcode和equals的区别?
- 性能和可靠性 两个方面进行分析
- Hashcode只需要得到一个hash值就可以进行比较,这种方式是十分方便的,这就意味着hashcode的效率比较高,但是它不是完全可靠的
- equals 的性能比较低,但是十分可靠
- equals相等的两个对象 hashcode肯定是相等的,equals绝对可靠
- hashcode相等的两个对象equals不一定相等,hashcode并不是绝对的可靠
17、重载和重写区别?
- 重载和重写都是实现多态的一种方式
- 重载是编译时多态,在同一个类中存在多个相同名称的方法,但是这些方法的参数列表不同(参数类型,参数的个数),这就构成了方法的重载
- 重写是运行时多态,存在于子类与父类之间,重写的方法与父类的方法返回值,参数列表一致,更少的异常,更好的访问。
18、Java基本数据类型?
- byte,short,int,long,char,float,double,boolean
19、包装类和基本类区别?
- 基本类时值传递 包装类是引用传递
- 基本类是在栈中创建,包装类是在堆中创建
- 基本类在栈中虽然效率比较高,但是可能会产生内存泄漏问题
20、为什么要提供包装类?
- 因为泛型类的参数都是对象类型,无法直接使用基本类型
21、包装类和基础类怎么转换?
22、构造器代码块、局部代码块、静态代码块执行顺序和执行次数?
23、构造代码块的作用?
24、Integer是否可以被继承?为什么?
25、Integer缓存区间?什么时候触发缓存区间?
- -127—128之间
26、”” 和 new String(“”)区别?
27、String、StringBuffer、StringBuild区别?是否线程安全?怎么做到线程安全?
- String 底层是赢final进行修饰的,所以它是不可变的
- StringBuffer是可变的,但是它是线程不安全的,append方法进行字符串的拼接
- StringBuild是线程安全的,因为该类的方法被Sync
28、包装类型、Math类常⽤的⽅法有哪些?在项⽬中怎么使⽤?
30、&和&& | || 区别是什么?
31、JDK1.8之后有哪些新特性?
32、Java中深克隆和浅克隆的区别?怎么实现?
33、Comparable 和Comparator的区别,分别说出使用场景?
34、Object类和泛型的区别,说出泛型的执行机制,为什么要使用范型?
35、Collection 和Collections 的区别?
- Collection 是 集合的接口
- Collections 是一个工具类
36、HashMap 和Hashtable 的区别?
37、HashMap是线程安全的吗?如何得到一个线程安全的HashMap?
38、如何解决Hash冲突问题?
39、HashMap是如何实现自动扩容的?
40、HashMap的底层原理?
41、List和set的区别?
42、ArrayList和LinkedList的区别?
43、线程创建4种方式?
44、并发和并行有什么区别?
44、为什么要使用线程池?
45、线程池的构造方法里几个参数的作用分别都是什么?
46、什么是线程安全问题?(从单线程和多线程两个方向说)
47、如何解决线程安全问题?
48、线程的生命周期?
49、JAVA中可以冻结线程的两个方法及区别?
50、notify()和 notifyAll()有什么区别?
51、请说出sql语句中 left join ,inner join 和right join的区别?
52、讲一下JDBC流程?
53、数据库连接池的工作机制?
54、Java 中常用的设计模式?说说工厂模式或者几种比较熟悉的说一下?
55、char 型变量中能不能存储一个中文汉字?为什么?
56、error 和exception 有什么区别?
57、TCP与UDP的区别?
58、int 和Integer 有什么区别?
59、并行和并发有什么区别?
60、线程和进程的区别?
61、什么是反射?
62、什么是 Java 序列化?什么情况下需要序列化?
63、动态代理是什么?有哪些应用?
64、怎么实现动态代理?
65、如何复制一个文件夹,通过递归的方式?(说实现思路加伪代码)
66、说一下 JVM 的主要组成部分?及其作用?JVM调优?
67、说一下堆栈的区别?
68、什么情况下会出现堆内存溢出?
69、什么是类加载器?及类加载器的分类?
70、说一下类加载的执行过程?
71、什么是JAVA里双亲委派机制?
72、怎么判断对象是否可以被回收?
73、说说垃圾回收算法的底层原理?(新生代、老年代)
74、什么是死锁?怎么防止死锁?
75、为什么会出现双亲委派模型?如果没有双亲委派模型会出现什么情况?
双亲委派模型是可以保证多个加载器加载某个类时,最终都是由一个加载器进行加载的,确保最终加载结果相同
如果没有双亲委派模型的话,就比如我们自己手写了一个 java.lang.Object类,然后将此类放在classpath路径下,就会导致我们出现多个Object类,就会破坏了java类型体系中原有的基础行为。
基础:多线程(创建方式、睡眠、唤醒、锁机制、并发处理、无锁并发)、JVM(优化、执行顺序、类加载器(双亲委托机制))、GC(新生代、老年代相互转换、可达性分析算法、引用计数器算法、f\f\f)、设计模式(3~5)、简单算法、集合(List(优化)\得到线程安全、Map(底层原理、自动扩容、hash碰撞解决) 、反射、IO
数据结构、算法分析