Java知识体系之Java基础

5次阅读

共计 1633 个字符,预计需要花费 5 分钟才能阅读完成。

最近看到 CSDN 上面的一篇博客 面试必备:《Java 最常见的 200+ 面试题全解析》, 讲解了关于 Java 体系的一些模块以及面试中的一些常见问题; 虽然最近没有要去找工作的需求, 但是巩固一下这方面的知识还是很有必要的; 后面从作者提出的问题进行自我的提问与解答, 有问题欢迎大家指出;

Java 基础部分

1、JDK 和 JRE 的区别

 我的理解是: 首先 JDK 包含三部分: 1、程序员编程所需要的基本类库等; 2、Java 字节码的运行时环境 (JRE); 3、用于对 JVM 进行调优查看等工具, 如 jconsole、jstack 等; 而 JRE 仅仅为 Java 代码的运行提供运行时环境而已;

2、== 和 equals 的区别

== 表示两个对象的内存地址是否相等, 即: == 两遍比较的对象是不是同一个类的实例, 如果是同一个实例, 那么返回 true, 如果不是则返回 false; 默认 java.lang.Object 中的 equals 是基于 == 来实现的;

而 Object 子类可以重写 equals 方法, 来实现自己的逻辑上的等于判断; 即使两个对象不是同一个对象实例, 里面有一些数据相同也可以认为它们是相同的;

** 3、HashCode 与 Equals 是什么关系?

 在不使用集合的情况下, hashCode 与 equals 没有直接关系; equals 可以单独进行逻辑判断, 即使两个对象逻辑相等, hashCode 也可以不一样; 反过来也成立, 即使两个对象的 hashCode 相同, equals 方法返回值也可能不同;

但是在使用如 HashMap、HashSet 等结构时, 由于底层是基于桶的算法, 所以必须确保如果作为 Key 两个对象的 equals 返回 true, 它的 hashCode 一定要相等; 如果不相等, 那么对于逻辑相同的对象作为 Key 去检索的时候找不到对应的 Value;

4、final 在 java 中的作用

final 在 Java 中可以修饰 类、方法、变量; 

修饰类: 表示该类是一个终态类, 不允许有子类;

修饰方法: 表示该方法不能够被重写;

修饰变量: 表示该变量指向的对象不能够改变

一般定义不可变常量 如: LOGGER 或者在线程中需要引用外部变量, 则需要添加 final 修饰符;

5、String 属于基础的数据类型吗

String 不属于基本数据类型, 它是 Java 中的内置的类, 底层使用 char[] 实现;

6、java 中操作字符串都有哪些类?它们之间有什么区别?

Java 中操作字符串的类有 3 个: String、StringBuffer、StringBuilder; String 类每次对于字符串的 CURD 操作都会产生一个新的字符串常量; StringBuffer 与 StringBuilder 不会; 而 StringBuffer 是线程安全的, StringBuilder 是线程非安全的;

7、String 类的常用方法都有那些

indexOf, substring, lastIndexOf, chatAt, equals, startWith, endWith, concat, replace, split, toLowerCase 等等; 

8、抽象类必须要有抽象方法吗?

 这种就是更基础的了, 抽象类不一定要有抽象方法, 可以全部是实现; 不过一般没有抽象方法的抽象类都会把 abstract 修饰符给去掉

9、BIO、NIO、AIO 有什么区别

 这个问题就比较大了, 涉及到的知识点比较多;

BIO: 一般翻译为同步阻塞 IO, 一旦调用了同步方法, 那么必须等待数据到达之后才会返回; 否则一直等待;

NIO: 一般翻译为 New IO, 或者 Non-Blocking IO; 其实也是阻塞 IO, 增加了 Channel、Selector 以及事件机制来确保不是所有的 IO 操作都处于等待, 能够更加合理的利用 CPU 资源; 具体表现为 Selector 监听各个 IO 操作的情况, 如果有 IO 可读、可写之后, 就直接返回; 然后遍历所有的 Channel, 哪个可读可写就调度谁; 该 NIO 实现依托于 Linux IO 模型中的多路复用机制

AIO: 就是异步非阻塞 IO, 这个暂时还不是很了解实现, 明天学习一下;



正文完
 0