Java面试题分享

1. 什么是gitbook

GitBook 可帮助您为用户发布精美的文档,并集中团队的知识以进行高级协作。
参考https://docs.gitbook.com/

2. 异常处理中return位置的放置对返回值的影响

try-catch-finally中return可以放到try中,可以放到catch中,可以放到finally中。
总结:当return放到trycatch中会被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中什么是向上转型什么是向下转型

在这里插入图片描述
向上转型:主要体现在多态(父类的引用指向子类的对象),特点是此对象只能调用父类中有的方法,如果子类重写了就按子类的来。
向下转型:指向父类引用的子类对象被强制转换为子类的引用,可以用子类中特有的方法。

总结

  1. 父类引用可以指向子类的对象,子类的引用不能指向父类的对象。
  2. 向上转型就是父类的引用指向子类的对象(子类的对象赋值给父类的引用),向上转型不用强制转换,向下转型是指向父类引用的子类对象被强制转换为子类的引用,向下转型要强制类型转换
  3. 向上转型不能调用子类所特有的方法,向上转型调用父类中的方法具体运行的是子类重写过后的方法。

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)

是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,在计算机中开辟一块新的内存地址用于存放复制的对象。

14. 单例模式枚举实现

/**
 * 枚举单例模式
 */
enum SingletonPattern5{

    INSTANCE;

    public void show(){
        System.out.println("类中的测试方法");
    }
}

15. BIO,NIO,AIO是什么,有什么特点

参照https://blog.csdn.net/m0_38109046/article/details/89449305

对于同步阻塞、同步非阻塞、异步非阻塞的理解

举个生活中简单的例子,你妈妈让你烧水,小时候你比较笨啊,在哪里傻等着水开(同步阻塞)。等你稍微再长大一点,你知道每次烧水的空隙可以去干点其他事,然后只需要时不时来看看水开了没有(同步非阻塞)。后来,你们家用上了水开了会发出声音的壶,这样你就只需要听到响声后就知道水开了,在这期间你可以随便干自己的事情,你需要去倒水了(异步非阻塞)。

  1. BIO(Blocking I/O):
    同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
  2. NIO(New I/O):
    是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架
  3. AIO (Asynchronous I/O):
    是一种异步非阻塞的IO模型,现在应用还不是特别广泛。

16. Linux系统中了五种IO模型

参照:漫话:如何给女朋友解释什么是Linux的五种IO模型?

阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型以及异步IO模型。

以实际生活中的钓鱼为例:

  1. 阻塞IO模型:钓鱼的时候人一直盯着鱼漂,等着鱼上钩,什么事也不做;
  2. 非阻塞IO模型:钓鱼的时候人偶尔盯着鱼漂,其余时间做其他的事;
  3. IO复用模型:钓鱼的时候用多个鱼竿钓鱼;
  4. 信号驱动IO模型:钓鱼的时候人一直做其他的事情不用盯着鱼漂,等着鱼竿自动报警,报警了才去拉钩;
  5. 异步IO模型:用全自动钓鱼竿人完全不用管怎么钓鱼.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值