主页:写程序的小王叔叔的博客欢迎来访👀
支持:点赞收藏关注
社区:JAVA全栈进阶学习社区欢迎加入
目录
2.Java虚拟机的运行时数据区有几块?线程私有和线程共享区域有哪些?
6.Java中Collection和Collections的区别
22、try/catch/finally/return 作用顺序
一、版本更新说明:
2015.03.09--------文章发布
2015.03.11--------添加了Java IO机制中的种类和应用场景的解释,添加了Java内存模型的相关知识点
2015.03.13--------文章按技术划分,增加J2EE规范的解释
2015.04.25--------增加对LRU缓存设计的描述
2015.04.26--------增加对比较流行的开源技术和开源框架的介绍,对于这些技术的理解或使用可以增加自己的竞争优势,同时扩展自己的眼界
2015.04.27--------增加对数据库事务的描述
二、正文
(一)Java
1.接口和抽象类的区别
①抽象类里可以有构造方法,而接口内不能有构造方法。
②抽象类中可以有普通成员变量,而接口中不能有普通成员变量。
③抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。
④抽象类中的抽象方法的访问类型可以是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对象。
④总结:A、HashSet的性能比Treeset好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序,只有当需要一个保持排序的Set时,才会用TreeSet。B、EnumSet是性能最好的,但它只能保存枚举值。
C、它们都是线程不安全的。
注:Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
关于HashSet,条目数和容量之和来讲,迭代是线性的。因此,如果迭代性能很重要,那就应该慎重选择一个适当的初始容量。容量选得太大,既浪费空间,也浪费时间。默认的初试容量是101,一般来讲,它比你所需要的要多。可以使用int构造函数来指定初始容量。要分配HashSet的初始容量为17:
Set s=new HashSet(17);
HashSet另有一个称作装载因数(load factor)的"调整参数(tuning parameter)"。
区别: 1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key。 2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能. 3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可. a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的. b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象 才可以真正定位到键值对应的Entry. c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value 4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的. a. Comparator可以在创建TreeMap时指定 b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了. |
6.Java中Collection和Collections的区别
①java.util.Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法。java.util.Collections 是一个包装类。
②它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
7.Java容器
JAVA的容器---List,Map,Set
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
!其中的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、使用java.lang.reflect进行反射调用的时候。
C、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类。
D、当虚拟机启动的时候,需要初始化main函数所在的类。
13、 Java IO和NIO区别
①NIO操作直接缓存区,直接与OS交互,Selector IO复用机制。
IO NIO
面向流 面向缓冲
阻塞IO 非阻塞