多语言展示
当前在线:1640今日阅读:152今日分享:13

JAVA基础面试题

JAVA面试基础面试题
方法/步骤

一:  面向对象的三大特性,如何理解其中的多态?l 面向对象的三个基本特征是:封装、继承、多态。从字面上理解就是多种形态,即对同一个客体,可以有多种不同的形式。在面向对象语言中,接口的多种不同的实现方式即为多态。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。二: 接口与抽象类的区别?l 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。l 抽象类要被子类继承,接口要被类实现。l 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现l 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。l 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。l 抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果l 抽象类里可以没有抽象方法l 如果一个类里有抽象方法,那么这个类只能是抽象类l 抽象方法要被实现,所以不能是静态的,也不能是私有的。l 接口可继承接口,并可多继承接口,但类只能单根继承。 static 方法可以被覆盖吗?为什么?l 静态方法是不能被覆盖的。l 在子类中,可以定义与父类同名的静态方法,不过并不存在“多态”,严格的说,方法间没有多态就不能称作“覆盖”。所以说,子类的静态方法,并没有覆盖父类的方法。String,StringBuffer,StringBuilder 的区别。StringBuffer,StringBuilder底层实现是通过byte数据,外加数组的拷贝来实现的l 1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  Stringl 2.String <(StringBuffer,StringBuilder)的原因l String:字符串常量l StringBuffer:字符创变量l StringBuilder:字符创变量l 3.StringBuilder与 StringBufferl StringBuilder:线程非安全的l StringBuffer:线程安全的l 总结: 1.如果要操作少量的数据用 = Stringl 2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilderl 3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer常见序列化协议及其优缺点1、XML(1)定义:XML(Extensible Markup Language)是一种常用的序列化和反序列化协议, 它历史悠久,从1998年的1.0版本被广泛使用至今。(2)优点· 人机可读性好· 可指定元素或特性的名称(3)缺点· 序列化数据只包含数据本身以及类的结构,不包括类型标识和程序集信息。· 类必须有一个将由 XmlSerializer 序列化的默认构造函数。· 只能序列化公共属性和字段· 不能序列化方法· 文件庞大,文件格式复杂,传输占带宽(4)使用场景· 当做配置文件存储数据· 实时数据转换2、JSON(1)定义:JSON(JavaScript Object Notation,js 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集, JSON采用与编程语言无关的文本格式,但是也使用了类C语言(包括C, C++, C#, Java, javascript, Perl,Python等)的习惯,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。(2)优点· 前后兼容性高· 数据格式比较简单,易于读写· 序列化后数据较小,可扩展性好,兼容性好· 与XML相比,其协议比较简单,解析速度比较快(3)缺点· 数据的描述性比XML差· 不适合性能要求为ms级别的情况· 额外空间开销比较大(4)适用场景(可替代XML)· 跨防火墙访问· 可调式性要求高的情况· 基于Web browser的Ajax请求· 传输数据量相对小,实时性要求相对低(例如秒级别)的服务3、Fastjson(1)定义Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致。(2)优点· 接口简单易用· 目前java语言中最快的json库(3)缺点· 过于注重快,而偏离了“标准”及功能性· 代码质量不高,文档不全(4)适用场景· 协议交互· Web输出· Android客户端创建线程的方式,有什么区别?采用继承Thread类方式:(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。采用实现Runnable接口方式:(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。阻塞、非阻塞、同步、异步区别同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。被依赖的服务是否最终完成无法确定,一次它是一个不可靠的服务序列。阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,函数只有在得到结果之后才会返回。非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。  线程池,说说其理解,线程池的参数问题?几种不同线程池的比较,阻塞队列的使用,拒绝策略原理:线程池流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,,当客户端有一个新请求时,就会唤醒线程池当中的某一个睡眠线程,让他来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态.;为什么用线程池::减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务,也可根据系统的承受能力,调整线程池中工作线程的数目,防止因为消耗过多的内存,而把服务器累趴;参数:corePoolSize:   核心池的大小;默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;maximumPoolSize:  线程池最大线程数,表示在线程中最多能创建多少个线程;keepAliveTime:  表示线程没有任务执行时最多保持多久时间会终止;;unit:   参数keepAliveTime的时间单位;workQueue:   一个阻塞队列,用来存储等待执行的任务,会对线程池的运行过程产生重大影响;threadFactory:  线程工厂,主要用来创建线程handler:   表示当拒绝处理任务时的策略; 不同线程池的比较:一; newCachedThreadPool(1) 缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse,如果没有,就建立一个新的线程加入池中(2)通常用于执行一些生存周期很短的异步型任务,因此一些面向连接的daemon型server中用的不多(3) 能reuse的线程,,必须是timeoutIDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池(4) 放入CachedThreadPool的线程不必担心其结束,超过timeout不活动,会自动被终止;二: newFixedThreadPool(1) newFixedThreadPool和CachedThreadPool差不多,也是能reuse就用,但不能随时建新的线程;(2) 任何时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,知道当前线程中某个线程终止直接被移出池子(3) 没有IDLE机制,多数针对一些很稳定很固定的正规并发线程,多用于服务器(4) 从方法的源代码看,cache池和fixed 池调用的是同一个底层池,只不过参数不同:  fixed池线程数固定,并且是0秒IDLE(无IDLE)  cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE 三:ScheduledThreadPool(1) 调度型线程池(2) 池子里的线程可以按schedule依次delay执行,或周期执行四: SingleThreadExecutor(1) 单例线程,任意时间中只能有一个线程用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE拒绝策略 :handler  Future和ListenableFuture 异步回调相关ListenableFuture     该接口扩展了Future接口,增加了addListener方法,该方法在给定的excutor上注册一个监听器,当计算完成时会马上调用该监听器。不能够确保监听器执行的顺序,但可以在计算完成时确保马上被调用。 Java 四种引用,代表的含义,有什么区别?1. 强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。2. 软引用(SoftReference)如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。3. 弱引用(WeakReference)弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。4. 虚引用(PhantomReference)'虚引用'顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

推荐信息