中高级 java面试题总览

JAVA 基础

1. JAVA 中的几种基本数据类型是什么,各自占用多少字节。

 

数据类型

关键字

内置类

内存占用字节数

布尔型

boolean

Boolean

1字节

字符型

char

Character

2字节

字节型

byte

Byte

1字节

短整型

short

Short

2字节

整形

int

Integer

4字节

长整型

long

Long

8字节

单精度型

float

Float

4字节

双精度型

double

Double

8

 

2. String 类能被继承吗,为什么。

3. StringStringbufferStringBuilder的区别。

4. ArrayList  LinkedList 有什么区别。

5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序。

6. 用过哪些 Map 类,都有什么区别,HashMap 是线程安全的吗,并发下使用的 Map 是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。

当 HashMap 中的元素个数超过数组大小 loadFactor时,就会进行数组扩容,loadFactor的默认值为 0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为 16,那么当 HashMap 中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知 HashMap 中元素的个数,那么预设元素的个数能够有效的提高 HashMap 的性能。
 
HashMap 的性能参数
HashMap 包含如下几个构造器:
 
HashMap():构建一个初始容量为 16,负载因子为 0.75 的 HashMap。
HashMap(int initialCapacity):构建一个初始容量为 initialCapacity,负载因子为 0.75 的 HashMap
 
ConcurrentHashMap适用于读者数量超过写者时,当写者数量大于等于读者时,CHM的性能是低于Hashtable和synchronized Map的。这是因为当锁住了整个Map时,读操作要等待对同一部分执行写操作的线程结束。CHM适用于做cache,在程序启动时初始化,之后可以被多个请求线程访问。正如Javadoc说明的那样,CHM是HashTable一个很好的替代,但要记住,CHM的比HashTable的同步性稍弱
 
ArrayList:默认长度是10  一次扩容50%
默认长度是10  一次扩容50%

7. JAVA8  ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。

从Java 8开始,HashMap,ConcurrentHashMap和LinkedHashMap在处理频繁冲突时将使用平衡树来代替链表,
当同一hash桶中的元素数量超过特定的值便会由链表切换到平衡树,这会将get()方法的性能从O(n)提高到O(logn)。

8.  有没有有顺序的 Map  实现类,如果有,他们是怎么保证有序的。

9. 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。


10. 继承和聚合的区别在哪。

一、聚合
为了能够使用一条命令就能构建 account-email和 account-persist两个模块,我们需要建立一个额外的名为 account-aggregator的模块,然后通过该模块构建整个项目的所有模块。 account-aggregator本身也是个 Maven项目,它的 POM如下
Xml代码  收藏代码
 
    <project>  
        <modelVersion>4.0.0</modelVersion>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-aggregator</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        <packaging> pom </packaging>  
        <name>Account Aggregator</name>  
         <modules>  
            <module>account-email</module>  
            <module>account-persist</module>  
         </modules>  
    </project>  
 
 注意:packaging的类型为pom ,module的值是一个以当前POM为主目录的相对路径。
 
二、继承
 
可声明父POM供子 POM继承
 
父模块POM如下:
 
 
Xml代码   
    <project>  
        <modelVersion>4.0.0</modelVersion>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId> account-parent </artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        <packaging>pom</packaging>  
        <name>Account Parent</name>  
    </project>  
 
 子模块声明继承如下:
 
 
Xml代码   
    <project>  
        <modelVersion>4.0.0</modelVersion>  
          
        < parent >  
            <groupId>com.juvenxu.mvnbook.account</groupId>  
            <artifactId> account-parent </artifactId>  
            <version>1.0.0-SNAPSHOT</version>  
            < relativePath >../account-parent/pom.xml</ relativePath>  
        </ parent >  
          
        <artifactId> account-email </artifactId>  
        <name>Account Email</name>  
      ...  
    </project>  
 
 最后,同样还需要把 account-parent加入到聚合模块account-aggregator中。聚合的 POM如下:
 
 
Xml代码   
 
    <project>  
        <modelVersion>4.0.0</modelVersion>  
        <groupId>com.juvenxu.mvnbook.account</groupId>  
        <artifactId>account-aggregator</artifactId>  
        <version>1.0.0-SNAPSHOT</version>  
        <packaging> pom </packaging>  
        <name>Account Aggregator</name>  
        <modules>  
            <module>account-email</module>  
            <module>account-persist</module>  
            <module> account-parent</module>  
        </modules>  
    </project>  

11. 讲讲你理解的 nio。他和 bio 的区别是啥,谈谈 reactor 模型。 

