当前位置:首页>编程知识库>后端开发知识>Java基础知识
Java基础知识
阅读 3
2020-11-24

1、JDK与JRE的不同

1.1、什么是JDK

JDK的英文全称是:Java Development Kit,是针对Java开发员的软件开发工具包。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM Java系统类库)和JAVA工具。
如果需要编写java程序,需要安装JDK

1.2、什么是JRE

JRE的英文全称:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给运行java程序的用户使用的,所有的Java类库的class文件,都在lib目录下,并且都打包成了jar
普通用户只需要安装JRE来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序。

2、Java的 == 和 equals 有什么不同?

2.1 == 对于基本类型来说是值比较,对于引用类型来说是比较的是它们在内存中的存放地址;

Java基本类型有:整数类型:intlongbyteshort,浮点数类型:floatdouble,字符类型:char,布尔类型:boolean 

2.2 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

3、hashcode的取值范围?

hashCodeJava对象相关联的整数值。
最小值为 Integer.MIN_VALUE 最大值为 Integer.MAX_VALUE
hashcode的取值范围在32以上编译器为 -2^312^31-1

4、为什么先比较hashCode 然后在比较equals

Java Object类同时定义equals()和hashCode()方法,这两个方法在每个Java类中都是隐式定义的。
hashCode计算利用的是内存地址,时间复杂度O(1), hashCode相等 不一定是一个对象,不等肯定不是一个对象就不需要再比较equals

4.1 为什么不能只重写equals方法?

根据Java文档,应该重写这两个方法以获得完整的相等机制;仅使用equals()是不够的。这意味着,如果我们重写equals(),我们必须重写hashcode()方法。
保证是同一个对象,如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。

5、java 中的 final有什么作用

final是一个非访问修饰符,只适用于变量、方法或类。

当用final声明变量时,它的值不能被修改,本质上是一个常量。这也意味着您必须初始化一个final变量。如果最终变量是一个引用,这意味着该变量不能重新绑定以引用另一个对象,但该引用变量指向的对象的内部状态可以更改。
当一个类用final关键字声明时,它被称为最终类。不能继承。
当使用final关键字声明方法时,它被称为 final 方法。final 方法不能被覆盖
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。

6、java对象为什么要序列化

Java中的序列化会将Object转换为字节流,我们可以通过网络发送该流,或者将其保存为文件或存储在DB中以供以后使用。反序列化是将Object流转换为实际Java对象以用于我们的程序的过程。
类的可序列化性由实现 java.io.Serializable 接口的类启用。不实现此接口的类将不会对其任何状态进行序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。该机制用于持久化对象。
static静态变量和transient 修饰的字段是不会被序列化的
如果某个序列化类的成员变量是对象类型,则该对象类型的类必须实现序列化
子类实现了序列化,父类没有实现序列化,父类中的字段丢失问题

7、Serializable 和 Externalizable 有什么区别?

Serializable 是一个标记接口,即不包含任何方法。Serializable 接口将序列化的责任传递给 JVM 及其默认算法。程序员对序列化没有控制权,Serializable接口使用了反射和元数据,导致性能相对较慢。
Externalizable 接口包含两个方法 writeExternal() 和 readExternal() ,实现类必须覆盖它们。让我们可以控制 Java的序列化, 不依赖于Java的默认序列化。正确实现 Externalizable 接口可以显著提高应用程序的性能。

8、Java中的 AIO、NIO和BIO的区别

BIO是一种同步阻塞模型,一个客户端连接对应一个线程
NIO 是一种同步和非阻塞模型。在NIO中,一个线程可以处理多个请求
AIO 是一种异步非阻塞模型。一般用于连接数多,连接时间长的应用。读写事件完成后,回调服务通知应用程序启动线程。在AIO中,只需要调用readwrite方法即可进行读写操作。这两种方法都是异步的。
BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。
NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
BIO方式适用于连接数目比较小且固定的架构
NIO方式适用于连线数目多且连线比较短(轻操作)的架构
AIO方式使用于连线数目多且连线比较长(重操作)的架构

9、IO多路复用

1)同步阻塞IOBlocking IO):即传统的IO模型。
传统的套接字连接是阻塞的,其中服务器等待客户端连接,一旦获得客户端连接,就会有一个独立的线程处理客户端的操作。
2)同步非阻塞IONon-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非JavaNIONew IO)库。
3IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IOJava中的SelectorLinux中的epoll都是这种模型。一个连接可以存在多次请求复用。用户每次socket请求都需要把请求放到select中,然后堵塞等待select调用返回。Select监视socket造成格外开销,效率更差。但是可以在一个线程中调用多次IO请求,如果堵塞IO的情况只能是多线程去处理。
4)异步IOAsynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO

