Java面试题学习整理
第一模块Java 基础
JDK 和 JRE 有什么区别?
- JDK : Java Development Kit的简称,Java开发工具包,包含了Java开发环境和Java运行环境。
- JRE : Java Runtime Environment的简称,只包含了Java的运行环境。
具体来说JDK包含了JRE,还包含了编译Java源码的编译器Javac,还包含了许多Java程序调试和分析的工具。简单来说,如果你需要运行Java程序,只需安装JRE就可以了,如果你需要编写Java程序,需要安装JDK。
== 和 equals 的区别是什么?
==对于基本类型来说是值比较,对于引用类型来说是比较的引用;而equals默认情况下是引用比较,只是很多类重写了equals方法,比如String、Integer等把它变成了值比较,所以一般情况下equals比较的是值是否相等。
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
Java hashCode() 方法:
hashCode() 方法用于返回字符串的哈希码。
字符串对象的哈希码根据以下公式计算:
1 | s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] |
所以两个对象的hashCode()相同,equals不一定true。因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
final 在 java 中有什么作用?
- final修饰的类叫最终类,该类不能被继承。
- final修饰的方法不能重写。
- final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
java 中的 Math.round(-1.5) 等于多少?
JAVA中Math.round负数的取值
在数轴上取值最接近的整数,中间值(0.5)向右取。Java中Math.round()函数看作原数加0.5再向下取整。
负数验证如下:
1 | Math.round(-8.49999) :-8 |
所以等于-1,因为在数轴上取值时,中间值0.5是向右取整,所以正0.5是向上取整,负0.5是直接舍弃。
java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有三个:String、StringBuffer、StringBuilder。
String和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以经常改变字符串的内容的情况下最好不要使用String。
StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。
String str="i"与 String str=new String(“i”)一样吗?
不一样。因为内存分配的方式不一样。
1 | String str = "i"; |
用上面方式Java虚拟机会将其分配到常量池中;
1 | String str = new String ("i"); |
上面方式则会被分配到堆内存中。
如何将字符串反转?
使用StringBuffer或StringBuilder的reverse()方法。
String 类的常用方法都有那些?
- indexOf() : 返回指定字符的索引。
- charAt() : 返回指定索引处的字符。
- replace() : 字符串替换。
- trim() : 去除字符串两端空白。
- split() : 分割字符串,返回一个分割后的字符串数组。
- getBytes() : 返回字符串的byte类型数组。
- length() : 返回字符串的长度。
- toLowerCase() : 将字符串转成小写字母。
- toUpperCase() : 将字符串转成大写字符。
- subString() : 截取字符串。
- equals() : 字符串比较。
抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法。
普通类和抽象类有哪些区别?
- 普通类不能包含抽象方法,抽象类可以包含抽象方法。
- 抽象类不能直接实例化,普通类可以直接实例化。
抽象类能使用 final 修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义为final该类就不能被继承,这样彼此就会产生矛盾,所以final不能修饰抽象类,如下图所示,编辑器也会提示错误信息:
接口和抽象类有什么区别?
- 实现:抽象类的子类使用extends来继承;接口必须使用implements来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。
- main方法:抽象类可以有main方法,并且我们能运行它;接口不能有main方法。
- 实现数量:类可以实现很多接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用public修饰;抽象类中的方法可以是任意访问修饰符。
java接口中的default修饰符(jdk1.8)
接口中被default修饰的方法有默认实现。
实现该接口的类可以不重写接口中被default修饰的方法。
1 | public interface IDefault { |
java 中 IO 流分为几种?
按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。
字节流和字符流的区别是:字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据。
BIO、NIO、AIO 有什么区别?
- BIO:Block IO 同步阻塞式IO。
- NIO:New IO 同步非阻塞IO。
- AIO:Asynchronous IO 异步非阻塞IO。
Files的常用方法都有哪些?
- Files.exists() : 检测文件路径是否存在。
- Files.createFile() : 创建文件。
- Files.createDirectory() : 创建文件夹。
- Files.delete() : 删除一个文件或目录。
- Files.copy() : 复制文件。
- Files.move() : 移动文件。
- Files.size() : 查看文件个数。
- Files.read() : 读取文件。
- Files.write() : 写入文件。
第二模块容器
java 容器都有哪些?
常用容器的图录:
Collection 和 Collections 有什么区别?
- java.util.Collection是一个集合接口,Collection接口在Java类库中有很多具体的实现。
- Collections则是集合类的一个工具类,其中提供了一系列静态方法。
List、Set、Map 之间的区别是什么?
- List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合。
- List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,他的键不允许重复,但是值是允许重复的;Set中存储的元素是无序的,并且不允许重复。
HashMap 和 Hashtable 有什么区别?
HashTable是线程安全的,HashMap的效率相比之下更高
如何决定使用 HashMap 还是 TreeMap?
如果你需要得到一个有序的结果时就应该使用TreeMap,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。
说一下 HashMap 的实现原理?
HashMap是基于哈希表的Map接口的非同步实现。
说一下 HashSet 的实现原理?
HashSet的底层由HashMap实现。
ArrayList 和 LinkedList 的区别是什么?
最明显的区别是ArrayList底层的数据结构是数组,而LinkedList的底层数据结构是双向循环链表。
如何实现数组和 List 之间的转换?
List转换为数组:调用ArrayList的toArray方法。
数组转换成为List:调用Arrays的asList方法。
ArrayList 和 Vector 的区别是什么?
ArrayList和Vector的区别就是ArrayList是线程不安全的,Vector是线程安全的。
Array 和 ArrayList 有何区别?
数组(Array)与列表(ArrayList)
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
在 Queue 中 poll()和 remove()有什么区别?
poll()和remove()都是从队列中取出一个元素,但是poll()在获取元素失败的时候会返回空,但是remove()失败的时候会抛出异常。
哪些集合类是线程安全的?
vector:就比arrayList多了个同步化机制,因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
HashTable:就比HashMap多了个线程安全。
迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象。
Iterator 怎么使用?有什么特点?
Java中的Iterator功能比较简单,并且只能单向移动。
- iterator要求容器返回一个Iterator。
- 使用next()获取序列中的下一个元素。
- 使用hasNext()检查序列中是否还有元素。
- 使用remove()将迭代器新返回的元素删除。
Iterator 和 ListIterator 有什么区别?
- Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
- ListIterator实现了Iterator接口,并包含其他的功能。
第三模块多线程
并行和并发有什么区别?
并发,指的是多个事情,在同一时间段内发生了。
并行,指的是多个事情,在同一时间点上发生了。
线程和进程的区别?
进程是一个在内存中运行的应用程序,线程是进程中的一个执行任务,负责当前进程中程序的执行。
守护线程是什么?
守护线程(daemon thread),是个服务线程,准确的来说就是服务其它的线程。
创建线程有哪几种方式?
- 继承Thread类创建线程类。
- 通过Runnable接口创建线程类。
线程有哪些状态?
- 创建
- 就绪
- 运行
- 阻塞
- 死亡
sleep() 和 wait() 有什么区别?
- sleep()方法是线程类Thread的静态方法。
- wait()是Object类的方法。
线程的 run()和 start()有什么区别?
start()方法用于启动线程,run()方法用于执行线程的运行时代码。
创建线程池有哪几种方式?
- newFixedThreadPool()
- newCachedThreadPool()
线程池都有哪些状态?
线程池有五种状态:
- Running
- ShutDown
- Stop
- Tidying
- Terminated
线程池中 submit()和 execute()方法有什么区别?
- 接收的参数不一样
在 java 程序中怎么保证多线程的运行安全?
线程安全在三个方面体现:
- 原子性
- 可见性
- 有序性
什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
ThreadLocal 是什么?
ThreadLocal是线程局部变量。
说一下 synchronized 底层实现原理?
synchronized的底层实现原理是跟monitor有关。
synchronized 和 volatile 的区别是什么?
volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
synchronized 和 Lock 有什么区别?
synchronized是java内置关键字,Lock是个java类。
synchronized 和 ReentrantLock 区别是什么?
synchronized是java内置关键字,ReentrantLock是个java类。
说一下 atomic 的原理?
Automic通过乐观锁机制保证原子性。
第四模块反射
什么是反射?
反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
什么是 java 序列化?什么情况下需要序列化?
当Java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理。
动态代理是什么?有哪些应用?
动态代理:
当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,顾名思义就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理。这个代理类并不是定义好的,而是动态生成的。具有解耦意义,灵活,扩展性强。
动态代理的应用:
- Spring的AOP
- 加事务
- 加权限
- 加日志
怎么实现动态代理?
首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。
第五模块对象拷贝
为什么要使用克隆?
想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了。
如何实现对象克隆?
- 重写clone()方法。
- 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
深拷贝和浅拷贝区别是什么?
- 浅拷贝只是复制了对象的引用地址。
- 深拷贝是将对象和值复制过来。
第六模块Java Web
jsp 和 servlet 有什么区别?
jsp的本质就是servlet,jsp经编译后就变成了servlet。
jsp 有哪些内置对象?作用分别是什么?
- request:封装客户端的请求,其中包含来自Get和Post请求的参数。
- response:封装服务器对客户端的请求。
- session:封装用户会话的对象。
- application:封装服务器运行环境的对象。
- page:jsp页面本身。
- exception:封装页面抛出的异常
说一下 jsp 的 4 种作用域?
- page代表与一个页面相关的对象和属性。
- request代表与Web客户机发出的一个请求相关的对象和属性。
- session代表与某个用户与服务器建立的一次会话相关的对象和属性。
- application代表与整个Web应用程序相关的对象和属性。
session 和 cookie 有什么区别?
浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie,用来保存Session对象的Id,然后将该Cookie发送到浏览器端。
说一下 session 的工作原理?
类似于一个大号的map。
如果客户端禁止 cookie 能实现 session 还能用吗?
可以通过手动URL进行传值。
spring mvc 和 struts 的区别是什么?
拦截机制不同,struts是类级别的拦截,springMVC是方法级别的拦截。
如何避免 sql 注入?
使用PreparedStatement
什么是 XSS 攻击?
XCC又称CSS,全称Cross Site Script(跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。
什么是 CSRF 攻击,如何避免?
CSRF(Cross-site request forgery)也被称为one-click attack或者session riding,中文全称是叫跨站请求伪造。一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。
如何避免:
- 使用验证码
第七模块异常
throw 和 throws 的区别?
throws用于方法头,表示的只是异常的申明,而throw用于方法内部,抛出的是异常对象。
final、finally、finalize 有什么区别?
- final可以修饰类、变量、方法。
- finally一般作用在try-catch代码块中。
- finalize是垃圾回收方法。
try-catch-finally 中哪个部分可以省略?
catch可以省略。
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会执行,会在return前执行。
常见的异常类有哪些?
- NullPoninterException
- SQLException
- IndexOutOfBoundsException
- FileNotFoundException
- IOException
- RuntimeException
第八模块网络
http 响应码 301 和 302 代表的是什么?
301、302都是HTTP状态的编码,都代表着某个URL发生了转移。
forward 和 redirect 的区别?
-
从地址栏来说:
forward地址栏不会改变。
-
从数据共享来说:
forward可以共享数据。
-
从效率来说:
forward效率高
redirect效率低
简述 tcp 和 udp的区别?
TCP面向连接,而UDP是无连接的。
get 和 post 请求有哪些区别?
GET在浏览器回退时是无害的,而POST会再次提交请求。
说一下 JSONP 实现原理?
jsonp即Json+padding,动态创建script标签。
说一下你熟悉的设计模式?
-
单例模式
这种类型的模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
-
代理模式
它的核心思想,是将对目标访问转移到代理对象上。
Spring / Spring MVC
为什么要使用 spring?
Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。