
Java中级开发工程师知识点归纳.docx
50页Java中级开发工程师知识点归纳Java中级开发工程师知识点归纳标签:JAVA面试技能2021-08-18 17:56 3055人阅读评论(0) 收藏举报分类:面试题(4) JAVA(20)目录(?)[+]一、版本更新说明:2021.03.09--------文章发布2021.03.11--------添加了Java IO机制中的种类和应用场景的解释,添加了Java内存模型的相关知识点2021.03.13--------文章按技术划分,增加J2EE规范的解释2021.04.25--------增加对LRU缓存设计的描述2021.04.26--------增加对比较流行的开源技术和开源框架的介绍,对于这些技术的理解或使用可以增加自己的竞争优势,同时扩展自己的眼界2021.04.27--------增加对数据库事务的描述二、正文(一)Java1.接口和抽象类的区别①抽象类里可以有构造方法,而接口内不能有构造方法②抽象类中可以有普通成员变量,而接口中不能有普通成员变量③抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法④抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只有public 和默认类型。
⑤抽象类中可以包含静态方法,接口内不能包含静态方法⑥抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static类型,并且默认为public static类型⑦一个类可以实现多个接口,但只能继承一个抽象类⑧接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用2.Java虚拟机的运行时数据区有几块?线程私有和线程共享区域有哪些?①程序计数器:线程私有,当前县城执行的字节码的行号指示器②虚拟机栈:线程私有,存放基本数据类型、对象引用和returnAddress类型③本地方法栈:为虚拟机使用到的Native方法服务④Java堆:线程共享,存放对象的实例,也是GC回收器管理的主要区域⑤方法区:线程共享,存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据⑥运行时常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用⑦直接内存:不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,容易引起OOM异常,NIO会调用,不受Java堆大小的限制。
3.HashMap和HashTable区别?①Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现②Hashtable的方法是同步的,而HashMap的方法不是,因此HashTable是线程安全的,但是代码的执行效率上要慢于HashMap③HashMap允许空值和空键,但是HashTable不可以④HashMap非同步实现Map接口,是一个“链表数组”的数据结构,最大承载量是16,可以自动变长,由Entry[]控制(key,value,next),hashCode()判断key是否重复⑤建议需要做同步,使用ConcurrentHashMap,降低了锁的粒度在hashMap的基础上,ConcurrentHashMap 将数据分为多个segment,默认16个(concurrency level),然后每次操作对一个segment加锁,避免多线程锁得几率,提高并发效率这里在并发读取时,除了key对应的value为null之外,并没有使用锁4.ArrayList和LinkedList区别?ArrayList基于数组实现,LinkedList基于链表实现,ArrayList增加和删除比LinkedList慢,但是LinkedList在查找的时需要递归查找,效率比ArrayList慢。
关于多线程方面,如果要求线程安全的,有一个Vector,不过比较多的使用的是CopyOnWriteArrayList替代ArrayList,CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存发生修改时候做copy,新老版本分离,保证读的高性能,适用于以读为主的情况5.Set接口①HashSet是Set接口的典型实现,HashSet按hash算法来存储元素,因此具有很好的存取和查找性能特点:不能保证元素的排列顺序,顺序有可能发生变化;HashSet是异步的;集合元素值可以是null;当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode 值,然后根据该HashCode值来确定该对象在HashSet中存储的位置HashSet还有一个子类LinkedHashSet,其集合也是根据元素hashCode值来决定元素的存储位置,但它同时用链表来维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说,当遍历LinkedHashSet集合元素时,它将会按元素的添加顺序来访问集合里的元素所以LinkedHashSet的性能略低于HashSet,但在迭代访问全部元素时将有很好的性能,因为它以链表来维护内部顺序。
②TreeSet是SortSet接口的唯一实现,TreeSet可以确保集合元素处于排序状态TreeSet不是根据元素插入顺序进行排序的,而是根据元素的值来排序的TreeSet支持两种排序方法:自然排序和定制排序③EnumSet中所有值都必须是指定枚举类型的值,它的元素也是有序的,以枚举值在枚举类的定义顺序来决定集合元素的顺序EnumSet集合不允许加入null元素,否则会抛出NullPointerException异常EnumSet 类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的static方法来创建EnumSet对象│├ArrayList│└Vector│└Stack└SetMap├Hashtable├HashMap└Wea kHashMap!其中的Vector和Stack类现在已经极少使用8.Cookie Session区别具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择.cookie机制.正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie.然而纯粹的客户端脚本如JavaScript或者VBScript 也可以生成cookie.而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的.浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器.cookie的内容主要包括:名字,值,过期时间,路径和域.路径与域一起构成cookie的作用范围.若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失.这种生命期为浏览器会话期的cookie被称为会话cookie.会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的.若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie 仍然有效直到超过设定的过期时间.存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口.而对于保存在内存里的cookie,不同的浏览器有不同的处理方式session机制.session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息.当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存.保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器.一般这个cookie的名字都是类似于SEEESIONID.但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器.经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面.还有一种技术叫做表单隐藏字段.就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器.比如:实际上这种技术可以简单的用对action应用URL重写来代替.9、面向对象和面向过程的区别:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为10、Java内存模型①Java内存模型分为主内存和工作内存两个部分,其中主内存存放变量,工作内存由每个线程创建和管理,保存被该线程使用到的变量的主内存的副本拷贝变量从主内存复制到工作内存,顺序执行read和load 操作,变量从工作内存同步到主内存的时候,顺序执行store和write操作对于volatile变量在各个线程的一致性:在各个线程的工作内存中,volatile存在不一致的情况,但在每次使用前都会刷新,执行引擎看不到不一致的情况,因此可以认为不存在一致性问题②原子性、可见性和有序性③先行发生原则11、Java垃圾回收机制Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间System.gc();Runtime.getRuntime().gc();上面的方法调用时用于显式通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的,这和抢占式的线程在发生作用时的原理一样。
12、类加载器,类加载时机类初始化的时机,有且仅有四个:A、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候B、使用 IO和NIO区别①NIO操作直接缓存区,直接与OS交互,Selector IO复用机制IO NIO面向流面向缓冲阻塞IO 非阻塞IO无选。
