java基础知识(三)

  • jvm中的四种引用与使用场景?

答:(1)强引用:如果一个对象具有强引用,那么垃圾回收器绝对不会回收它。当内存不足,java虚拟机宁愿抛出OutOfMemeroyError错误,使程序异常终止,也不会靠随意回收具有强引用对象来解决内存不足的问题,ps:强引用也就我们平常使用的A a = new A();(2)软引用:如果一个对象只具有软引用,那么当内存不足时,垃圾回收器就会回收它,当内存空间足够时,垃圾回收器不会回收它。只要垃圾回收器没有回收它,它就可以被程序使用。软引用用来实现内存敏感的高速缓存问题。(3)弱引用:弱引用和软引用的区别在于:只具有弱引用的对象具有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的工程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。(4)虚引用:虚引用并不会决定对象的生命周期,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都有可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。后三个主要区别在于:虚引用必须和引用队列联合使用。若一个对象具有多个引用,如何判断它的可达性?(1)单条引用链的可达性以最弱的一个引用类型决定;(2)多条引用链的可达性以最强的一个引用类型决定。

 

  • 对象创建的方法,对象的内存布局,对象的访问定位?

答:(1)用new语句创建对象,这是常用的创建对象的方法。(2)调用对象的clone()方法。(3)运用反射手段,使用Class.forName()。例如:MyObject object = (MyObject)Class.forName("subin.ran.MyObject").newInstance()。(4)运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。

  • GC收集器有哪些?

答:serial收集器、parallel收集器、CMS收集器、G1收集器。

  • 如何减少GC出现的频数?

答:(1)对象不用时最好显示置为null。(2)尽量少用System.gc()。(3)尽量少用静态变量。(4)尽量使用StringBuffer,不用String来累加字符串。(5)分散对象的创建或删除时间。(6)尽量少用finalize函数,因为它会加大GC的工作量,因此尽量少用finalize方式回收资源。(7)如果需要使用经常用到的图片,可以使用软引用类型,它尽可能的将图片保存在内存中,供程序调用,而不引起OutOfMemory。(8)能用基本类型如int,long,就不用Integer,Long对象。(9)增加-Xmx值。

  • Collection和Collections的区别?

答:Collection是集合类的上级接口,子接口主要有List和Set。Collections是针对集合类的一个辅助类,提供了操作集合的工具方法,一系列静态方法对各种集合的搜索、排序、线程安全化等操作。

  • String、StringBuffer、StringBuilder的区别?

答:(1)String对象不可变的,StringBuffer、StringBuilder对象是可变的。因为在每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象,这样就导致内存中没有引用的对象变多,JVM的GC就会频繁工作,性能降低。修改String对象的原理:首先创建一个StringBuffer对象,然后调用append()方法,最后调用toString()方法

 (2)String和StringBuffer是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线性安全的。(3)StringBuffer和StringBuilder只能用构造函数来进行初始化,而String既可以用构造函数来初始化,也可以直接赋值。

  • JAVA面向对象的三个特征和含义?

答:封装属性的封装和方法的封装。把属性定义为私有的,get(),set()方法。好处是信息隐藏和模块化,提高安全性,封装的主要作用在于对外隐藏内部实现细节,增强程序的安全性。继承:子类可以继承父类的成员变量和成员方法,继承可以提高代码的复用性。多态:当同一个操作作用在不同对象时,会产生不同的结果。

  • java多态的实现原理?

答:有两种方式来实现多态,一种是编译时多态,一种是运行时多态,编译时多态是通过方法重载来实现的,运行时多态是通过方法重写/覆盖来实现的。特别注意:只有类中的方法才有多态的概念,类中成员变量没有多态的概念。

  • 为何数组的长度是2的n次方?

答:(1)它通过h&(table.length-1)来得到对象的保存位,HashMap底层数组的长度总是2的n次方,2n-1得到的二进制每个位上的数都是1,那么与一个全为1的数进行与操作,速度会大大提升。(2)h&(length-1)相当于对length取模,也就是h%length,但是&比%效率更高。(3)不同的key算得的index概率相对比较小。

  • 静态内部类和非静态内部类主要的不同?

答:(1)静态内部类不依赖外部类实例而被实例化,而非静态内部类需要在外部类实例化后才可以被实例化。(2)静态内部类不需要持有外部类的引用,但非静态内部类需要持有外部类的引用。(3)静态内部类不能访问外部类非静态变量和非静态方法,它只能访问外部类的静态方法和静态变量,非静态内部类能访问外部类的静态和非静态变量和方法。

  • 创建一个虚引用,构造方法传来一个ReferenceQueue,作用是什么?

答:虚引用必须和一个引用队列相关联,当垃圾回收器准备回收一个对象时,如果发现他还有虚引用,就会把这个虚引用加入到一个与之关联的引用队列中。程序可以判定引用队列中是否加入了虚引用,来了解引用队列是否将要被垃圾回收器回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

  • DOM和SAX的不同?

