强化历程4-JavaSE系列
1.面向对象
1.1 用最有效率的方法计算 2 乘以 8
答:2 << 3。
1.2 访问修饰符
修饰符 | 同类 | 同包 | 子类 | 不同包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
默认的 | √ | √ | × | × |
private | √ | × | × | × |
1.3 final 有什么用?
答:
修饰类,属性,方法
① 修饰类不可被继承
② 修饰方法不可被重写
③ 修饰的属性不可被改变,注:不可变的是引用,不是引用指向的值
1.4 final finally finalize区别?
答:
① final 使修饰符,可修饰类,属性和方法。
② finally 在 try-catch-finally代码块中,无论如何都会被最终执行的代码块。
③ finalize 使一个Object类的方法,可以配合垃圾回收器进行垃圾回收
1.5 面向对象和面向过程的区别
答:
① 面向过程处理问题是一步一步的,对具体问题进行一步一步分析,然后进行处理。性能较高,但是代码复用性,维护性不如面向对象
② 面向对象处理问题是抽象化的,他会吧具体问题抽象为一个类,这个类里有具体数据和方法,需要什么直接调用即可,面向对象底层就是面向过程。
1.6 什么是多态?
答:
即是父类引用指向子类对象
用一个例子简单理解多态,
比如猫和狗都属于一个动物,他们都可以叫,但是叫的声音不一样,此时我们就可以设一个Animal类为父类,他有一个
叫
的抽象方法;有两个cat和dog的子类继承Animal类,并且重写这个
叫
的抽象方法,不同动物叫声不同;然后我们让父类引用指向对应的类,然后调用
叫
的方法,不同对应的类就会有不同的声音
1.7 抽象类和接口的对比
答:抽象类是对类的抽象,接口是对行为的抽象
抽象类往往用于将一个类的通用部分抽象出来,供其他类继承,接口则是定义一组规范,供其他类实现,jdk1.8后接口也可以定义默认方法,两者之间差异就不是那么明显了。。。
1.8 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
答:帮助子类初始化
1.9 HashSet如何检查重复
答:
向hashset中添加元素时,hashset首先会调用hashcode方法,获取hash码,如果不存在相同hash码,直接插入,若存在,调用他们的equals方法一一比较,若equals返回true,会认为是重复元素,反之则添加到集合中
1.10 为什么重写equals也要重写hashcode方法
答:
Object规范:equals相等的,hashcode也相等。
当重写equals方法后,可能会造成,equals相等hashcode不相等,因此也需要重写hashcode方法
2. IO流
2.1 你知道的 IO 流分为几种?
答:字节输入输出流,桥接流,字符输入输出流,打印流和数据流,对象流
- InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
2.2 序列化和反序列化
答:我们知道在计算机中,所有字符都最终会转为二进制的形式,而我们java中的对象要想写入文件,或者从文件中读出,这之间都需要转为二进制进行。
- 序列化:将一个Java对象转化为字节码的过程(流化)
- 反序列化:将字节码转化为Java对象的过程
2.3 BIO,NIO,AIO 区别?
答:
BIO (Blocking I/O) 是传统的 I/O 模型,它是同步阻塞的,即当一个线程在执行 I/O 操作时,其他线程必须等待该操作完成后才能执行下一步操作。
NIO (Non-blocking I/O) 是一种更高效的 I/O 模型,它是同步非阻塞的。它使用了缓冲区和通道的概念,可以在单个线程中处理多个连接。
AIO (Asynchronous I/O) 是 Java 7 中引入的新的 I/O 模型,它是异步非阻塞的。在 AIO 中,当一个 I/O 操作启动后,线程可以继续执行其他操作,当 I/O 操作完成后,会通过回调函数来通知线程。
总的来说,BIO 是最简单的模型,但是在高并发情况下性能较差;NIO 是一种更高效的模型,但是代码复杂度较高;AIO 是最高效的模型,但是需要操作系统支持。
3. 反射
3.1 什么是反射?
答:反射又被称为类的“自省”,动态获得类自身的内容(属性,方法,构造器…), 并动态创建类的对象,然后调用这些属性和方法
我们之前编写的代码大多是在编译期定义的,类的对象创建及属性或方法的调用都在编译期已经创建成功
编译期写的代码不具有通用性,如果想要编写出来更加通用,更加灵活的代码,我们则不能在编译器创建对象和调用属性和方法,需要利用反射在运行期运行期动态创建类的对象并动态调用对象中的属性和方法
3.2 反射优缺点
答:反射的优点:
反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创和控制任何类的对象,无需提前硬编码目标类
反射的缺点
性能问题,使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用
3.3 反射获取类的方法
答:
类名.class
,类名.getClass()
,Class.forName("类完整路径字符串");
4. String类
4.1 String 类的常用方法都有那些?
答:
indexOf()
:返回指定字符的索引。replace()
:字符串替换。substring()
:截取字符串。toLowerCase()
:将字符串转成小写字母。toUpperCase()
:将字符串转成大写字符。split()
:分割字符串,返回一个分割后的字符串数组。trim()
:去除字符串两端空白。
4.2 在使用 HashMap 的时候,用 String 做 key 有什么好处?
答:
HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置,因为字符串是不可变的,所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更快。
4.3 String和StringBuffer、StringBuilder的区别是什么?
答:
String 底层是 private final char[] ,string不可变;
StringBuffer比其他两个线程安全;
性能方面,StringBuffer小于StringBuilder,String每次对字符串进行操作,都会生成一个新的String对象,其他两个都是对其本身进行操作