微信号:mjx_java

介绍:主要是讲解编程语言java,并且每天都推送一条关于java编程语言的信息

java面试小题系列(一)

2018-06-13 21:04 java一日一条
  1. 基本类型有哪些?String 是最基本的数据类型吗?什么是自动拆装箱?为什么要自动拆装箱呢?

    答:不是。

    基本数据类型: 

    整数值型:byte,short,int,long, 

    字符型:char 

    浮点类型:float,double 

    布尔型:boolean 

    整数默认int型,小数默认是double型。Float和long类型的必须加后缀。

  2. 除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。

    String是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。引用类型包括类、接口、数组等。String类还是final修饰的。

    而包装类就属于引用类型,自动装箱和拆箱就是基本类型和引用类型之间的转换,至于为什么要转换,因为基本类型转换为引用类型后,就可以new对象,从而调用包装类中封装好的方法进行基本类型之间的转换或者toString(当然用类名直接调用也可以,便于一眼看出该方法是静态的),还有就是如果集合中想存放基本类型,泛型的限定类型只能是对应的包装类型。

  3. 什么是值传递和引用传递?

    值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量. 

    引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 

    一般认为,java内的传递都是值传递. java中实例对象的传递是引用传递 。

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。

  4. 描述一下JVM加载class文件的原理机制?

    JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。 

    由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。 

    类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。      从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:


    Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);

    Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;

    System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

  5. 与垃圾回收相关的JVM参数:

    -Xms / -Xmx — 堆的初始大小 / 堆的最大大小

    -Xmn — 堆中年轻代的大小

    -XX:-DisableExplicitGC — 让System.gc()不产生任何作用

    -XX:+PrintGCDetails — 打印GC的细节

    -XX:+PrintGCDateStamps — 打印GC操作的时间戳

    -XX:NewSize / XX:MaxNewSize — 设置新生代大小/新生代最大大小

    -XX:NewRatio — 可以设置老生代和新生代的比例

    -XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布

    -XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大


 
java一日一条 更多文章 redis的持久化方式RDB和AOF的区别 年薪50万+,缺口150万!大数据人才将在未来遭到企业疯抢! 程序员如何在百忙之中不走岔路,不白忙! Hadoop HBase存储原理结构学习 小白到大神,只因为我在地铁上读这些
猜您喜欢 第九十四讲 模板模板参数 使用CodeTyphon实现库文件跨越Android和iOS平台 PHP7 的抽象语法树(AST)带来的变化 关于Java线程池,读完这一篇文章就够了 关于 FilmMentor 这款小众产品的想法