Reactor模式首先是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将
输入的请求(Event)多路复用的分发给相应的Request Handle
http://www.blogjava.net/DLevin/archive/2015/09/02/427045.html

12. 反射的原理,反射创建类实例的三种方式是什么。

    //第一种表示方式--》实际在告诉我们任何一个类都有一个隐含的静态成员变量class
    Class class1 = Foo.class;
    
    //第二种表示方式  已经知道该类的对象通过getClass方法
    Class class2 = foo1.getClass();
 
    //第三种表达方式
    class3 = Class.forName("com.imooc.reflect.Foo");
     


13. 反射中,Class.forName  ClassLoader 区别

14. 描述动态代理的几种实现方式,分别说出相应的优缺点。

15. 动态代理与cglib 实现的区别。

       JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,
	cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,
	并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 
	采用非常底层的字节码生成技术

16. 为什么CGlib 方式可以对接口实现代理。

 

17. final的用途。

final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法

18. 出三种单例模式实现


19. 如何在父类中为子类自动完成所有的 hashcode  equals 实现?这么做有何优劣。

20. 请结合 OO 设计理念,谈谈访问修饰符 publicprivateprotecteddefault 在应用设计中的作用。


21. 深拷贝和浅拷贝区别。

22. 数组和链表数据结构描述,各自的时间复杂度。

23. error  exception 的区别,CheckedExceptionRuntimeException 的区别。

24. 请列出个运行时异常。


25. 在自己的代码中,如果创建一个 java.lang.String 对象,这个对象是否可以被类加载器加载?为什么。

