1、final、finalize和finally的不同之处?
解析:final是Java中的关键字,修饰符,用于声明 属性(属性不可交变)、方法(方法不可覆盖)、类(类不可继承)。
finally 是 异常处理语句结构 的一部分,不管是否有异常,他的语句总是执行。
finalize 是Object类的一个方法,主要是在收集器执行的时候会调用被回收对象的此方法,进行资源回收,例如关闭文件等。
2、Java中队列接口的方法poll()和remove()的区别?
解析: remove() 和 poll()都是用来从队列头部删除一个元素。
在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。
3、谈谈List、Set与Map的区别?遍历一个List有哪些不同的方式?
解析:
1、List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;
2、List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。
List遍历的方式:
public static void main(String[] args) {
List<Integer> list = Lists.newArrayList();
list.add(1);
list.add(2);
list.add(3);
//方法一 普通for循环遍历
System.out.println("普通for循环遍历");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//方法二 增强for (也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。
//内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
System.out.println("增强for");
for (int i : list) {
System.out.println(i);
}
//方法三 Lambda
System.out.println("Lambda");
list.forEach(e -> {
System.out.println(e);
});
list.stream().forEach(e -> {
System.out.println(e);
});
//方法四 倒序遍历
System.out.println("倒序遍历");
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}
//方法五 迭代器遍历
System.out.println("迭代器遍历");
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
//方法六 List集合自带迭代器
System.out.println("List集合自带迭代器");
ListIterator<Integer> listIterator = list.listIterator();
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
}
4、Java中创建线程有几种方式?
解析:
1、继承Thread类,重写run方法
2、实现Runnable接口,重写run方法
3、 使用Callable接口 和 FutureTask类创建线程
4、通过线程池创建线程
5、谈谈String、SpringBuffer和StringBuilder的区别?
解析:
(1)String为固定长度的字符串,StringBuffer和StringBuilder为变长字符串;
(2)String中的对象是不可变的,也可以理解为常量,线程安全。
StringBuffer是线程安全的,它的所有公开方法都是同步的(Synchronized),而StringBuilder 是没有对方法加锁同步的,因此StringBuilder的性能要大于StringBuffer。
(3)String适用于少量的字符串操作的情况。
StringBuilder适用于单线程下在字符缓冲区进行大量操作的情况。
StringBuffer适用多线程下在字符缓冲区进行大量操作的情况。
6、sleep()和wait()有什么区别?
解析:
1、相同点:sleep()和wait()都可以暂停线程的执行。
2、不同点:
所在类不同
sleep()是Thread类的静态方法;wait()是Object类的方法。
锁释放不同
sleep()是不释放锁的;wait()是释放锁的。
用途不同
sleep()常用于一定时间内暂停线程执行;wait()常用于线程间交互和通信。
用法不同
sleep()方法睡眠指定时间之后,线程会自动苏醒。
wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程。
7、synchronized和Lock的区别?
解析:
Lock是一个接口,而synchronized是关键字。
synchronized会自动释放锁,而Lock必须手动释放锁。
Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。
通过Lock可以知道线程有没有拿到锁,而synchronized不能。
Lock能提高多个线程读操作的效率。
synchronized能锁住类、方法和代码块,而Lock是块范围内的
8、Java异常处理中的try、catch、throw、throws和finally分别代表什么意义?
解析:
try指定预防所有“异常”的程序;
catch来指定要捕捉的“异常”类型;
throw 用来明确地抛出一个“异常”;
throws用来声明可能抛出的异常;
finally为确保一段代码不管发生什么“异常”都被执行。
9、Mybatis是如何防止SQL注入的?
解析:编写mybatis的映射语句时,尽量采用#{xxx}这样的格式
10、谈谈token和jwt的区别?
解析:token和jwt都是用来访问资源的令牌凭证,需要验证来确定身份信息
服务端验证客户端发送的token信息要进行数据的查询操作,Jwt验证客户端发来的token就不用,在服务端使用密钥校验就可以了,不用数据库的查询。
11、Redis中有哪些数据类型?
解析:常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。扩展【随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。】
12、请从软件原理分析spring mvc框架比struts框架优势在哪里?
解析:
1、springMVC安全性更高,structs2框架是类级别的拦截,每次request请求structs2都会为之创建一个action,然后将数据注入到实体been中,所以在structs2中,一个action对应一个request上下文。springMVC是方法级别的拦截,每个request对应一个方法,然后通过注解将数据注入到对应的实体中,所以在springMVC中,一个方法对应一个request上下文,粒度更小,所以说springMVC更安全
2、springMVC直接使用注解的方式,配置更加的简洁清晰,structs2将所有路径配置放在structs.xml文件中,多人开发的时候更容易产生冲突,配置相对复杂,但这也是structs2的一个优点,就是可以在这个文件中找到所有的路径。
3、springMVC的异常处理机制更加的优秀。Structs2因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理;在springMVC中采用统一的异常处理框架,配置异常处理之后直接在执行方法中抛出对应的异常,更加的准确,显示更加友好的用户界面提示。
4、相对于Structs2,springMVC的参数传递更加方便。springMVC直接使用对应的实体去接收form提交的表单信息,而structs2要在form中指定对应的实体,否则structs无法区分form中的数据对应哪个实体
13、Ajax作用有哪些?请写出Ajax请求流程
解析:
Ajax主要作用:
1.不刷新页面而更新网页(局部刷新)
2.在页面加载后从服务器请求数据
3.在页面加载后从服务器接收数据
4.在后台向服务器发送数据
ajax请求的基本流程
要完整实现一个AJAX异步调用和局部刷新,通常需要以下几个步骤:
1.创建 XMLHttpRequest 请求对象, 即创建一个异步调用对象。( new XMLHttpRequest() )
2.打开请求地址,指定请求方式。(open)
3.设置响应HTTP请求状态变化的函数.
4.发送HTTP请求。(send)
5.监听对应的请求状态的变化。( readystatechange事件 )
6.读取响应数据,使用 JavaScript 和 DOM 实现局部刷新。
14、从虚拟机原理分析实现Java虚拟机的好处是什么?
解析:
1、JVM 是Java平台的核心组件。JVM 的作用是执行 Java 字节码,它是一种解释器,负责执行 Java 程序。JVM 是跨平台的,因此 Java 程序可以在任何具有 JVM 的系统上运行,而无需对代码进行修改。 2、JVM 是一种字节码解释器,通过将 Java 程序编译成字节码,并在 JVM 上运行这些字节码来执行程序。JVM 提供了一组标准的指令集,并通过管理内存来实现自动内存管理,消除了内存泄漏的风险。 3、JVM 也具有很强的安全性。它限制了 Java 程序的权限,确保它不能损害系统的安全或隐私,并确保程序不能访问不属于它的资源。 4、此外,JVM 还提供了一组管理工具,以监控和管理 Java 程序的性能。例如,它可以监控程序的内存使用情况,并自动回收不再使用的内存,以确保程序始终保持高效。
15、根据线程安全的相关知识,分析以下代码,当调用test方法时,i>10时是否会引起死锁?并简要说明理由。
public void test (int i)
{
lock(this)
{
if ( i>10)
{
i--;
test( i );
}
}
}
解析:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
16、Session有几种存储方式,有什么不同?
17、面向对象的核心思想是什么?请你谈谈你在实战中是如何应用好这些核心思想的?
解析:将对象作为程序的基本单元,将程序和数据封装在其中,以提高软件的复用性,灵活性以及可扩展性
18、请你谈谈你对软件架构、框架的理解,并谈谈他们之间的区别和联系。
29、float f =3.4;是否正确? short s1=1;s1=s1+1;有错吗? short s1=1;s1+=1;有错吗?
20、Spring Boot的核心配置文件有哪几个?核心注解是哪个?它主要由哪几个注解组成的?
21、Spring Boot有几种读取配置的方式?SpringBoot的Actuator是做什么的?
22、Mybatis的缓存机制有哪些?和Redis的缓存机制相比有什么不同?
23、Activiti工作流的核心对象是什么?
24、RepositoryService、RuntimeService、TaskService、HistoryService、ldentityService分别表示什么操作?
25、谈谈你对数据库中的事务的理解。
26、介绍一下volatie的特征
27、介绍一下Callable和Future的用法
28、说明一下mybatis的#和$的区别
29、如何实现负载均衡,有哪些算法可以实现
30、什么是乐观锁和悲观锁
31、Spring框架用到哪些设计模式,请详细描述。
32、在多线程中如何线程同步?
33、下面一段程序会输出什么?
class A
{
protect int val = 1000;
static
{
System.out.println("A static");
}
public A ( )
{
val++;
System.out.println("A construtor( ),val="+val);
}
public void display( )
{
val++;
System.out.println("A display( ),val="+val);
}
}
class B extends A
{
static
{
System.out.println("B static");
}
public B( )
{
val++;
System.out.println("A display( ),val="+val);
}
public void display( )
{
val++;
System.out.println("B display( ),val="+val);
}
}
public class Test
{
public static void main (String args[ ])
{
A a = new B( );
a.display ( );
}
}
34、简述JSP的内置对象及方法
36、列出常用JSTL标签
37、列举使用过的jQuery插件
38、介绍一下jQuery的选择器
39、说出几种vue当中的指令和它的用法
40、Vue父子组件如何传递参数
41、v-show和v-if指令的共同点和不同点
42、请详细说下你对vue生命周期的理解
43、列举ORACLE中常用的函数
44、谈谈MVC的理解
45、列举一些常用的JAVA开源项目及作用
46、浅谈系统之间接口数据交互处理方案
47、浅谈JDK8特性的理解
48、浅谈Tomcat单体应用快速改造集群的方案
49、浅谈系统优化和迭代
50、浅谈对单体应用、集群、分布式系统的理解
51、浅谈MybatisPlus2 和MybatisPlus3的区别
52、浅谈Docker的理解和经验
53、浅谈Bladex使用
54、浅谈Hibernate使用经验
55、浅谈多模块项目构建
56、请简述如何使用关系型数据库实现实体多对多关联关系和继承关系
57、如下代码,有什么错误,请说明原因,并修改为正确代码(Number是Integer的父类)
public class Playground {
public static void printList(List<Number> list) {
//TODO
}
public static void main(String[] args) {
List<Integer> li = Arrays.asList(1, 2, 3);
printList(li);
}
}
58、如下代码是否合法,请从语法角度解释如下代码,并修改为Java 8函数式写法:
Runnable mRunnable = new Runnable() {
@Override
public void run() {
System.out.println("Run!");
}
};
59、请简述你了解的排序算法及原理
60、当对一个相对有序的数组进行排序时,使用哪种排序算法更好,并阐述理由。
61、Linux中,如何创建用户和设置密码
62、请描述Spring有bean的声明方式和几种依赖注入方式,并每一种举一个例子,包括配置和获取代码(可以使用基于XML的配置方式,基于注解的配置方式,基于Java的配置方式中任何一种)。
63、SpringMVC接收客户端请求参数的方式有几种,请写出示例代码。
64、你用过哪些设计模式?在什么场合下用的?请举例说明
65、假如让你去开发一个系统,你会如何估算系统的最大并发数﹖以及给出对应的解决方案?
66、面向对象编程中的类有哪些特性?
解析:封装、继承、多态、抽象。