10、Java 指令重排

就是指Java执行程序代码,在执行时并不一定按照写的顺序。 在Java中,JVM能够根据处理器特性(CPU多级缓存系统、多核处理器等)适当对机器指令进行重排序,最大限度发挥机器性能。
单线程不会存在这个问题, 主要是出现在多线程并发的情况,编译器不考虑多线程之间的语义,多线程在执行的时候可能会出现变量读写顺序问题。
防止指令重排使用用volatile修饰的变量。或者是synchronized修饰方法。

11、Java字符常量和字符串常量区别

字符常量是单引号引起的一个字符,是基础数据类型char。相当于整型的ASCII值。占两个字节。
字符串常量是String 对象类型存在内存中, String 的最大长度为 Integer.MAX_VALUE - 22 ^ 31 - 3

12、Java中构造器能否被重写?

不能 因为构造器不能被继承,所以也不能被重写。

13、Java 自动装箱和拆箱

Java是面向对象的语言,但又存在基础数据类型,所有java会把基础数据类型自动转成对应的对象类型。同时也会把对象类型能够转成基础数据类型。比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。 因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。

14、Java异常

Java 异常的概念来处理错误和“异常事件”。
Java 异常可以分为以下三类之一:
已检查- 这些是编译器在编译时检查的异常。这些异常必须由代码中的 try/catch 捕获或标记为由方法抛出。例如,如果程序试图访问当前不可用的文件,则访问该文件的方法必须捕获或抛出一个FileNotFoundException.
错误- 错误是 Java 程序外部发生的异常。该错误的一个常见示例是当 Java 虚拟机 (JVM) 内存不足时,这将抛出OutOfMemoryError.
运行时- 运行时异常是应用程序内部的,但通常不可恢复。例如,预期有值但实际上为空的对象。在这种情况下,NullPointerException将抛出异常。
Java 中的异常处理是处理运行时错误以保持应用程序正常流程的有效手段之一。Java异常处理是一种处理运行时错误的机制,如ClassNotFoundExceptionIOExceptionSQLExceptionRemoteException等。
出现异常的主要原因
1.无效的用户输入
2.设备故障
3.失去网络连接
4.物理限制(磁盘内存不足)
5.代码错误
6.打开一个不可用的文件
错误表示不可恢复的情况,例如 Java 虚拟机 (JVM) 内存耗尽、内存泄漏、堆栈溢出错误、库不兼容、无限递归等。错误通常是程序员无法控制的,我们不应该试图去处理错误.
所有异常和错误类型都是 Throwable 类的子类,Throwable是层次结构的基类。
一个分支由Exception主导。此类用于用户程序应捕获的异常情况。NullPointerException 是此类异常的一个示例。
Java 运行时系统 ( JVM ) 使用另一个分支Error来指示与运行时环境本身 (JRE) 相关的错误。StackOverflowError 是此类错误的一个示例。

15、怎么让java类中有的字段不序列化?

Trasient标记属性

15.1 serialVersionUID的作用?

序列化和反序列化时用这个id做标记是否是用一个对象。

16、七层网络模型

16.1 应用层

网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

16.2 表示层

数据的表示、安全、压缩。
格式有,JPEGASCllEBCDIC、加密格式等

16.3 会话层

建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话

16.4 传输层

定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层

16.5 网络层

进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IPIPV4 IPV6

16.6 数据链路层

建立逻辑连接、进行硬件地址寻址、差错校验等功能。
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

16.7 物理层

建立、维护、断开物理连接。

17、TCP连接

属于传输层协议。建立一个TCP连接需要经过“三次握手”。

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYNack=j 1),同时自己也发送一个SYN包(syn=k),即SYN ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYNACK包,向服务器发送确认包ACK(ack=k 1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
如果没有第一次握手那就没有建立连接。
如果没有第二次握手,也就是不需要服务端返回ACK响应,那么客户端以为服务端没有收到就会重新请求,服务端会重新申请资源去连接。
如果没有第三次握手 也就是客户端没有确认这个ACK响应,服务端会等待这个AC响应,如果这个响应迟迟没有来,就会认为这个SYN是无效的,就会释放相关资源。

18、HTTP连接

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,HTTP协议是建立在TCP协议之上的一种应用。
HTTP连接最显著的特点是客户端发送的每次请求都需要服务器响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

19、深拷贝和浅拷贝区别

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
评论 (0)