首页 / JAVA / 2019最新java面试大全
2019最新java面试大全
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了2019最新java面试大全,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含15713字,纯文字阅读大概需要23分钟。
内容图文
Hibernate的特点:强大、方便、高效、复杂、绕弯子、全自动 1. 对象/关系数据库映射,完全的向对象思想。开发速度快。 2. Sql移植性好。具有自己的日志统计。 3. 缓存机制,提供一级缓存和二级缓存。 4. 功能和特性非常多,不适合多表关联查询。 5. 事物transaction ,没有侵入性,即所谓的轻量级框架。 6. 透明持久化,具有业务功能的单线程对象。 7. 简洁的 HQL编程。 Mybatis的特点:小巧、方便、高效、简单、直接、半自动 1.Sql更加细致,手写sql语句,减少查询字段,有利于sql优化。 2.Mybatis简单,更容易掌握。 hibernate调优方案: 1、制定合理的缓存策略 2、尽量使用延迟加载特性 3、采用合理的session管理机制 4、使用批量抓取设定合理的批处理参数 5、进行合理的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 开始,我们可以在 switchcase 中使用字符串,但这仅仅是一个语法糖。内部实现在 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 publicclass Singleton1 { 3 //私有的默认构造子 4 private Singleton1() {} 5 //已经自行实例化 6 privatestaticfinal Singleton1 single = new Singleton1(); 7 //静态工厂方法 8 publicstatic Singleton1 getInstance() { 9 return single; 10 } 11 } (2)懒汉模式://懒汉式单例类.在第一次调用的时候实例化 2 publicclass Singleton2 { 3 //私有的默认构造子 4 private Singleton2() {} 5 //注意,这里没有final 6 privatestatic Singleton2 single=null; 7 //静态工厂方法 8 publicsynchronizedstatic 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(){returnnew Product();}} Public class client{ Public Static void main (String [] args){IFactory factory=new Factory(); IProduct product=factory.createProduct(); product.ProductMethod();}} 懒汉模式 publicclass Singleton { privatestatic Singleton instance = null; private Singleton(){} publicstaticsynchronized Singleton getInstance(){ //如果还没有被实例化过,就实例化一个,然后返回if(instance == null){ instance = new Singleton(); } return instance; } } 饿汉模式: publicclass Singleton { //类加载的时候instance就已经指向了一个实例privatestatic Singleton instance = new Singleton(); private Singleton(){} publicstatic Singleton getInstance(){ return instance; } } 双重检验锁 publicclass Singleton { privatestatic Singleton instance = null; private Singleton(){} publicstatic 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字句的列上可以添加索引,以提升查询速度;
原文:https://www.cnblogs.com/alh666888/p/10736129.html
内容总结
以上是互联网集市为您收集整理的2019最新java面试大全全部内容,希望文章能够帮你解决2019最新java面试大全所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。