http://blog.csdn.net/bbirdsky/article/details/8283143
字符串类(Java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生。在很多面试题中经常用String大做文章,只要掌握了String特性,对付它们就不再是困难了。
1、从根本上认识java.lang.String类和String池
首先,我建议先看看String类的源码实现,这是从本质上认识String类的根本出发点。
从源码中可以看到:
String类是final的,不可被继承。public final class String。
String类是的本质是字符数组char[], 并且其值不可改变。private final char value[];
 
然后打开String类的API文档,从API中可以发现:
String类对象有个特殊的创建的方式,就是直接指定比如String x = "abc","abc"就表示一个字符串对象。而x是"abc"对象的地址,也叫做"abc"对象的引用。
String对象可以通过“+”串联。串联后会生成新的字符串。也可以通过concat()来串联,这个后面会讲述。
Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
 
2、创建字符串的方式
创建字符串的方式很多,归纳起来有三类:
使用new关键字创建字符串,比如String s1 = new String("abc");
直接指定。比如String s2 = "abc";
使用串联生成新的字符串。比如String s3 = "ab" + "c"。
 
3、String对象的创建的特性
String对象的创建也很讲究,关键是要明白其原理。
 
特性1:
当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个字符串的内容在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
 
特性2:
Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
 
特性3:
使用直接指定、使用纯字符串串联或者在编译期间可以确定结果的变量表达式来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象;
1、 直接指定,例如:下面代码运行结果为true;
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
2、 使用纯字符串串联,例如:下面代码运行结果为true;
String str1 = "abc";
String str2 = "ab" + "c";
System.out.println(str1 == str2);
3、 在编译期间可以确定结果的变量表达式,例如:下面代码运行结果为true。
final String str1 = "c"; //final类型的变量在编译时当常量处理
String str2 = "ab" + "c";
String str3 = "ab" + str1;
System.out.println(str2==str3);
 
否则使用包含编译期间无法确定结果的变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String(由StringBuilder.toString()生成)对象。
1、普通变量表达式进行创建字符串,例如:下面代码运行结果为false;
String str1 = "c";
String str2 = "ab" + "c";
String str3 = "ab" + str1;
System.out.println(str2==str3);

26. 说一说你对 java.lang.Object 对象中 hashCode  equals 方法的理解。在什么场景下需要重新实现这两个方法。

27.  jdk1.5 中,引入了泛型,泛型的存在是用来解决什么问题。

28. 这样的 a.hashcode() 有什么用,与 a.equals(b)有什么关系。

1、equals方法用于比较对象的内容是否相等(覆盖以后)
2、hashcode方法只有在集合中用到
3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。
4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。
如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。

 

29. 有没有可能个不相等的对象有相同的 hashcode

equals()相等的两个对象,hashcode()一定相等;
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。

 

30. Java 中的 HashSet 内部是如何工作的。

31. 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。

 

JVM 知识


1. 什么情况下会发生栈内存溢出。

至于是堆内存溢出还是方法区内存溢出还是栈内存溢出,其实可以用一些工具比如
JConsole来监视


2. JVM 的内存结构,Eden  Survivor 比例。

3. jvm 中一次完整的 GC 流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的 jvm 参数。

4. 你知道哪几种垃圾收集器,各自的优缺点,重点讲下 cms,包括原理,流程,优缺点

5. 垃圾回收算法的实现原理。

6. 当出现了内存溢出,你怎么排错。

7. JVM 内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。


8. 简单说说你了解的类加载器。

9. 讲讲 JAVA 的反射机制。

10. 你们线上应用的 JVM 参数有哪些。

11. g1  cms 区别,吞吐量优先和响应优先的垃圾收集器选择。

12. 请解释如下 jvm 参数的含义:

-server -Xms512m -Xmx512m -Xss1024K
 
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly。
 
http://blog.csdn.net/a503921892/article/details/39048889
Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM初始内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xss128k: 设置每个线程的堆栈大小。在相同物理内 存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,
经验值在3000~5000左右
-XX:MaxPermSize=16m:设置持久代大小为16m
 -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

 系统学习JVM知识这篇文章讲的比较清楚

https://yq.aliyun.com/articles/434362


开源框架知识

1. 简单讲讲 tomcat 结构,以及其类加载器流程。

2. tomcat 如何调优,涉及哪些参数

3. 讲讲 Spring 加载流程。

4. 讲讲 Spring 事务的传播属性。

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。


5. Spring 如何管理事务的。

6. Spring 怎么配置事务(具体说出一些关键的 xml元素)。

tx:advice,aop:config


7. 说说你对 Spring 的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop 的实现原理,说说 aop 中的几个术语,它们是怎么相互工作的。

8. Springmvc  DispatcherServlet初始化过程。

1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
      HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
      数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
      数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
      数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图



操作系统

1. Linux 系统下你关注过哪些内核参数,说说你知道的。

2. Linux  IO 模型有几种,各自的含义是什么。

3. epoll  poll 有什么区别。

4. 平时用到哪些 Linux 命令。

5. 用一行命令查看文件的最后五行。

输出test文件的后五行:
 
liyi@liyi:~/Desktop > tail -n 5 test
 
输出test文件的前五行:
 
liyi@liyi:~/Desktop > head -n 5 test

6. 用一行命令输出正在运行的 java 进程。

7. 介绍下你理解的操作系统中线程切换过程。

8. 进程和线程的区别。

多线程

1. 多线程的几种实现方式,什么是线程安全。

2. volatile 的原理,作用,能代替锁么。

3. 画一个线程的生命周期状态图。

4. sleep  wait 的区别。

5. Lock  Synchronized 的区别

6. synchronized 的原理是什么,解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。

7. 用过哪些原子类,他们的原理是什么。

8. 用过线程池吗,newCache  newFixed 有什么区别,他们的原理简单概括下,构造函数的各个参数的含义是什么,比如 coreSizemaxsize 等。


9. 线程池的关闭方式有几种,各自的区别是什么。

10. 假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到。

11. spring  controller 是单例还是多例,怎么保证并发的安全。


singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。

12. 用三个线程按顺序循环打印 abc 三个字母,比如 abcabcabc

思路:解题思路大概是这样的,开启三个线程,每个线程一次打印一个字母,并且按照一定的顺序打印,当打印A的时候,其他线程处于阻塞状态,打印完A以后,
将线程解锁,让打印B的那个线程开启,其他线程处于阻塞状态,同理打印C的时候,阻塞其他线程,这三个线程顺序循环,就达到顺序多次打印ABC的目的了。
 
这道题看似思路简单,其实主要需要用到wait()方法和notify()方法,还有关键字synchronized,只有充分理解了这些,才能解出这道题。下面我有必要讲解一下这两个方法,
还有关键字synchronized。


13. ThreadLocal 用过么,用途是什么,原理是什么,用的时候要注意什么。

14. 如果让你实现一个并发安全的链表,你会怎么做。

http://blog.csdn.net/iter_zc/article/details/41115021



15. 有哪些无锁数据结构,他们实现的原理是什么。

ConcurrentLinkedQueue
从源代码角度来看整个入队过程主要做二件事情。第一是定位出尾节点,第二是使用CAS算法能将入队节点设置成尾节点的next节点,如不成功则重试。
http://blog.csdn.net/iter_zc/article/details/4111502

16. 讲讲 java 同步机制的 wait  notify

17. 多线程如果线程挂住了怎么办。

18. countdowlatch  cyclicbarrier的内部原理和用法,以及相互之间的差别。

19. 使用 synchronized 修饰静态方法和非静态方法有什么区别。

 所有的非静态同步方法用的都是同一把锁——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,
  该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,
  可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,
  所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。
 
  而所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,
  所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,
  其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,
  还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!



20. 简述 ConcurrentLinkedQueue  LinkedBlockingQueue 的用处和不同之处。

21. 导致线程死锁的原因?怎么解除线程死锁。

22. 非常多个线程(可能是不同机器),相互之间需要等待协调,才能完成某种工作,问怎么设计这种协调方案。

CountDownLatch,CyclicBarrier

23. 正确使用 Volatile 变量

正确使用 volatile 变量的条件
 
您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
 
1对变量的写操作不依赖于当前值。
2该变量没有包含在具有其他变量的不变式中。
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html



TCP  HTTP

1. http1.0  http1.1 有什么区别。

在http1.0中,当建立连接后,客户端发送一个请求,服务器端返回一个信息后就关闭连接,
当浏览器下次请求的时候又要建立连接,显然这种不断建立连接的方式,会造成很多问题。
   
在http1.1中,引入了持续连接的概念,通过这种连接,浏览器可以建立一个连接之后,
发送请求并得到返回信息,然后继续发送请求再次等到返回信息,也就是说客户端可以连续发送多个请求,而不用等待每一个响应的到来。



2. TCP 三次握手和四次挥手的流程,为什么断开连接要 4,如果握手只有两次,会出现什么。

3. TIME_WAIT  CLOSE_WAIT 的区别。

4. 说说你知道的几种 HTTP 响应码,比如 200, 302, 404

5. 当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤。

6. TCP/IP 如何保证可靠性,说说 TCP 头的结构。

7. 如何避免浏览器缓存。

8. 简述 Http 请求 get  post 的区别以及数据包格式。

GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中
POST提交:把提交的数据放置在是HTTP包的包体<request-body>中


9. 简述 HTTP 请求的报文格式。

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
http://blog.csdn.net/zhangliang_571/article/details/23508953


10. HTTPS 的加密方式是什么,讲讲整个加密解密流程。

架构设计与分布式

1. 常见的缓存策略有哪些,你们项目中用到了什么缓存系统,如何设计的。

2.  java 自己实现一个 LRU

3. 分布式集群下如何做到唯一序列号。

4. 设计一个秒杀系统,30 分钟没付款就自动关闭交易。

5. 如何使用 redis  zookeeper 实现分布式锁?有什么区别优缺点,分别适用什么场景。

6. 如果有人恶意创建非法连接,怎么解决。

7. 分布式事务的原理,优缺点,如何使用分布式事务。

8. 什么是一致性 hash

9. 什么是 restful,讲讲你理解的 restful

10. 如何设计建立和保持 100w 的长连接。

11. 如何防止缓存雪崩。

12. 解释什么是 MESI 协议(缓存一致性)

13. 说说你知道的几种 HASH 算法,简单的也可以。

14. 什么是 paxos 算法。

15. 什么是 zab 协议。

16. 一个在线文档系统,文档可以被编辑,如何防止多人同时对同一份文档进行编辑更新。

17. 线上系统突然变得异常缓慢,你如何查找问题。

18. 说说你平时用到的设计模式。 

19. Dubbo 的原理,数据怎么流转的,怎么实现集群,负载均衡,服务注册和发现。重试转发,快速失败的策略是怎样的

20. 一次 RPC 请求的流程是什么。

21. 异步模式的用途和意义。

22. 缓存数据过期后的更新如何设计。

23. 编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用。

24. 设计一个社交网站中的私信功能,要求高并发、可扩展等等。画一下架构图。

25. MVC 模式,即常见的 MVC 框架。

26. 聊了下曾经参与设计的服务器架构。

27. 应用服务器怎么监控性能,各种方式的区别。

28. 如何设计一套高并发支付方案,架构如何设计。

29. 如何实现负载均衡,有哪些算法可以实现。

30. Zookeeper 的用途,选举的原理是什么。

31. Mybatis 的底层实现原理。

MyBatis底层就是JDBC   所以他的核心就是配置文件  :
 
      1:全局配置文件 (配置数据源 事务运行时信息)
      2:映射文件(执行statement的相关信息,包括SQL语句,输入参数,输出结果)
      MyBatis把全局配置文件加载到内容中 构建出SqlSessionFactory    ,这个工厂的作用相当于生产对象生产SqlSession。
     SqlSession   :它是一个面向程序员的接口,可以操作数据库。 接口有一个默认实现DefaultSqlSession。
在SqlSession   中有一个executor 执行器。  SqlSession   本身不能操作数据库 需要通过这个执行器去操作。有2个实现 一个叫做基本执行器,还有一个缓存执行器
(默认)。 MappedStatement:封装了执行Statement信息,包括SQL语句 输入参数,输出结果。由它去操作数据库。
 
输入输出参数类型:
            1:基本类型
            2:自定义类型
            3:hashmap
 
根据源码:看到Sqlsession内部并不能直接操作数据库。而是利用内部的一个执行器去操作数据库。执行器执行的时候会去执行MappedStatement 
到最后才去真正执行数据库。

32. 请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存。

33. 请思考一个方案,实现分布式环境下的 countDownLatch

34. 后台系统怎么防止请求重复提交。

http://blog.csdn.net/wws199304/article/details/44279589


 
 

35. 如何看待缓存的使用(本地缓存,集中式缓存),简述本地缓存和集中式缓存和优缺点。本地缓存在并发使用时的注意事项。

36. 描述一个服务从发布到被消费的详细过程。

37. 讲讲你理解的服务治理。

38. 如何做到接口的幂等性。

接口幂等性,只要保证接口内的逻辑不涉及接口外的对象状态累积或变迁即可。

譬如说需求是:
当用户点击赞同时,将答案的赞同数量+1。
改为:
当用户点击赞同时,确保答案赞同表中存在一条记录,用户、答案。
赞同数量由答案赞同表统计出来



39.redis和memcached的区别

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;
5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从;
6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);
7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;
8、Redis支持数据的备份,即master-slave模式的数据备份;
9、应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。



