Hibernate的特色:强大、方便、高效、复杂、绕弯子、全自动 1. 对象/关系数据库映射,彻底的向对象思想。开发速度快。 2. Sql移植性好。具备本身的日志统计。 3. 缓存机制,提供一级缓存和二级缓存。 4. 功能和特性很是多,不适合多表关联查询。 5. 事物transaction ,没有侵入性,即所谓的轻量级框架。 6. 透明持久化,具备业务功能的单线程对象。 7. 简洁的 HQL编程。 Mybatis的特色:小巧、方便、高效、简单、直接、半自动 1.Sql更加细致,手写sql语句,减小查询字段,有利于sql优化。 2.Mybatis简单,更容易掌握。 hibernate调优方案: 1、制定合理的缓存策略 2、尽可能使用延迟加载特性 3、采用合理的session管理机制 4、使用批量抓取设定合理的批处理参数 五、进行合理的O/R映射设计 mybatis中resultMap和resultType的区别: resultType是表示直接返回类型。resultType和resultMap不能同时存在。查询出来的每个属性都至关于一个map。 Mybatis动态sql语句: if 语句、if+where 语句、if+set 语句、choose(when,otherwise) 语句、trim 语句、foreach 语句 如何解决高并发的问题: 1. html页面静态化 2. 图片服务器分离 3. 数据库集群和库表散列 4. 缓存 5. 负载均衡 6. 镜像 svn和git的区别? Git是分布式的,把内容按元数据方式存储,没有一个全局版本号,Git的内容的完整性要优于SVN:,GIT的内容存储使用的是SHA-1哈希算法,(分布式版本控制) Svn不是分布的,按文件方式进行存储,有全局的版本号。(集中式版本控制) 集群软件的分类: 高性能集群:弥补了单机性的不足,运用在天气监测上 负载均衡集群:选择最小的服务器处理 高可用性集群:当一台机器坏了,另外一台服务器会马上代替上一台服务器。通常用在银行、电信。 处理高并发的的方法? 1、HTML静态化 2、图片服务器分离 3、数据库集群和库表散列 4、缓存 5、镜像 6、负载均衡 类加载器有哪些? 咱们进一步了解类加载器间的关系(并不是指继承关系),主要能够分为如下4点 启动类加载器,由C++实现,没有父类。 拓展类加载器(ExtClassLoader),由Java语言实现,父类加载器为null。 系统类加载器(AppClassLoader),由Java语言实现,父类加载器为ExtClassLoader。 自定义类加载器,父类加载器确定为AppClassLoader。 双亲委派模式? 双亲委派模式要求除了顶层的启动类加载器外,其他的类加载器都应当有本身的父类加载器,请注意双亲委派模式中的父子关系并不是一般所说的类继承关系,而是采用组合关系来复用父类加载器的相关代码,类加载器间的关系以下: 双亲委派模式是在Java 1.2后引入的,其工做原理的是,若是一个类加载器收到了类加载请求,它并不会本身先去加载,而是把这个请求委托给父类的加载器去执行,若是父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,若是父类加载器能够完成类加载任务,就成功返回,假若父类加载器没法完成此加载任务,子加载器才会尝试本身去加载,这就是双亲委派模式。 双亲委派模式优点: 采用双亲委派模式的是好处是Java类随着它的类加载器一块儿具有了一种带有优先级的层次关系,经过这种层级关能够避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设经过网络传递一个名为java.lang.Integer的类,经过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会从新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样即可以防止核心API库被随意篡改。可能你会想,若是咱们在classpath路径下自定义一个名为java.lang.SingleInterge类(该类是胡编的)呢?该类并不存在java.lang中,通过双亲委托模式,传递到启动类加载器中,因为父类加载器路径下并无该类,因此不会加载,将反向委托给子类加载器加载,最终会经过系统类加载器加载该类。可是这样作是不容许,由于java.lang是核心API包,须要访问权限,强制加载将会报出以下异常 java.lang.SecurityException: Prohibited package name: java.lang 因此不管如何都没法加载成功的。 jvm的优化? a) 设置参数,设置jvm的最大内存数 b) 垃圾回收器的选择 什么是Java虚拟机?为何Java被称做是“平台无关的编程语言”? Java虚拟机是一个能够执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成容许应用程序能够运行在任意的平台,而不须要程序员为每个平台单独重写或者是从新编译。Java虚拟机让这个变为可能,由于它知道底层硬件平台的指令长度和其余特性。 JDK和JRE的区别是什么? Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet须要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其余的工具(好比:JavaDoc,Java调试器),可让开发者开发、编译、执行Java应用程序。 JDK(Java Development Kit)即为Java开发工具包,包含编写Java程序所必须的编译、运行等开发工具以及JRE。开发工具如:用于编译java程序的javac命令、用于启动JVM运行java程序的java命令、用于生成文档的javadoc命令以及用于打包的jar命令等等。 JRE(Java Runtime Environment)即为Java运行环境,提供了运行Java应用程序所必须的软件环境,包含有Java虚拟机(JVM)和丰富的系统类库。系统类库即为java提早封装好的功能类,只需拿来直接使用便可,能够大大的提升开发效率。 JVM(Java Virtual Machines)即为Java虚拟机,提供了字节码文件(.class)的运行环境支持。 简单说,就是JDK包含JRE包含JVM。 ”static”关键字是什么意思?Java中是否能够覆盖(override)一个private或者是static的方法? “static”关键字代表一个成员变量或者是成员方法能够在没有所属的类的实例变量的状况下被访问。 Java中static方法不能被覆盖,由于方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,因此概念上不适用。 是否能够在static环境中访问非static变量? static变量在Java中是属于类的,它在全部的实例中的值是同样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。若是你的代码尝试不用实例来访问非static的变量,编译器会报错,由于这些变量尚未被建立出来,尚未跟任何实例关联上。 [第12题] Java支持的数据类型有哪些?什么是自动拆装箱? Java语言支持的8中基本数据类型是: Byte、short、int、long、float、double、boolean、char 自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间作的一个转化。好比:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。 Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思? Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同可是参数不一样的状况。与此相对,方法覆盖是说子类从新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。 Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数? 当新对象被建立的时候,构造函数会被调用。每个类都有构造函数。在程序员没有给类提供构造函数的状况下,Java编译器会为这个类建立一个默认的构造函数。 Java中构造函数重载和方法重载很类似。能够为一个类建立多个构造函数。每个构造函数必须有它本身惟一的参数列表。 Java不支持像C++中那样的复制构造函数,这个不一样点是由于若是你不本身写构造函数的状况下,Java不会建立默认的复制构造函数。 Java支持多继承么? Java不支持多继承。每一个类都只能继承一个类,可是能够实现多个接口。 接口和抽象类的区别是什么? Java提供和支持建立抽象类和接口。它们的实现有共同点,不一样点在于: 接口中全部的方法隐含的都是抽象的。而抽象类则能够同时包含抽象和非抽象的方法。 类能够实现不少个接口,可是只能继承一个抽象类 类若是要实现一个接口,它必需要实现接口声明的全部方法。可是,类能够不实现抽象类声明的全部方法,固然,在这种状况下,类也必须得声明成是抽象的。 抽象类能够在不提供接口方法实现的状况下实现接口。 Java接口中声明的变量默认都是final的。抽象类能够包含非final的变量。 Java接口中的成员函数默认是public的。抽象类的成员函数能够是private,protected或者是public。 接口是绝对抽象的,不能够被实例化。抽象类也不能够被实例化,可是,若是它包含main方法的话是能够被调用的。 也能够参考JDK8中抽象类和接口的区别 什么是值传递和引用传递? 对象被值传递,意味着传递了对象的一个副本。所以,就算是改变了对象副本,也不会影响源对象的值。 对象被引用传递,意味着传递的并非实际的对象,而是对象的引用。所以,外部对引用对象所作的改变会反映到全部的对象上。 咱们能在 Switch 中使用 String 吗? 从 Java 7 开始,咱们能够在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实如今 switch 中使用字符串的 hash code。 Java 中的构造器链是什么? 当你从一个构造器中调用另外一个构造器,就是Java 中的构造器链。这种状况只在重载了类的构造器的时候才会出现。 64 位 JVM 中,int 的长度是多数? Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。 a==b”和”a.equals(b)”有什么区别? 若是 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true a.equals(b) 是进行逻辑比较,因此一般须要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,因此能够用于两个不一样对象,可是包含的字母相同的比较。 a.hashCode() 有什么用?与 a.equals(b) 有什么关系? hashCode() 方法是相应对象整型的 hash 值。它经常使用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具备相同的 hash code。 final、finalize 和 finally 的不一样之处? final 是一个修饰符,能够修饰变量、方法和类。若是 final 修饰变量,意味着该变量的值在初始化后不能被改变。 finalize 方法是在对象被回收以前调用的方法,给对象本身最后一个复活的机会,可是何时调用 finalize 没有保证。 finally 是一个关键字,与 try 和 catch 一块儿用于异常的处理。finally 块必定会被执行,不管在 try 块中是否有发生异常。 [第26题] 用最有效率的方法计算2乘以8? 2 << 3(左移3位至关于乘以2的3次方,右移3位至关于除以2的3次方) JVM的内存结构? 答:主要分为三大块 堆内存、方法区、栈;栈又分为JVM栈、本地方法栈 堆(heap space),堆内存是JVM中最大的一块,有年轻代和老年代组成,而年轻代又分为三分部分,Eden区,From Survivor,To Survivor,默认状况下按照8:1:1来分配 方法区(Method area),存储类信息、常量、静态变量等数据,是线程共享的区域 程序计数器(Program counter Register),是一块较小的内存空间,是当前线程所执行的字节码的行号指示器 JVM栈(JVM stacks),也是线程私有的,生命周期与线程相同,每一个方法被执行时都会建立一个栈帧,用于存储局部变量表、操做栈、动态连接、方法出口等信息 本地方法栈(Native Mthod Stacks),为虚拟机使用的native方法服务 System.gc()和Runtime.gc()会作什么事情? 这两个方法用来提示JVM要进行垃圾回收。可是,当即开始仍是延迟进行垃圾回收是取决于JVM的。 怎样经过 Java 程序来判断 JVM 是 32 位 仍是 64 位? 你能够检查某些系统属性如 sun.arch.data.model 或 os.arch 来获取该信息。 JRE、JDK、JVM 及 JIT 之间有什么不一样? JRE 表明 Java 运行时(Java run-time),是运行 Java 引用所必须的。 JDK 表明 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java 编译器,它也包含 JRE。 JVM 表明 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。 JIT 表明即时编译(Just In Time compilation),当代码执行的次数超过必定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提升 Java 应用的性能。 你能保证 GC 执行吗? 不能,虽然你能够调用 System.gc() 或者 Runtime.gc(),可是没有办法保证 GC 的执行。 动态代理的两种方式,以及区别? 答:jdk动态代理和cglib动态代理; JDK动态代理只能对实现了接口的类生成代理,而不能针对类;cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,由于是继承,因此该类或方法最好不要声明称final,final能够阻止继承和多态; Java中Exception和Error有什么区别? Exception和Error都是Throwable的子类。Exception用于用户程序能够捕获的异常状况。Error定义了不指望被用户程序捕获的异常。 hrow和throws有什么区别? throw关键字用来在程序中明确的抛出异常,相反,throws语句用来代表方法不能处理的异常。每个方法都必需要指定哪些异常不能处理,因此方法的调用者才可以确保处理可能发生的异常,多个异常是用逗号分隔的。 异常处理完成之后,Exception对象会发生什么变化? Exception对象会在下一个垃圾回收过程当中被回收掉。 什么是不可变对象(immutable object)?Java 中怎么建立一个不可变对象? 不可变对象指对象一旦被建立,状态就不能再改变。任何修改都会建立一个新的对象,如 String、Integer及其它包装类。 &和&&的区别? &运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差异是很是巨大的,虽然两者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之因此称为短路运算是由于,若是&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。不少时候咱们可能都须要用&&而不是&,例如在验证用户登陆时断定用户名不是null并且不是空字符串,应当写为:username != null &&!username.equals(“”),两者的顺序不能交换,更不能用&运算符,由于第一个条件若是不成立,根本不能进行字符串的equals比较,不然会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差异也是如此。 咱们能将 int 强制转换为 byte 类型的变量吗?若是该值大于 byte 类型的范围,将会出现什么现象? 是的,咱们能够作强制转换,可是 Java 中 int 是 32 位的,而 byte 是 8 位的,因此,若是强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 128。 String和StringBuilder、StringBuffer的区别? String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。StringBuffer/StringBuilder类表示的字符串对象能够直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法彻底相同,区别在于它是在单线程环境下使用的,由于它的全部方面都没有被synchronized修饰,所以它的效率也比StringBuffer要高。 集合类 Collection集合接口,List、set实现Collection接口,arraylist、linkedlist,vector实现list接口,stack继承vector,Map接口,hashtable、hashmap实现map接口 Java集合类框架的基本接口有哪些? Collection:表明一组对象,每个对象都是它的子元素。 Set:不包含重复元素的Collection。 List:有顺序的collection,而且能够包含重复元素。 Map:能够把键(key)映射到值(value)的对象,键不能重复。 什么是迭代器(Iterator)? Iterator接口提供了不少对集合元素进行迭代的方法。每个集合类都包含了能够返回迭代器实例的迭代方法。迭代器能够在迭代的过程当中删除底层集合的元素,可是不能够直接调用集合的remove(Object Obj)删除,能够经过迭代器的remove()方法删除。 Iterator和ListIterator的区别是什么? Iterator可用来遍历Set和List集合,可是ListIterator只能用来遍历List。 Iterator对集合只能是前向遍历,ListIterator既能够前向也能够后向。 ListIterator实现了Iterator接口,并包含其余的功能,好比:增长元素,替换元素,获取前一个和后一个元素的索引,等等。 Java中的HashMap的工做原理是什么? Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap须要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,而后把键值对存储在集合中合适的索引上。若是key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。 如何决定选用HashMap仍是TreeMap? 对于在Map中插入、删除和定位元素这类操做,HashMap是最好的选择。然而,假如你须要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。 HashMap,HashTable,ConcurrentHashMap的区别? a、HashMap是非线程安全的,HashTable是线程安全的。 b、HashMap的键和值都容许有null值存在,而HashTable则不行。 c、由于线程安全的问题,HashMap效率比HashTable的要高。 HashMap:它根据键的hashCode值存储数据,大多数状况下能够直接定位到它的值,于是具备很快的访问速度,但遍历顺序倒是不肯定的。 HashMap最多只容许一条记录的键为null,容许多条记录的值为null。HashMap非线程安全,即任一时刻能够有多个线程同时写HashMap,可能会致使数据的不一致。若是须要知足线程安全,能够用 Collections的synchronizedMap方法使HashMap具备线程安全的能力,或者使用ConcurrentHashMap。 Hashtable:Hashtable是遗留类,不少映射的经常使用功能与HashMap相似,不一样的是它承自Dictionary类,而且是线程安全的,任一时间只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,由于ConcurrentHashMap引入了分段锁。 极高并发下HashTable和ConcurrentHashMap哪一个性能更好,为何,如何实现的? 答:固然是ConcurrentHashMap,由于ConcurrentHashMap引入了分段锁,而HashTable则使用的是方法级别的锁;所以在新版本中通常不建议使用HashTable,不须要线程安全的场合可使用HashMap,而须要线程安全的场合可使用ConcurrentHashMap; ArrayList和数组(Array)和有什么区别?何时应该使用Array而不是ArrayList? Array能够容纳基本类型和对象,而ArrayList只能容纳对象。 Array是指定大小的,而ArrayList大小是固定的。 Array没有提供ArrayList那么多功能,好比addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。 ArrayList和LinkedList有什么区别? 相同点:ArrayList和LinkedList都实现了List接口 不一样点:ArrayList是基于索引的数据接口,它的底层是数组。它能够以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每个元素都和它的前一个和后一个元素连接在一块儿,在这种状况下,查找某个元素的时间复杂度是O(n)。 LinkedList的插入,添加,删除操做速度比ArrayList更快,由于当元素被添加到集合任意位置的时候,不须要像数组那样从新计算大小或者是更新索引。 LinkedList比ArrayList更占内存,由于LinkedList为每个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。 ArrayList和Vector有何异同点? 相同点: (1)二者都是基于索引的,内部由一个数组支持。 (2)二者维护插入的顺序,咱们能够根据插入顺序来获取元素。 (3)ArrayList和Vector的迭代器实现都是fail-fast的。 (4)ArrayList和Vector二者容许null值,也可使用索引值对元素进行随机访问。 不一样点: (1)Vector是同步的,而ArrayList不是。然而,若是你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。 (2)ArrayList比Vector快,它由于有同步,不会过载。 (3)ArrayList更加通用,由于咱们可使用Collections工具类轻易地获取同步列表和只读列表。 Comparable和Comparator接口是干什么的?列出它们的区别。 Java提供了只包含一个compareTo()方法的Comparable接口。这个方法能够个给两个对象排序。具体来讲,它返回负数,0,正数来代表输入对象小于,等于,大于已经存在的对象。 Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数代表第一个参数是小于,等于,大于第二个参数。equals()方法须要一个对象做为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator而且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。 HashSet和TreeSet有什么区别? HashSet是由一个hash表来实现的,它的元素是无序的。TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。 poll() 方法和 remove() 方法的区别? poll() 和 remove() 都是从队列中取出一个元素,可是 poll() 在获取元素失败的时候会返回空,可是 remove() 失败的时候会抛出异常。 Java 中的 TreeMap 是采用什么树实现的? Java 中的 TreeMap 是使用红黑树实现的。 集合框架中的泛型有什么优势? Java1.5引入了泛型,全部的集合接口和实现都大量地使用它。泛型容许咱们为集合提供一个能够容纳的对象类型,所以,若是你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,由于你将会在编译时获得报错信息。泛型也使得代码整洁,咱们不须要使用显式转换和instanceOf操做符。它也给运行时带来好处,由于不会产生类型检查的字节码指令。 为什么Map接口不继承Collection接口? 尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。所以,Map继承Collection毫无心义,反之亦然。 若是Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,可是它不适合“一组对象”规范。 什么叫对象序列化,什么是反序列化,如何实现对象序列化? 对象序列化,将对象以二进制的形式保存在硬盘上 反序列化;将二进制的文件转化为对象读取 实现serializable接口 对于 IO 流涉及的装饰者设计模式例子以下: //把InputStreamReader装饰成BufferedReader来成为具有缓冲能力的Reader。 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 装饰者模式就是给一个对象增长一些新的功能,并且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例(各类字符流间装饰,各类字节流间装饰)。 对于 IO 流涉及的适配器设计模式例子以下: //把FileInputStream文件字节流适配成InputStreamReader字符流来操做文件字符串。 FileInputStream fileInput = new FileInputStream(file); InputStreamReader inputStreamReader = new InputStreamReader(fileInput); 适配器模式就是将某个类的接口转换成咱们指望的另外一个接口表示,目的是消除因为接口不匹配所形成的类的兼容性问题(字符流与字节流间互相适配)。 (1)单例饿汉模式://饿汉式单例类.在类初始化时,已经自行实例化 2 public class Singleton1 { 3 //私有的默认构造子 4 private Singleton1() {} 5 //已经自行实例化 6 private static final Singleton1 single = new Singleton1(); 7 //静态工厂方法 8 public static Singleton1 getInstance() { 9 return single; 10 } 11 } (2)懒汉模式://懒汉式单例类.在第一次调用的时候实例化 2 public class Singleton2 { 3 //私有的默认构造子 4 private Singleton2() {} 5 //注意,这里没有final 6 private static Singleton2 single=null; 7 //静态工厂方法 8 public synchronized static Singleton2 getInstance() { 9 if (single == null) { 10 single = new Singleton2(); 11 } 12 return single; 13 } 14 } (3)工厂模式: interface IFactory{ public IProduct createProduct();} Class Factory implements IFactory{ public IProduct createProduct(){return new Product();}} Public class client{ Public Static void main (String [] args){IFactory factory=new Factory(); IProduct product=factory.createProduct(); product.ProductMethod();}} 懒汉模式 public class Singleton { private static Singleton instance = null; private Singleton(){} public static synchronized Singleton getInstance(){ //若是尚未被实例化过,就实例化一个,而后返回 if(instance == null){ instance = new Singleton(); } return instance; } } 饿汉模式: public class Singleton { //类加载的时候instance就已经指向了一个实例 private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } } 双重检验锁 public class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ synchronized (Singleton.class){ if(instance == null){ instance = new Singleton(); } } } return instance; } } AOP与IOC的概念(即spring的核心)? a) IOC:Spring是开源框架,使用框架可使咱们减小工做量,提升工做效率而且它是分层结构,即相对应的层处理对应的业务逻辑,减小代码的耦合度。而spring的核心是IOC控制反转和AOP面向切面编程。IOC控制反转主要强调的是程序之间的关系是由容器控制的,容器控制对象,控制了对外部资源的获取。而反转即为,在传统的编程中都是由咱们建立对象获取依赖对象,而在IOC中是容器帮咱们建立对象并注入依赖对象,正是容器帮咱们查找和注入对象,对象是被获取,因此叫反转。 b) AOP:面向切面编程,主要是管理系统层的业务,好比日志,权限,事物等。 进程和线程的区别是什么? 进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程能够有多个线程。线程又叫作轻量级进程。 synchronized关键字的用法,优缺点: 答:java关键字,当它用来修饰一个方法或者代码块的时候,可以保证在同一时刻最多只有一个线程执行该代码段的代码; synchronized修饰的方法或者对象,只能以同步的方式执行,会引发性能问题;没法中断一个正在等候得到锁的线程,也没法经过投票得到锁;一个优先级高的线程等待一个优先级低的线程释放锁会致使优先级倒置,引发性能风险; Lock接口有哪些实现类,使用场景是什么? Lock接口有三个实现类,一个是ReentrantLock,另两个是ReentrantReadWriteLock类中的两个静态内部类ReadLock和WriteLock。 [第18题] 悲观锁、乐观锁的优缺点,CAS有什么缺陷,该如何解决 悲观锁:老是假设最坏的状况,每次去拿数据的时候都认为别人会修改,因此每次拿数据的时候都会上锁,这样别人拿数据的时候就会阻塞知道它拿到锁; synchronized关键字的实现也是悲观锁; 乐观锁:每次去拿数据的时候都认为别人不会修改,因此不会上锁,可是在更新的时候会判断一下再次期间别人有没有更新这个数据。乐观锁适用于多读的应用类型,能够提升吞吐量。 CAS:CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其余线程都失败,失败的线程不会被挂起,而是被告知此次竞争失败,并能够再次尝试; CAS的缺陷:ABA问题、循环时间长开销大,只能保证一个共享变量的原子操做; 简述你所知道的Linux: Linux起源于1991年,1995年流行起来的免费操做系统,目前, Linux是主流的服务器操做系统, 普遍应用于互联网、云计算、智能手机(Android)等领域。因为Java主要用于服务器端的开发,所以Java应用的部署环境有不少为Linux。 Windows操做系统的目录结构,是以盘符为单位,C盘、D盘、E盘等等,数据存储在各个盘符之下,而Linux操做系统最顶层只有一个根目录root,全部文件都存储在这一个根目录之下。 Linux不像Windows的图形操做界面,是经过命令的方式进行操做,经常使用命令有: a . pwd:用于显示当前工做目录; b . ls:用于查看当前工做目录内容; c . cd:用于改变当前工做目录。 Tomcat服务器优化? a) 内存优化:主要是对Tomcat启动参数进行优化,咱们能够在Tomcat启动脚本中修改它的最大内存数等等。 b) 线程数优化:Tomcat的并发链接参数,主要在Tomcat配置文件中server.xml中配置,好比修改最小空闲链接线程数,用于提升系统处理性能等等。 c) 优化缓存:打开压缩功能,修改参数,好比压缩的输出内容大小默认为2KB,能够适当的修改。 tomcat的压缩优化就是将返回的html页面等内容通过压缩,压缩成gzip格式以后,发送给浏览器,浏览器在本地解压缩的过程。 Spring使用了哪些设计模式? (1)工厂模式,在各类BeanFactory以及ApplicationContext建立中都用到了; (2)模板模式,也是在各类BeanFactory以及ApplicationContext建立中都用到了; (3)代理模式,在AOP实现中用到了JDK的动态代理; (4)单例模式,好比建立bean的时候; (5)策略模式,第一个地方,加载资源文件的地方,使用了不一样的方法,好比:classPathResource,FileSystemResource,ServletContextResource,UrlResource但他们都有共同的接口Resource;第二个地方就是AOP的实现中,采用了不一样的方式,JDK动态代理和CGLIB代理; 常见的数据库优化手段? 库表优化,表设计合理化,符合三大范式;添加适当的索引(普通索引、主键索引、惟一索引、全文索引);分库分表;读写分离等;sql语句优化,定位执行效率低,慢sql的语句,经过explain分析低效率的缘由; 索引的优缺点,什么字段上创建索引? 优势: 第一,经过建立惟一索引能够保证数据的惟一性; 第二,能够大大加快数据的检索速度,是主要目的; 第三;在使用分组和排序子句进行数据检索时,能够显著减小查询中分组和排序的时间; 第四,能够在查询中使用优化隐藏器,提升系统的性能; 缺点方面: 第一, 建立索引和维护索引要耗费时间,而且随着数据量的增长而增长; 第二,每个索引须要占用额外的物理空间,须要的磁盘开销更大;第三,当对表中的数据进行增长、删除、修改操做时,索引也要动态维护,下降了数据的维护速度; 通常来讲,在常常须要搜索的列上,强制该列的惟一性和组织表中数据的排列结构的列,在常常用在连接的列上,在常常须要排序的列上,在常用在where字句的列上能够添加索引,以提高查询速度;