java基础面试题系列(2)

前言
  所有的总结都是为了复习,当然,也是作为了一种知识点的积累和回顾。

  1. 生成实例的对象的4种方法
    1、关键字 new。工厂模式是对这种方式的包装;
    2、类实现克隆接口,克隆一个实例。原型模式是一个应用实例;
    3、用该类的加载器,newinstance。java的反射,反射使用实例:Spring的依赖注入、切面编程中动态代理;反射机制:得到一个对象所属的类;获得一个类所有成员变量好方法;在运行时创建对象;在运行时调用对象的方法。 4、sun.misc.Unsafe类,allocateInstance方法创建一个实例。(Java官方也不建议直接使用的Unsafe类,据说Oracle正在计划从Java 9中去掉Unsafe类)
    5、实现序列化接口的类,通过IO流反序列化读取一个类,获得实例。
  2. linux解压缩tar后的-zxvf中的zxvf分别代表的是什么意思?
    z:通过gzip支持压缩或解压缩。还有其他的压缩或解压缩方式,比如j表示bzip2的方式。
    x:解压缩。
    c是压缩。
    v:在压缩或解压缩过程中显示正在处理的文件名
    f:f后面必须跟上要处理的文件名。也就是说你不能写成这样 tar -zxfv zhcon-0.2.5.tar.gz
  3. c语言方面的面试题,可能会被问到,最好做下准备!
    • 虚函数
      • c++中虚函数是怎么实现的?
    • 构造函数
      • 构造函数可以是虚函数吗?
    • 析构函数
      • 在c++语言中,调用了析构函数,对象一定会被销毁。
      • 为什么鼓励将析构函数设计成虚函数?
    • 拷贝构造函数
    • c++的内存管理
  1. 深复制,浅复制的说明

    • 深复制:复制引用的对象(两种方式)
      * 通过clone()  
      * 序列化  
      
    • 浅复制
  2. 一套完整的测试应该由哪些阶段组成?

    1. 测试计划
        首先,根据用户需求报告中关于功能要求和性能指标的规格说明书,定义相应的测试需求报告,即制订黑盒测试的最高标准,以后所有的测试工作都将围绕着测试需求来进行,符合测试需求的应用程序即是合格的,反之即是不合格的;同时,还要适当选择测试内容,合理安排测试人员、测试时间及测试资源等。

    2. 测试设计
        将测试计划阶段制订的测试需求分解、细化为若干个可执行的测试过程,并为每个测试过程选择适当的测试用例(测试用例选择的好坏将直接影响到测试结果的有效性)。

    3. 测试开发
        建立可重复使用的自动测试过程。

    4. 测试执行
        执行测试开发阶段建立的自动测试过程,并对所发现的缺陷进行跟踪管理。测试执行一般由单元测试、组合测试、集成测试、系统联调及回归测试等步骤组成,测试人员应本着科学负责的态度,一步一个脚印地进行测试。

    5. 测试评估
        结合量化的测试覆盖域及缺陷跟踪报告,对于应用软件的质量和开发团队的工作进度及工作效率进行综合评价。

  3. java代码块初始化顺序
    父静态变量、父静态代码块、子静态变量,子静态代码块、父非静态变量、父类非静态代码块、父类构造函数,子类非静态变量、子类非静态变量、子类非静态代码块、子类构造函数。

  4. 面向对象的特征:抽象、多态、封装、继承
  5. this super的区别
    1. this:能区分成员变量和方法的形参,尤其是方法的形参和成员变量同名的时候,由this才能访问到成员变量。
    2. super能访问父类的方法和成员变量。
    
  6. static关键字的作用?
    1. 为某特定的数据类型或对象分配单一的存储空间,而不与创建对象个数无关。  
    2. 在不创建对象的情况下,可以通过类来直接调用方法或使用类的属性。  
    3. 只有使用4个地方:成员变量,成员方法,内部类,代码块!  
    4. 切记不能再成员函数内部定义static变量。  
    
  7. switch,可用的参数是能隐式转换成int类型的数才行,也即“整形,字符串类型”,总结就有:short/byte/char/int/String(java 7之后支持)
  8. volatile有什么作用?
    1. volatile是一个类型修饰符(type specifier) ,是被设计用来修饰被不同线程访问和修改的变量。  
    2. 被volatile类型定义的变量,系统每次用到它是,都是直接从对应的内存当中提取,而不会利用缓存。  
    3. 在使用了volatile修饰成员变量后,所有线程在任何时候说看到的变量的值都是相同的。  
    4. volatile不能保证操作的原子性,因此一般情况下,不能代替synchronized。  
    
  9. instancof 是java语言的一个二元运算符
    • 作用:用来判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例。
  10. stictfp:strict float point,确保浮点数运算的准确性。
  11. java基本数据类型(8个):byte,short,char,int,float,double,long,boolean.
  12. java的null值是什么?
    • null不是一个合法的object实例,所以编译器并没有为其分配内存,仅仅用于表明该引用目前没有指向任何对象。
  13. 理解赋值语句 String s = null ?
    • 表示未申请任何内存资源,即些语句表示声明了一个引用变量并初始化引用,但是该引用没有指向任何对象.但可以把它作为参数传递或其它使用,但是不能调用它作为对象的方法
    • (扩展):
      • String s ;该语句表示只是声明了一个引用变量,但是并没有初始化引用,所以对变量s的任何操作(除了初始化赋值外) 都将引发异常.
      • String s=””; 表示申请了内存资源,但资源空间值为空。该语句表示声明并引用到一个对象,只不过这个对象为0个字节.所以既然有了对象,就可以调用对象的方法
        注意:”” 也是字符串
  14. java语言,变量被分为两大类型:原始值(primitive)和引用值(reference)
  15. Integer和int 的区别?
    1. java语言中,变量分成两大类型,原始类型,和引用类型,int是java提供的原值数据类型,而Integer是java为int提供的封装类。  
    2. java为所有的原始数据类型提供了封装类。
    
  16. 不可变类:指当创建和这个类的实例之后,就不允许修改它的值了。
    1. 所有基本类型的包装类(封装类)都是不可变类。  
    2. 不可变类中所有成员变量用private修饰  
    3. 类中没有修改和写成员变量的方法,比如setXXX,只有构造方法,一次生成,不在改变  
    4. 确保类中的所有方法不会被子类覆盖,要将类定义为final或类中方法定义为final  
    
  17. 原始数据类型的在传递参数是都是按值传递,包装类型在传递参数时是按引用传递。
  18. char型变量中能否可以存储一个中文汉字?可以
  19. “==”,“equals()”,hashcode()区别?
    1. 对于基本数据类型,使用“==”,可以直接比较对应值是否相等;对于引用类型,则是比较引用。  
    2. 不覆盖写equals,结果是和“==”一样比较引用。String类中的equal是比较两个值是否相同。  
    3. equals()是Object类提供的方法之一;hashcode()方法时从Object类继承来的。  
    4. hashcode()使用用来鉴定两个对象是否相等。  
    5. equals()和hashcode()虽然都是比较对象是否相同,但是有区别。  
    
    • equals()是给用户调用的,要比较对象是否相同,必须覆盖重写。
    • hashcode()用户一般不会去调用他,比如在hashmap中。由于key是不可以重复的(equals()和hashcode()一个不等就可以了),它在判断key是否重复时就是判断了hashcode(),而且也用到了equals()方法。并且两个返回值不一样,hashcode是int类型,equal是boolean类型。
    • 一般覆盖重写equals()方法同时也是覆盖hashcode()
  20. finally的return?
    1. finally的代码在return前执行,  
    2. 如果try-finally和catch-finaly中都有return,那么finally块中的return语句将会覆盖别处的return语句  
    3. 最终返回到调用者那里的是finally中的return语句。  
    
  21. 字节流和字符流的主要区别?
    1. 字节流不会用到缓存,字符流用到了缓存。  
    2. 字节流以字节(8bit)为单位,包含两个抽象类:InputStrea,OutputStream  
    3. 字符流以字符(16bit)为单位,包含两个抽象类:Reader,Writer  
    
  22. 数据库常用端口号
    |数据库|MySql|Oracle|SqlServer|MongoDB|
    |—–:|:—-:|:—–:|:——:|:——-|
    | 端口号| 3306 | 1521 | 1433 | 27017 |

  23. 什么是序列化?

    * 序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。  
    * 序列化可以将对象的状态写在流里进行网络传输,或者保存到文件,数据库等系统里,并在需要的时候把该流读取出来重新构造一个相同的对象。(反序列化)  
    * 序列化可以实现深复制,即可以复制引用的对象。  
    
  24. JVM加载class文件的原理机制是什么?

    1. 类加载主要分成三步:
      • 装载
      • 链接
        1. 检查
        2. 准备
        3. 解析
      • 初始化
    2. 加载是有类加载器,具体是由ClassLoader和它的子类来实现;类加载器本身也是一个类,其实质就是把类文件从硬盘读取到内存中。
    3. 类加载方式分为显式和隐式加载:
      * 隐式加载:程序使用new等方式创建对象,会隐式地调用类的加载器把对应的类加载到jvm中。
      * 显式加载指的是通过直接调用class.forName()方法把所需的类加载到jvm中。
      
    4. java中的类分成3种:系统类、扩展类、和自定义类。对应不同类的加载有3种不同的类加载器:

      * Bootstrap Loader -负责加载系统类(jre/lib/rt.jar的类)
      
          *         |
      
              * --ExtClassLoader -负责加载扩展类(jar/lib/ext/*.jar)
      
                  *        |
      
                      * --AppClassLoader -负责加载应用类(classpath指定的目录或jar中的类)
      * Bootstrap Loader 是C++语言实现的,java语言中是看不见的。
      
  25. 什么是GC?
    1. 垃圾回收(garbager collection ,GC)主要完成3项任务
      • 分配内存
      • 确保被引用对象的内存不被错误的回收
      • 回收不再被引用的对象的内存空间!
    2. 垃圾回收算法
      • 引用计数算法(jvm不用,因为不能解决相互引用的问题)
      • 追踪回收算法
      • 压缩回收
      • 复制回收
      • 按代回收
    3. system.gc()的相关
      1. 开发人员是不能实时地调用垃圾回收期对某个对象或所有对象进行垃圾回收。,但是开发人员却可以通过调用System.gc()的方法去“通知”垃圾回收器运行,当然,jvm也并不能会保证垃圾回收器马上就会运行。  
      2. System.gc()方法执行会停止所有响应,去检查内存中是否有可以回收的对象,这会对程序的正常运行以及性能造成极大的威胁,因此实际编程时,不推荐频繁使用这一方法。  
      
  26. 内存泄露?
    1. 内存泄露是指的一个不再被程序使用的对象或变量还在内存中占有存储空间(java中主要指的就是这种情况)。  
    2. 引起内存泄露的原因:  
        1. 静态集合类。比如hashmap和vector容器是静态的,生命周期是和程序一致,容器中的对象在程序结束之前将不能被释放,从而造成了内存泄露。  
        2. 各种连接  
        3. 监听器  
        4. 变量不合理的作用域  
        5. 单例模式可能会造成内存泄露  
    
  27. java中栈和堆的区别?
    1. java语言中的堆和栈都是内存中存放数据的地方。
    2. 变量分为基本数据类型和引用类型
      • 基本数据类型和以及对象的引用变量,内存分配在栈上。
      • 引用类型的变量,内存是分配在堆上或常量池中,需要通过new等方式创建。
    3. 堆内存是用来存放运行时创建的对象,一般来说,通过new关键字创建出来的对象都是存放在堆内存上
    4. jvm是基于堆栈的虚拟机,每个java程序运行在一个单独的jvm实例上,每一个实例唯一对应一个堆,一个java程序内的多个线程也运行在同一个jvm实例上,因此这些线程会共享堆内存
    5. 栈和堆的功能以及作用来比较:堆主要存放对象,栈主要用来执行程序
      • 栈的存取速度快,但是栈的大小和生存期必须确定,缺乏一定的灵活性
      • 堆可以在运行时动态分配内存,生存期不用提前告诉编译器,也导致了存取速度比较缓慢。