Java基础面试题
1.什么是JVM?java虚拟机包括什么?
JVM:java虚拟机,运用硬件和软件方式实现的虚拟的计算机。java虚拟机包括:寄存器、堆栈、处理器
2.Java的数据结构有那些?
线性表:ArrayList
链表:LinkedList
栈:stack
队列:Queue
图:Map
数:Tree
3.stringbuffer和stringbuild区别
(1)运行速度:StringBuild>StringBuffer
(2)线程安全:StringBuild是线程不安全的,StringBuffer是线程安全的
(3)使用环境:StringBuild适用于单线程下在字符缓冲区的大量操作的情况,StringBuffer适用于多线程下在字符缓冲区的大量操作的情况
4.你对线程安不安全怎么理解
尽量使用局部变量,多个线程之间数据交互尽量使用数据副本(ThreadLoacl)。。。
5.arraylist和linkedlist区别
(1)ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构
(2)对于多get、set操作,ArrayList优于LinkedList因为LinkedList需要移动指针
(3)add操作在1/10容量前,ArrayList优于LinkedList,而在之后LinkedList优于ArrayList,但是在执行时间更长后ArrayList又会优于LinkedList,所以个人推荐首选ArrayList。
由于LinkedList可以实现栈、队列以及双端队列等数据结构,所以当特定需要时候,使用LinkedList
6.HashMap实现原理
HashMap底层是数组+链表的数据结构,主干是Entry数组,每一个Entry数组包含一个K-V键值对。
7.为什么HashMap是线程不安全的
假如有两个线程对同一个key进行put操作则会有一条数据被覆盖;而如果同时对一个map进行扩容操作,都在重新计算元素位置以及复制数据,但是最终只有一个线程扩容后的数组会赋给 table,也就是说其他线程的都会丢失,并且各自线程 put 的数据也丢失。
8.HashMap、HashTable、ConcurrentHashMap的原理与区别
(1)HashMap:底层数组+链表实现,可以存储null键和null值,线程不安全。
(2)HashTable:底层数组+链表实现,无论key还是value都不能为null,线程安全。
(3)ConcurrentHashMap:底层为分段数组+链表实现,线程安全。
9.ConcurrentHashMap能完全替代HashTable吗
不能,因为ConcurrentHashMap的迭代器是弱一致性,而HashTable的迭代器是强一致性,虽然他们都是线程安全的也就是说如果ConcurrentHashMap,put了一段数据但是在某段时间内是不能立即get出来这个数据。
10.如何线程安全的使用HashMap
(1)使用HashTable
(2)使用ConcurrentHashMap
(3)使用SynchronizeMap
11.TreeMap、HashMap、LindedHashMap的区别
(1)HashMap:可以存储(一个)null键和null值,线程不安全,无序,不同步。
(2)TreeMap:不可以存储nul键(实现Comparator 接口时可以存储null键),可以存储null值,线程不安全,有序(自然排序),不同步
(3)LindedHashMap:可以存储(多个)null键和null值,线程不安全,有序(按插入顺序排序),不同步
12.Collection包结构,与Collections的区别
(1)Collections:是包装类,它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
(2)Collection:是接口,提供了对集合对象进行基本操作的通用接口方法,它提供更具体的子接口(如 Set 和 List)实现。
13.try?catch?finally,try里有return,finally还执行么,catch里有return,finally还执行么
不论在try还是catch中有return,finally都会执行。
14.Java(OOP)面向对象的三个特征
封装、继承、多态。
15.Override(重写)和Overload(重载)的含义去区别
重写:方法名、参数、返回值相同,子类方法不能缩小父类方法的访问权限,方法被定义为final不能被重写。
重载:参数类型、个数、顺序至少有一个不相同,不能重载只有返回值不同的方法名。
16.Interface与abstract类的区别
Interface :是接口,所有的方法都是抽象方法,成员变量是默认的public static final 类型。接口不能实例化自己,只能有成员常量,只能是方法的声明。
Abstract:是抽象类,至少包含一个抽象方法的累叫抽象类,抽象类不能被自身实例化,并用abstract关键字来修饰,可以有成员变量,可以声明普通方法和抽象方法。
17.IO与NIO
NIO是为了弥补IO操作的不足而诞生的,NIO的一些新特性有:非阻塞I/O,选择器,缓冲以及管道。管道(Channel),缓冲(Buffer) ,选择器( Selector)是其主要特征。
NIO和传统的IO有什么区别:
(1)IO是面向流的,NIO是面向块(缓冲区)的。
(2)IO是阻塞的,NIO是非阻塞的。
NIO和IO各适用的场景:
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,这时候用NIO处理数据可能是个很好的选择。
而如果只有少量的连接,而这些连接每次要发送大量的数据,这时候传统的IO更合适。使用哪种处理数据,需要在数据的响应等待时间和检查缓冲区数据的时间上作比较来权衡选择。
18.java反射的作用于原理
Java反射是可以让我们在运行时,通过一个类的Class对象来获取它获取类的方法、属性、父类、接口等类的内部信息的机制。这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。
反射的作用:
反射就是:在任意一个方法里:
(1).如果我知道一个类的名称/或者它的一个实例对象, 我就能把这个类的所有方法和变量的信息找出来(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)
(2).如果我还明确知道这个类里某个变量的名称,我还能得到这个变量当前的值。
(3).当然,如果我明确知道这个类里的某个方法名+参数个数类型,我还能通过传递参数来运行那个类里的那个方法。
反射的原理:
JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。
19.常用设计模式
单例模式(Singleton Pattern)
工厂模式(Factory Pattern)
代理模式(Proxy Pattern)
装饰器模式(Decorator Pattern)
观察者模式(Observer Pattern)
【示例】常用设计模式
20.AOP是什么
面向切面编程,是目前软件开发中的一个热点,是Spring框架内容,利用AOP可以对业务逻辑的各个部分隔离,从而使的业务逻辑各部分的耦合性降低,提高程序的可重用性,开发效率,主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等,实现原理是java动态代理。