算法

1. 10 亿个数字里里面找最小的 10 个。

2. 亿个数字,其中有个是重复的,快速找到它,时间和空间要最优。

3. 2 亿个随机生成的无序整数,找出中间大小的值。

4. 给一个不知道长度的(可能很大)输入字符串,设计一种方案,将重复的字符排重。

5. 遍历二叉树。

6.  3n+1 个数字,其中 3n 个中是重复的,只有个是不重复的,怎么找出来。

7. 写一个字符串反转函数。

8. 常用的排序算法,快排,归并、冒泡。 快排的最优时间复杂度,最差复杂度。冒泡排序的优化方案。

9. 二分查找的时间复杂度,优势。

10. 一个已经构建好的 TreeSet,怎么完成倒排序。

11. 什么是 B+树,B-树,列出实际的使用场景。


SQL

1. 行转列

姓名       课程       分数

---------- ---------- -----------

张三       语文        74

张三       数学        83

张三       物理        93

李四       语文        74

李四       数学        84

李四       物理        94

SELECT 姓名,
 max(CASE 课程 WHEN'语文' THEN 分数 ELSE 0 END) 语文,
 max(CASE 课程 WHEN'数学' THEN 分数 ELSE 0 END) 数学,
 max(CASE 课程 WHEN'物理' THEN 分数 ELSE 0 END) 物理
