1. 什么是gitbook
GitBook 可帮助您为用户发布精美的文档,并集中团队的知识以进行高级协作。
参考https://docs.gitbook.com/
2. 异常处理中return位置的放置对返回值的影响
在try-catch-finally
中return可以放到try
中,可以放到catch
中,可以放到finally
中。
总结:当return放到try
或catch
中会被finally
影响,只要finally
中没有return
则正常返回,否则以finally
为主。
3. 什么是BitMap
Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。(PS:划重点 节省存储空间)
假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统,4G内存
在Java中,int占4字节,1字节=8位(1 byte = 8 bit)
如果每个数字用int存储,那就是20亿个int,因而占用的空间约为 (2000000000*4/1024/1024/1024)≈7.45G
如果按位存储就不一样了,20亿个数就是20亿位,占用空间约为 (2000000000/8/1024/1024/1024)≈0.233G
高下立判,无需多言
详情参考https://www.cnblogs.com/cjsblog/p/11613708.html
优缺点
优点:
- 运算效率高,不需要进行比较和移位
- 占用内存少
缺点:
- 所有的数据不能重复
- 只有当数据比较密集时才有优势
4. Java中运行时多态和编译时多态
方法重载都是编译时多态。根据实际参数的数据类型、个数和次序,Java在编译时能够确定执行重载方法中的哪一个。
方法重写表现出两种多态性,当对象引用本类实例时,为编译时多态,否则为运行时多态。
5. Java中什么是向上转型什么是向下转型
向上转型:主要体现在多态(父类的引用指向子类的对象),特点是此对象只能调用父类中有的方法,如果子类重写了就按子类的来。
向下转型:指向父类引用的子类对象被强制转换为子类的引用,可以用子类中特有的方法。
总结
- 父类引用可以指向子类的对象,子类的引用不能指向父类的对象。
- 向上转型就是父类的引用指向子类的对象(子类的对象赋值给父类的引用),向上转型不用强制转换,向下转型是指向父类引用的子类对象被强制转换为子类的引用,向下转型要强制类型转换。
- 向上转型不能调用子类所特有的方法,向上转型调用父类中的方法具体运行的是子类重写过后的方法。
6. 包装类中的一些细节(基本数据类型 == 包装类对象涉及到自动封箱还是自动拆箱)
public static void main(String[] arg) {
int a = 10;
int b = 10;
Integer A = 10;
Integer B = 10;
Integer B1 = Integer.valueOf(10);
Integer C = new Integer(10);
Integer D = new Integer(10);
Integer E = 128;
Integer F = 128;
System.out.println(a == b);//t 基本数据类型在栈中指向同一个值
// 以下两种方式取常量池中的范围是(-128 - 127)
System.out.println(A == B);//t 包装类型通过此种方式创建对象会去常量池中寻找
System.out.println(A == B1);//t 包装类型通过此种方式创建对象会去常量池中寻找
System.out.println(C == D);//f 通过 == 去判断是比较堆中的地址,而不是指向常量池中
System.out.println(A == C);//f 堆中地址和常量池中内存地址肯定不一样
System.out.println(a == C );//t 这个时候 == 会将C自动拆箱(intValue())
System.out.println(a == A);//t 同上
System.out.println(E == F);//f 超过了常量池中的范围,会自动创建
}
7. 字符串类型字符数量的最大值
最大值分为编译期和运行期
编译期:最大长度为65534,达到65535个数就会报错
运行期:String内部是以char数组的形式存储,数组的长度是int类型,那么String允许的最大长度就是Integer.MAX_VALUE了。又由于java中的字符是以16位存储的,因此大概需要4GB的内存才能存储最大长度的字符串。
8. ThreadLocal有什么作用
threadLocal是为了解决对象不能被多线程共享访问的问题
该类提供线程局部变量。这些变量与普通的变量不同之处在于,每个访问一个变量的线程(通过其get或set方法)都有自己独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,它们希望将状态与线程相关联(例如用户ID或事务ID)
每个线程都有一个对其线程局部变量副本的隐式引用,只要线程是活的并且ThreadLocal实例是可访问的;在一个线程消失后,它的所有线程本地实例副本都将被垃圾回收(除非存在对这些副本的其他引用)。
9. 内码和外码是什么
一、内码
是指计算机汉字系统中使用的二进制字符编码,是沟通输入、输出与系统平台之间的交换码,通过内码可以达到通用和高效率传输文本的目的。
二、外码
外码是相对于内码而言的辞汇。在计算机科学及相关领域中,外码指的是“外在的‘经过学习之后,可直接了解的编码形式(例如:文字或语音符号)
中文输入法对汉字的编码即属外码。常见的中文外码有仓颉码、行列码、大易码、呒虾米码、注音码、拼音码。
10. 常见的编码格式
参照https://blog.csdn.net/maikelsong/article/details/81098456
计算中提拱了多种编码方式,常见的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。它们都可以被看作为字典,它们规定了转化的规则,按照这个规则就可以让计算机正确的表示我们的字符。
ASCII 码
学过计算机的人都知道 ASCII 码,总共有 128 个,用一个字节的低 7 位表示,0~31 是控制字符如换行回车删除等;32~126 是打印字符,可以通过键盘输入并且能够显示出来。
GBK
全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。
UTF-8
UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要两个字节表示,存储空间放大了一倍,在现在的网络带宽还非常有限的今天,这样会增大网络传输的流量,而且也没必要。而 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。
UTF-8 有以下编码规则:
如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节
11. 子父类中构造器,代码块,静态代码块的执行顺序
在没有继承关系的类中:静态代码块 --> 代码块 --> 构造器
在有继承关系的类中:父类静态代码块 --> 子类静态代码块 --> 父类代码块 --> 父类构造器 --> 子类代码块 --> 子类构造器
12.什么是强引用,软引用,弱引用,虚引用
public static void main(String[] args) {
// 强引用
String strongReference1 = new String("abc");
// 软引用
String str1 = new String("abc");
SoftReference<String> softReference = new SoftReference<String>(str1);
// 弱引用
String str2 = new String("abc");
WeakReference<String> weakReference = new WeakReference<>(str2);
// 弱引用转强引用
String strongReference2 = weakReference.get();
// 虚引用
String str3 = new String("abc");
ReferenceQueue queue = new ReferenceQueue();
// 创建虚引用,要求必须与一个引用队列关联
PhantomReference pr = new PhantomReference(str3, queue);
}
引用类型 | 被垃圾回收时间 | 用途 | 生存时间 |
---|---|---|---|
强引用 | 从来不会(将赋值为null会被回收) | 对象的一般状态 | JVM停止运行时终止 |
软引用 | 当内存不足时 | 对象缓存 | 内存不足时终止 |
弱引用 | 正常垃圾回收时 | 对象缓存 | 垃圾回收后终止 |
虚引用 | 正常垃圾回收时 | 跟踪对象的垃圾回收 | 垃圾回收后终止 |
13. 什么是深拷贝和浅拷贝
浅拷贝(shallowCopy)
只是增加了一个指针指向已存在的内存地址,仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深拷贝(deepCopy)
是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,在计算机中开辟一块新的内存地址用于存放复制的对象。