您的位置 首页 java

2021Java面试高频问点集锦

2021Java面试高频问点集锦

1,JavaScript中变量的作用域?

js中变量的作用域分两种:全局作用域和函数作用域。当JS解析器执行时,首先就会在执行环境里构建一个全局对象,我们定义的全局属性就是作为该对象的属性读取,在顶层代码中我们使用this关键字和window对象都可以访问到它。而函数体中的局部变量只在函数执行时生成的调用对象中存在,函数执行完毕时局部变量即可销毁。因此在程序设计中我们需要考虑如何合理声明变量,这样既减小了不必要的内存开销,同时能很大程度地避免变量重复定义而覆盖先前定义的变量所造成的Debug麻烦。

2,disable和readonly的区别

(1) 表面上可看到的区别就是当这两个词都设置为true时,都为禁用状态,当鼠标移上时使用disable的相关控件时鼠标出现禁用样式,并且不可做任何操作,而Readonly还可以获取文本框里的焦点。

(2) Disable比readonly的使用范围比广,适用文本框、文本域、下拉框、button按钮、单选框…….而readonly只适用于input(text、passwork、textarea)。

(3) Disable设置为true之后是不可以向后台提交数据的,此时可以选择改用readonly进行禁用,或者在提交数据时取消禁用。

3,jQuery的选择器有哪些?

1)基本选择器:

#id 、element 、.class 、* 、selector1,selector2,selectorN

2)层次选择器:

ancestor descendant 、parent > child 、prev + next 、prev ~ siblings

3)基本过滤器选择器

:first 、:last 、:not 、:even 、:odd 、:eq 、:gt 、:lt 、:header 、

:animated

4)内容过滤器选择器

:contains 、:empty 、:has 、:parent

5)可见性过滤器选择器

:hidden 、:visible

6)属性过滤器选择器

[ attribute ] 、[attribute=value] 、[attribute!=value] 、[attribute^=value] 、[attribute$=value] 、[attribute*=value] 、[attrSel1][attrSel2][attrSelN]

7)子元素过滤器选择器

:nth-child 、:first-child 、:last-child 、:only-child

8)表单选择器

:input 、:text 、:password 、:radio 、:checkbox 、:submit 、:image 、:reset 、:button

、:file 、:hidden

9)表单过滤器选择器

:enabled 、:disabled 、:checked 、:selected

4,说说类的初始化过程?

父类 静态变量 –>父类静态块–>子类静态变量–>子类静态块–>–父类变量–>

父类初始化块—>父类 构造器 —–>子类变量–>子类初始化块—>子类构造器

5,静态变量的生命周期?

1)加载:java虚拟机在加载类的过程中为静态变量分配内存。

2)销毁:类被卸载时,静态变量被销毁,并释放内存空间。static变量的生命周期取决于类的生命周期

6,简单谈谈java容器。

单列集合List和Set是实现了Collection接口的。

List:

1).可以允许重复的对象。

2).可以插入多个null元素。

3).是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。

4).常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用 索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

Set:

1).不允许重复对象

2). 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Compara ble 维护了一个排序顺序。

3). 只允许一个 null 元素

4).Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。而且可以重复

双列(key-value)集合Map:

1).Map不是collection的子接口或者实现类。Map是一个接口。

2).Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。

3).TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。

4).Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。

5).Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

7,java类的加载机制是什么?

双亲委派机制,即交给父,祖宗加载器。当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一层类加载器都是如此,因此,所有加载请求都传送到启动类(根)加载器中,只有当父类加载器反馈自己无法完成这个请求的时候(他的加载路径下,没有找到所加载的class)子类加载器才会尝试自己去加载。采用双亲委派的一个好处是,比如加载位于rt.jar包中的类java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这就保证了使用不同的类加载器,最终得到的都是同样一个Object对象

8,说说Java中的final关键字

(1)修饰类:表示该类不能被继承;

(2)修饰方法:表示方法不能被重写但是允许重载;

(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量);

(4)修饰对象:对象的引用地址不能变,但是对象的初始化值可以变。

9,spring的常用注解及使用场景

@ Controller 负责注册一个bean 到spring 上下文中

@Component 组件

@Service 在业务逻辑层使用

@Repository 在数据访问层使用(dao层)

@Autowired 由Spring提供

@Resource 由Java提供

@RequestMapping 用来定义访问的URL,你可以为整个类定义一个(用于整个类不是必须的,如果没有配置,所有的方法的访问路径配置将是完全独立的,没有任何关联)

@PathVariable 用于方法中的参数,表示方法参数绑定到地址URL的模板

@ResponseBody 这个注解可以直接放在方法上,表示返回类型将会直接作为HTTP响应字节流输出(不被放置在Model,也不被拦截为视图页面名称)。可以用于ajax

