Java程序员面试宝典

1.JVM

ClassLoader在JVM运行时加载java核心的API,以满足java程序最基本的需求
包括:
  • ExtClassLoader,用来java的扩展API,即/lib/ext中的类
  • AppClassLoader,用户机器上CLASSPATH设置目录中的类

一些重要的方法:

  1. loadClass: 是 ClassLoader的入口点,接受两个参数,String name,boolean
    resolve,表示类的名字和是否需要解析。
  2. defineClass:接受原始字节组成的数组,并把它转换成Class对象,把字节码解析成运行时数据结构、检验有效性等,标记为final,不能被覆盖。
  3. findSystemClass:从本地文件系统装入文件。
  4. resolveClass: 解析类
  5. findLoadedClass:充当一个缓存,在请求loadClass时,调用该方法来看ClassLoader是否已装入这个类,可以避免重复load
  6. findClass:实现自己的类装载器时,继承ClassLoader类,通过覆盖ClassLoader的findClass(String name)方法,该方法通过类的名字得到一个Class对象。
  7. getSystemClassLoader: 如果覆盖findclass或loadClass,本方法能以实际的ClassLoader对象来访问系统ClassLoader.
  8. forName:静态方法,与loadClass目的一样,用来加载class,但是这个方法默认解释和初始化类,loadClass方法加载时不解释该类。

JVM 加载类时,经过装载、连接、初始化三个过程。

  1. 装载:找到对应的class文件,读入JVM
  2. 连接:1.验证class是否符合规格;2.准备,为类变量分配内存的同时设置默认初始值;3.解释,根据勒种的符号引用查找相应的实体,再把符号引用替换成一个直接引用的过程;
  3. 初始化:class文件初始化

2.编码

  1. JVM中使用Unicode编码,在JVM往OS数据交换时(输入/输出流、Reader、Writer类),进行编码转换。
  2. I/O可以分为面向字符的输入输出流和面向字节的输入输出流,面向字节要保证系统中的文件二进制内容和读入JVM内部的二进制内容一致,不能变换任何0和1的位置,很适合视频或者音频文件等不需要做变换的文件内容。
  3. 例如,Reader和Writer类,隐式地以GBK的编码格式来对文件系统和内存中的Unicode编码来进行转化,如果使用GBK之外的编码方式,需要采用字符和字节转换类适配器:InputStreamReader和OutputStreamWriter

3.类型转化

  • java中,length是数组的属性,length()是自渡船的方法,求长度;
  • 数据类型级别:(byte short char) int long float double
  • 低级直接转换高级:自动类型转换, char向高级类型转换时,会变成ASCLL码
  • 强制类型转换:高级别变量转换成低级别时,或者同一级别(byte short char)转换时,会造成溢出或者精度下降。
  • 包装类过度类型转换:将简单类型转换成一个类,Boolean,Character,Interger,Long,Float,Double.首先声明一个变量,然后生成对应的包装类,就可以利用包装类提供的方法进行转换。
    例如:float f =100.00f; Float F =new Float(f);Double d = F.doubleValue();
  • 字符直接转换,而不是转换成ASCALL码:Character.getNumericValue(char ch);

4.异常

  • try,catch,finally,catch语句可以有多个,finally最多有一个
  • throw关键字用于方法体内部
  • final变量:这个变量一经初始化,便不可以修改。对于基本类型是值不可变,对于对象变量来说是引用不可变,其初始化有两个地方,定义处或者在构造函数中。如果函数的参数设置为final,可以防止在函数内部修改该参数。
  • final方法:不允许任何继承类来覆写这个方法,但是可以继承这个方法,直接使用。
  • final类:不能被继承。

5.java传值

  • 对于基本类型,java传值的副本,副本变了,自己不变。
  • 对于对象型变量,java传引用的副本,即复制指向地址的指针。通过引用副本找到地址并修改地址中的值,可以修改对象。
  • 定义在类里面的静态变量会被赋予一个默认的值
  • 静态方法不能访问类中非静态变量

6.java序列化

  • 序列化能够将一个实现了Serializable接口的对象转化成一组byte,这样日后要用这个对象的时候,就能把这些byte数据恢复出来,并据此重新构建那个对象。
  • 主要用在远程方法调用和JavaBean的Bean状态信息设计和配置工作。
  • 对象序列化不仅能保存对象的副本,并且还会跟着对象中的reference把它所引用的对象也保存起来。

7.垃圾回收

  • java在创建对象时自动分配内存,并当该对象的引用不存在时,释放这块内存。
  • java中提供了System.gc()方法来强力执行垃圾回收,但这个也是不确定的方法。 垃圾回收具有平台依赖。

8.内存管理

  • java内存管理就是对象的分配和释放问题,new关键字申请内存空间,所有对象都在堆中分配空间。
  • 内存泄漏:存在一些被分配的对象,这些对象在有向图中可达,但是程序以后再也不会使用这些对象,这些对象不会被GC(垃圾回收器)回收,但是占用了内存。
    忘记释放先前分配的内存,可能造成内存泄漏。
  • 局部变量不需要显示的设置为null,对这些变量的引用会随着方法的退出而自动消除。对一些对象或者集合,要注意释放对象的引用。
  • 典型的内存泄漏:1.全局集合,解决方法,周期性的运行某种清除任务或者设置反向链接技术,清零时即可从集合中移除。2.缓存,解决方法:设置缓存的阈值,大于阈值就把最久的结果移除,或者使用java.lang.ref.SoftReference类跟踪缓存。3.ClassLoader
  • 发生内存泄漏的一个迹象就是发生了OutOfMemoryError,要使用开销较低的工具来监控内存泄漏,监控GC的活动,确定内存使用量是否随着时间增加,如果是,那么就是发生了内存泄漏。

9.clone

Object中的clone方法是protected的,不能直接调用,可以被子类调用,clone方法会知道对象大小,为它分配足够的内存空间,并将旧对象的内容复制到新的对象中,在clone()执行之前必须检查class是否实现了Cloneable接口

x.clone()!=x; 为true,他们不是同一个对象
x.clone().getClass()==x.getClass()l;为True,说明他们是同一个类型的Class
x.equals(x.clone)为true,说明逻辑上应该相等
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值