关于java:Java中常见面试题一中等

32次阅读

共计 2059 个字符,预计需要花费 6 分钟才能阅读完成。

Java 中常见面试题一(中等)

SQL 语句优化有哪些?数据库的优化怎么优化?

  • 对查问进行优化,应尽量避免全表扫描,首先应思考在 where 及 order by 波及的列上建设索引。
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃应用索引而进行全表扫描。
  • 应尽量避免在 where 子句中应用!= 或 <> 操作符,否则引擎将放弃应用索引而进行全表扫描。

乐观锁和乐观锁的解释及其利用场景

  • 乐观锁(Pessimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为他人会批改,所以每次在拿数据的时候都会上锁,这样他人想拿这个数据就会 block 直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比方行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
  • 乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为他人不会批改,所以不会上锁,然而在更新的时候会判断一下在此期间他人有没有去更新这个数据,能够应用版本号等机制。乐观锁实用于多读的利用类型,这样能够进步吞吐量,像数据库如果提供相似于 write_condition 机制的其实都是提供的乐观锁。
  • 应用场景
    两种锁各有优缺点,不可认为一种好于另一种,像乐观锁实用于写比拟少的状况下,即抵触真的很少产生的时候,这样能够省去了锁的开销,加大了零碎的整个吞吐量。但如果常常产生抵触,下层利用会一直的进行 retry,这样反倒是升高了性能,所以这种状况下用乐观锁就比拟适合。

过滤器和拦截器区别和我的项目中如何利用

  • 过滤器:在指标资源之前进行的操作,过滤所有的内容,比方 action、servlet、jsp、html
  • 拦截器:在指标资源之前进行的操作,不能拦挡所有的内容,拦挡 action,不能拦挡 jsp,不能拦挡 html
  • 拦截器和过滤器之间有很多相同之处,然而两者之间存在基本的差异。其次要区别为以下几点:
    (1)拦截器是基于 JAVA 反射机制的,而过滤器是基于函数回调的。
    (2)拦截器不依赖于 Servlet 容器,而过滤器依赖于 Servlet 容器。
    (3)拦截器只能对 Action 申请起作用,而过滤器能够对简直所有的申请起作用。
    (4)拦截器能够拜访 Action 上下文、值栈里的对象,而过滤器不能。
    (5)在 Action 的生命周期中,拦截器能够屡次被调用,而过滤器只能在容器初始化时被调用一次。

GC 回收机制的原理

  • 用户 Java 程序运行过程中,Java 虚拟机提供了另外一个零碎级的线程,专门负责回收不再被应用的对象占用的内存,这一过程称为垃圾回收。
  • 垃圾回收须要对堆内存中的对象进行标记,并对堆内存进行整顿。这一过程的某些阶段须要临时终止用户 Java 线程,等回收工作实现后再复原执行。因而,频繁地触发虚拟机垃圾回收操作的行为会影响程序的运行效率。
  • 那么什么状况下会频繁地登程垃圾回收操作呢,比方:堆内存设置过小,再比方:程序频繁地调配大型部分对象数组。

ConcurrentHashMap 原理

  • JDK1.7(Segment 数组构造和 HashEntry 数组构造)
  • JDK 1.7 ConcurrentHashMap 是由 Segment 数组构造和 HashEntry 数组构造组成。每个 Segment 都对应一个 Hash 表,且都有独立的锁,所以这样就能够每个线程拜访一个 Segment,就能够并行拜访了,从而进步了效率。这就是锁分段。
    (1)首先将数据分为一段一段的存储, 而后给每一段数据配一把锁,当一个线程占用锁拜访其中一个段数据时, 其余段的数据也能被其余线程拜访。
    (2)Segment 实现了 ReentrantLock, 所以 Segment 是一种可重入锁,表演锁的角色。HashEntry 用于存储键值对数据。
    (3)一个 ConcurrentHashMap 外面蕴含多个 Segment 数组。Segment 的构造和 HashMap 相似,是一种数组和链表构造。一个 Segment 蕴含一个 HashEntry 数组,每个 HashEntry 是一个链表构造的元素。每个 Segment 守护一个 HashEntry 数组里的元素,当对 HashEntry 数组的数据进行批改时, 首先取得对应的 Segment 的锁。
    (4)并行度(默认 16)
    concurrencyLevel:并行级别、并发数、Segment 数,怎么翻译不重要,了解它。默认是 16,也就是说 ConcurrentHashMap 有 16 个 Segments, 最多能够同时反对 16 个线程并发写。
  • JDK1.8(数组 + 链表 + 红黑树)
    (1)ConcurrentHashMap 勾销了 Segment 分段锁,采纳 CAS 和 synchronized 来保障并发平安。
    (2)数据结构跟 HashMap1。8 的构造相似, 数组 + 链表 / 红黑树。
    (3)jdk1.8 在链表长度超过肯定阀值 (8) 时, 将链表 (寻址工夫复杂度为 O(N)) 转换为红黑树(寻址工夫复杂度为 O(log(N)))
    (4)synchronized 只锁定以后链表或红黑树的首节点,这样只有 hash 不抵触,就不会产生并发,效率又晋升 N 倍。
正文完
 0