10,springMVC的原理

2021Java面试高频问点集锦

SpringMVC运行原理图

(1) Http请求:客户端请求提交到 DispatcherServlet

(2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。

(3) 调用处理器:DispatcherServlet将请求提交到Controller。

(4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。

(6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。

(8) Http响应:视图负责将结果显示到客户端。

11, 线程 的实现方式有哪些?

1) 继承Thread类,重写run方法

2)实现Runnable接口,重写run方法

3)实现Callable接口,重写Call方法

4) 从线程池获取

注:Runnable接口和Callable接口有什么区别?

Callable有返回值也可处理异常,但Runnable接口不具备这些功能

12,线程的状态有哪些?

1)创建:NEW

2)运行:RUNNABLE,

3)阻塞: BLOCKED,

4)等待,死等: WAITING,

5)超时等待: TIMED_WAITING,

6)终止: TERMINATED;

13,sychnorized和lock的区别?

1) Synchronized 内置的Java关键字, Lock 是一个Java类

2)Synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁

3)Synchronized 会自动释放锁,lock 必须要手动释放锁!如果不释放锁,死锁

4)Synchronized 线程 1(获得锁,阻塞)、线程2(等待,傻傻的等);Lock锁就不一定会等待下去;

5)Synchronized 可重入锁,不可以中断的,非公平;Lock ,可重入锁,可以 判断锁,非公平(可以自己设置);

6)Synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码!

14,什么是 自旋锁

自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。 它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。

15,wait和 sleep 的区别

1)来自不同的类

wait => Object

sleep => Thread

2)关于锁的释放

wait 会释放锁,

sleep 抱着锁睡,不会释放锁!

3)使用的范围是不同的

wait 只能使用在代码块中

sleep 可以在任何地方使用

16,Java8有哪些新特性?

1)HashMap效率更高

2)Lambda表达式,使代码更简洁优雅

3)强大的Stream流,使处理数据更强大

4)Forkjoin,并行高效

5)最大化减少空指针异常的Optional类

17,单例模式有几种?(代码省略,要会手写)

1)懒汉模式

2)恶汉单例

3)双重查锁模式

18,MySQL的事务隔离级别有哪些?

1)读未提交

2)读已提交

3)可重复度

4)串行化

19,为什么会有隔离级别?

主要为了保证数据的一致性

20,你是如何处理查询速度慢的问题?

第一,开启慢查询并捕获SQL语句

第二,Explain+慢SQL分析

第三,优化SQL语句(建索引,重写SQL等)

21,什么是索引覆盖?

仅仅使用索引列就可查询到数据的情况,即索引列覆盖了select的字段

22,说说索引失效的情况有哪些?

1)索引列上,尽量不要做操作,比如加减法,类型转换等

2)尽量少用*

3)范围之后会失效,索引的顺序也不能乱

4)尽量使用覆盖索引

5)在使用不等于的时候,无法使用索引会导致全表扫

6)使用is null 或者is not null时会导致索引失效

7)like以通配符’%’开头的索引失效,导致全表扫描

8)字符串不加单引号索引失效

9)少用or连接符,会导致索引失效

23, Redis 存储哪些数据类型?

1)String

2)Hash

3)List

4)Set

5)Zset

24,为什么要使用redis?

1)将高频查询的数据放在缓存中,减少对数据库的压力;

2)redis的响应很快啊!!!为什么快?(一般是连问)

3)快的原因:

a)redis是纯内存操作,所以快

b)redis是单线程的,没有多线程上下文切换的消耗

25,服务器崩溃时,redis中的数据会丢失吗?

不会丢失。因为redis有 持久化 的技术(RDB和AOF)

RDB持久化:是指在指定的时间间隔内将内存中的数据集快照写入磁盘, 实际操作过程是fork一个子进程,先将数据集写入临时文件, 写入成功后,再替换之前的文件,用二进制压缩存储。

AOF持久化:以日志的形式记录服务器所处理的每一个写、删除操作, 查询操作不会记录,以文本的方式记录,可以打开文件 看到详细的操作记录。

二者优缺点:

RDB存在哪些优势呢?

1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每

天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

2). 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。

3). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

RDB又存在哪些劣势呢?

1). 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

AOF的优势有哪些呢?

1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。

2). 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。

3). 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。

4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。

AOF的劣势有哪些呢?

1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。不过生产环境其实更多都是二者结合使用的。

(完)

以上题目都是本人最近找工作面试时常问的一些题目,附带答案分享给大家,答案均为本人理解,有不对的地方请指正,谢谢。

文章来源:智云一二三科技

文章标题:2021Java面试高频问点集锦

文章地址:https://www.zhihuclub.com/200282.shtml

关于作者: 智云科技

热门文章

网站地图