FROM tb
GROUP BY 姓名
 
姓名       语文        数学        物理
---------- ----------- ----------- -----------
李四        74          84          94
张三        74          83          93


2. MySQL存储引擎- MyISAM与InnoDB区别

InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,
而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
 
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用



中间件

Dubbo提供了多种均衡策略,缺省为random随机调用。

Random LoadBalance

随机,按权重设置随机概率。

在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

   RoundRobin LoadBalance

轮循,按公约后的权重设置轮循比率。

存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

   LeastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

  ConsistentHash LoadBalance

一致性Hash,相同参数的请求总是发到同一提供者。

当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

集群容错模式:

   Failover Cluster

失败自动切换,当出现失败,重试其它服务器。(缺省)

通常用于读操作,但重试会带来更长延迟。

可通过retries="2"来设置重试次数(不含第一次)。正是文章刚开始说的那种情况.

  Failfast Cluster

快速失败,只发起一次调用,失败立即报错。

通常用于非幂等性的写操作,比如新增记录。

  Failsafe Cluster

失败安全,出现异常时,直接忽略。

通常用于写入审计日志等操作。

  Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。

通常用于消息通知操作。

  Forking Cluster

并行调用多个服务器,只要一个成功即返回。

通常用于实时性要求较高的读操作,但需要浪费更多服务资源。

可通过forks="2"来设置最大并行数。

  Broadcast Cluster

广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)

通常用于通知所有提供者更新缓存或日志等本地资源信息。

重试次数配置如:(failover集群模式生效)


MQ分布式系统事务一致性解决方案

http://www.infoq.com/cn/articles/solution-of-distributed-system-transaction-consistency


redis分布式缓存

猜你喜欢

转载自blog.csdn.net/jishuisanqianli/article/details/64906595