答:(1)DOM是基于内存的,不管文件有多大,都会把XML文件读到内存,从而消耗很大的内存。而SAX解析XML文件采用的事件驱动方式,当某个事件触发时,获取相应的XML的部分数据读到内存进行解析,只占用少部分内存。(2)DOM可以读取XML,也可以向XML文件中插入数据,而SAX只能读取XML文件。(3)DOM可以指定要访问的元素进行随机访问,而SAX不行。

  • 描述一下JVM加载class文件的原理?

答:JVM中类的装载是由类加载器和它的子类完成的,java中的类加载器是一个重要的java运行时系统组件。它负责在运行时查找和装入类文件中的类。由于java的跨平台性,经过编译的java源程序并不是一个可执行程序,而是一个或者多个类文件。当java程序需要使用某个类时,JVM会确保这个类已经被加载,连接,初始化。类加载是指把类的.class文件读入到内存中,通常是创建一个字节数组来读取.class文件,然后产生于所加载类对应的class对象。加载完成后,class对象还不完整,所以此时的类还不能用。当类被加载完后就进入了连接阶段,这一阶段包括验证、准备、解析三个步骤。最后JVM对类进行初始化,包括(1)如果类存在直接父类并且这个类还没有初始化,那么就先初始化父类。(2)如果类中存在初始化语句,就依次执行这些初始化语句。类的加载是由类加载器完成的,从java 2 开始,类加载采用父类委托机制(PDM),PDM能更好的保证了java平台的安全性,在该机制中,JVM自带的Boostrap是根加载器,其他的加载器有且仅有一个父类加载器,类的加载器首先请求父类加载器加载,如果父类加载器无能为力时才由子类加载器自动加载,java不会向java程序提供Boostrap的引用。

  • 简述synchronized和java.util.concurrent.lock.Lock的异同?

答:Lock是java 5 引入的新的API,和关键字synchronized相比主要相同点:Lock能完成synchronized所实现的所有功能;主要不同点:Lock有比synchronized更精准的线程语义和更好的性能,而且不强制性的要求一定要获取锁。synchronized会自动释放锁,而Lock要程序员手动释放锁,并且最好是在finally中释放。

  • 实现会话跟踪的技术有哪些?

答:(1)URL重写:在URL添加用户会话信息作为请求的参数,或者将唯一的会话ID添加到URL结尾以表示一个会话。(2)设置表单隐藏域:将和会话跟踪相关的信息添加到隐式表单域中,这些信息不会在浏览器中显示但是提交表单会提交给服务器。(这两种方式很难跨越多个页面的信息传递,因为如果每次都修改URL或在页面中添加隐式表单域来存储用户会话相关信息,事情将变得很麻烦)。(3)cookie:cookie有两种,一种基于窗口的,浏览器窗口关闭后,cookie就没了;另一种是将信息存储在临时文件中,并设置存在的时间。当用户通过浏览器和服务器建立一次会话后,会话ID就会随响应信息返回存储在基于窗口的cookie中,那就意味着只要浏览器没有关闭,会话没有超时,下一次请求时这个会话ID又会提交给服务器让服务器识别身份。会话中可以为用户保存信息。会话对象是在服务器内存中的,而基于窗口的cookie是在客户端内存中的。如果浏览器禁止了cookie,那么就要通过下面两种方式进行会话跟踪。当然在使用cookie时要主要几点:首先不要在cookie中存放敏感信息,其次cookie存放的数量级有限,不能将过多的信息存放到cookie中,再者浏览器运行一个站点最多存放20个cookie,当然,和用户有关的信息也是可以存放到cookie中方便跟踪。(4)HttpSession:在所有会话技术跟踪中,HttpSesion对象是最强大也是功能最多的,当一个用户第一次访问某个网站时会创建HttpSession,每个用户可以访问它自己的HttpSession。可以通过HttpServletRequest对象的getSession方法获得HttpSession,通过HttpSession的setAttribute方法可以将一个值放到HttpSession中,通过调用HttpSession对象的getAttribute方法,同时传入属性名就可以获取到HttpSession中的对象。

  • 解释SOAP、WSDL、UDDI?

答:SOAP:简单对象访问协议,是WEB Service中交换数据的一种协议规范。WSDL:web服务描述语言,它描述了web服务的公共接口。这是一个基于XML的关于如何与web服务通讯和使用的服务描述,也就是描述与目录中列出的web服务进行交互时需要绑定的协议和信息格式。UDDI:统一描述、发现和集成,它是一个基于xml的跨平台的描述规范,可以使世界范围内的企业在互联网上发布自己所提供的服务。

posted on 2018-05-14 16:45  枫叶芦客  阅读(193)  评论(0编辑  收藏  举报

导航