第一部分(基础)
一、JDK 和 JRE 有什么区别?
1、JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
2、JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境
具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。
二、 final 在 java 中有什么作用?
1、final 修饰的类叫最终类,该类不能被继承。
2、final 修饰的方法不能被重写。
3、final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
三、java 中的 Math.round(-1.5) 等于多少?
等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。
四、String 属于基础的数据类型吗?
String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
五、 java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。
1、String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
2、StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
六、String str="i"与 String str=new String("i")一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。
七、如何将字符串反转?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。
示例:
八、String 类的常用方法都有那些?
1、indexOf():返回指定字符的索引
2、charAt():返回指定索引处的字符
3、replace():字符串替换
4、trim():去除字符串两端空白
5、split():分割字符串,返回一个分割后的字符串数组。
6、getBytes():返回字符串的 byte 类型数组
7、length():返回字符串长度
8、toLowerCase():将字符串转成小写字母
9、toUpperCase():将字符串转成大写字符
10、substring():截取字符串
11、equals():字符串比较
九、抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法
示例:
十、普通类和抽象类有哪些区别?
1、普通类不能包含抽象方法,抽象类可以包含抽象方法
2、抽象类不能直接实例化,普通类可以直接实例化
十一、接口和抽象类有什么区别?
1、实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口
2、构造函数:抽象类可以有构造函数;接口不能有
3、main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main方法
4、实现数量:类可以实现很多个接口;但是只能继承一个抽象类
5、访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问 修饰符
十二、 java 中 IO 流分为几种?
按功能来分:输入流(input)、输出流(output)
按类型来分:字节流和字符流。
十三、 BIO、NIO、AIO 有什么区别?
1、BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低
2、NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用
3、AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制
十四、 Files的常用方法都有哪些?
1、Files.exists():检测文件路径是否存在
2、Files.createFile():创建文件
3、Files.createDirectory():创建文件夹
4、Files.delete():删除一个文件或目录
5、Files.copy():复制文件
6、Files.move():移动文件
7、Files.size():查看文件个数
8、Files.read():读取文件
9、Files.write():写入文件
10、
第二部分(容器)
十五、 java 容器都有哪些?
常用容器的图录:
十六、Collection 和 Collections 有什么区别?
1、java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
2、Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作
十七、List、Set、Map 之间的区别是什么?
十八、HashMap 和 Hashtable 有什么区别?
1、hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法
2、hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高
3、hashMap允许空键值,而hashTable不允许
十九、说一下 HashMap 的实现原理?
HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体
当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上
需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
二十、说一下 HashSet 的实现原理?
1、HashSet底层由HashMap实现
2、HashSet的值存放于HashMap的key上
3、HashMap的value统一为PRESENT
二十一、如何实现数组和 List 之间的转换
1、List转换成为数组:调用ArrayList的toArray方法
2、数组转换成为List:调用Arrays的asList方法
二十二、Array 和 ArrayList 有何区别?
1、Array可以容纳基本类型和对象,而ArrayList只能容纳对象
2、Array是指定大小的,而ArrayList大小是固定的
3、Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等
二十三、在 Queue 中 poll()和 remove()有什么区别?
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常
二十四、哪些集合类是线程安全的?
1、vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。
2、statck:堆栈类,先进后出。
3、hashtable:就比hashmap多了个线程安全。
4、enumeration:枚举,相当于迭代器。
二十五、迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小
第三部分(多线程)
二十六、并行和并发有什么区别?
1、并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
2、并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
3、在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群
所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能
二十七、 线程和进程的区别?
简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行
二十八、 守护线程是什么?
守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程
二十九、线程有哪些状态?
1、创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
2、就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
3、运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
4、阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
5、死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪
三十、在 java 程序中怎么保证多线程的运行安全?
线程安全在三个方面体现:
1、原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized);
2、可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized,volatile);
3、有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)
第四部分(Java Web)
三十一、jsp 和 servlet 有什么区别?
1、jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2、jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。
3、Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。
4、Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
三十二、jsp 有哪些内置对象?作用分别是什么?
JSP有9个内置对象:
request:封装客户端的请求,其中包含来自GET或POST请求的参数;
response:封装服务器对客户端的响应;
pageContext:通过该对象可以获取其他对象;
session:封装用户会话的对象;
application:封装服务器运行环境的对象;
out:输出服务器响应的输出流对象;
config:Web应用的配置对象;
page:JSP页面本身(相当于Java程序中的this);
exception:封装页面抛出异常的对象。
三十三、说一下 jsp 的 4 种作用域?
JSP中的四种作用域包括page、request、session和application,具体来说:
page代表与一个页面相关的对象和属性。
request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
三十四、说一下 session 的工作原理?
其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了
第五部分(异常)
三十五、常见的异常类有哪些?
NullPointerException:当应用程序试图访问空对象时,则抛出该异常。
SQLException:提供关于数据库访问错误或其他错误信息的异常。
IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
FileNotFoundException:当试图打开指定路径名表示的文件失败时,抛出此异常。
IOException:当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。
ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。
ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常。
IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。
ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
NegativeArraySizeException:如果应用程序试图创建大小为负的数组,则抛出该异常。
NoSuchMethodException:无法找到某一特定方法时,抛出该异常。
SecurityException:由安全管理器抛出的异常,指示存在安全侵犯。
UnsupportedOperationException:当不支持请求的操作时,抛出该异常。
RuntimeExceptionRuntimeException:是那些可能在Java虚拟机正常运行期间抛出的异常的超类
第六部分(网络)
三十六、OSI 的七层模型都有哪些?
1、应用层:网络服务与最终用户的一个接口。
2、表示层:数据的表示、安全、压缩。
3、会话层:建立、管理、终止会话。
4、传输层:定义传输数据的协议端口号,以及流控和差错校验。
5、网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
6、数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
7、物理层:建立、维护、断开物理连接
三十七、get 和 post 请求有哪些区别?
1、GET在浏览器回退时是无害的,而POST会再次提交请求。
2、GET产生的URL地址可以被Bookmark,而POST不可以。
3、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
4、GET请求只能进行url编码,而POST支持多种编码方式。
5、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6、GET请求在URL中传送的参数是有长度限制的,而POST么有。
7、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
9、GET参数通过URL传递,POST放在Request body中
三十八、java的八大数据基本类型
整型:byte, short, int, long
字符型:char
浮点型:float, double
布尔型:boolean
三十九、HTTP请求方式中8种请求方法(简单介绍)
1、options
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、head
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、connect
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
四十、java线程池threadpoolexecute支持的队列类型
SynchronousQueue,
LinkedBlockingDeque,
ArrayBlockingQueue
四十一、AOP的五种通知方式:
前置通知:在我们执行目标方法之前运行(@Before)
后置通知:在我们目标方法运行结束之后,不管有没有异常(@After)
返回通知:在我们的目标方法正常返回值后运行(@AfterReturning)
异常通知:在我们的目标方法出现异常后运行(@AfterThrowing)
环绕通知:目标方法的调用由环绕通知决定,即你可以决定是否调用目标方法,joinPoint.procced()就是执行目标方法的代码 。环绕通知可以控制返回对象(@Around)
四十二、Spring中的bean的作用域有哪些?
1、singleton:唯一bean实例,Spring中的bean默认都是单例的。
2、prototype:每次请求都会创建一个新的bean实例。
3、request:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTPrequest内有效。
4、session:每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTPsession内有效。
5、global-session:全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了