1.哪些情况下的对象会被垃圾回收机制处理掉?
答: 引用计数法
可达性分析算法
方法区:存储已被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后的代码等数据。
堆:存放对象实例。
虚拟机栈(或称java虚拟机栈):线程私有的,用来存放栈帧,而栈帧里面是用来存储局部变量表,操作数栈,动态链接,方法返回地址等信息。
本地方法栈:线程私有,本地方法栈和java虚拟机栈非常类似,他们之间唯一的差别就是java虚拟机栈是为了java程序中的方法也就是字节码的方法服务的,而本地方法栈是给Native方法服务的。
程序计数器:线程私有的,如果线程正在执行一个java方法,那么这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法(本地方法)那么这个计数器值为空。
哪些情况下的对象会被垃圾回收机制处理掉?
通过上面的分析,有两种情况:
1.根据java的四种对象引用方式,如果符合回收条件就会被垃圾回收机制处理掉。
2.如果对象实例没有被其他任何对象引用的情况下会被垃圾回收机制处理掉。
2.讲一下常见编码方式?
ASCII码:共有128个,用一个字节的低7位表示
ISO8859-1:在ASCII码的基础上涵盖了大多数西欧语言字符,仍然是单字节编码,它总共能表示256个字符
GB2312:全称为《信息交换用汉字编码字符集基本集》,它是双字节编码,总的编码范围是A1~F7 A1~A9 ·符号区 B0~F7 汉字区
GBK:数字交换用汉字编码字符集》,它可能是单字节、双字节或者四字节编码,与GB2312编码兼容
UTF-16:具体定义了Unicode字符在计算机中的存取方法。采用2字节来表示Unicode转化格式,它是定长的表示方法,不论什么字符都可以用两个字节表示
UTF-8: UTF-8采用一种变长技术,每个编码区域有不同的字码长度,不同的字符可以由16个字节组成。如果一个字节,最高位为0,表示这是一个ASCII字符(007F)如果一个字节,以11开头,连续的1的个数暗示这个字符的字节数
在UTF-8编码中:一个中文等于三个字节,中文标点占三个字节。
一个英文字符等于一个字节,英文标点占一个字节。
3.修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?
会调用对象对象的equals方法。
“==”如果是基本类型的话就是看他们的数据值是否相等就可以。
如果是引用类型的话,比较的是栈内存局部变量表中指向堆内存中的指针的值是否相等
“equals”如果对象的equals方法没有重写的话,equals方法和“==”是同一种。
hashcod是返回对象实例内存地址的hash映射。
理论上所有对象的hash映射都是不相同的。
4.如何将一个Java对象序列化到文件里?
对象需要实现Seralizable接口
通过ObjectOutputStream的writeObject()方法写入
和ObjectInputStream的readObject()方法来进行读取
5.说一下泛型原理,并举例说明
Java泛型的实现方法:类型擦除
Java的泛型是伪泛型。在编译期间,所有的泛型信息都会被擦除掉。
类型擦除(type erasure):
Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。
如在代码中定义的List<object>和List<String>等类型,在编译后都会编程List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与C++模版机制实现方式之间的重要区别