基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
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
基本类型有:整数类型:
int
、
long
、
byte
、
short
,浮点数类型:
float
、
double
,字符类型:
char
,布尔类型:
boolean
2.2 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
3、hashcode的取值范围?
hashCode
是
Java
对象相关联的整数值。
最小值为
Integer
.
MIN
_
VALUE
最大值为
Integer
.
MAX
_
VALUE
hashcode
的取值范围在
32
以上编译器为 -
2
^
31
到
2
^
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
中,只需要调用
read
或
write
方法即可进行读写操作。这两种方法都是异步的。
BIO
的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。
NIO
的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
AIO
的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
BIO
方式适用于连接数目比较小且固定的架构
NIO
方式适用于连线数目多且连线比较短(轻操作)的架构
AIO
方式使用于连线数目多且连线比较长(重操作)的架构
9、IO多路复用
(
1
)同步阻塞
IO
(
Blocking
IO
):即传统的
IO
模型。
传统的套接字连接是阻塞的,其中服务器等待客户端连接,一旦获得客户端连接,就会有一个独立的线程处理客户端的操作。
(
2
)同步非阻塞
IO
(
Non
-
blocking
IO
):默认创建的
socket
都是阻塞的,非阻塞
IO
要求
socket
被设置为
NONBLOCK
。注意这里所说的
NIO
并非
Java
的
NIO
(
New
IO
)库。
(
3
)
IO
多路复用(
IO
Multiplexing
):即经典的
Reactor
设计模式,有时也称为异步阻塞
IO
,
Java
中的
Selector
和
Linux
中的
epoll
都是这种模型。一个连接可以存在多次请求复用。用户每次
socket
请求都需要把请求放到
select
中,然后堵塞等待
select
调用返回。
Select
监视
socket
造成格外开销,效率更差。但是可以在一个线程中调用多次
IO
请求,如果堵塞
IO
的情况只能是多线程去处理。
(
4
)异步
IO
(
Asynchronous
IO
):即经典的
Proactor
设计模式,也称为异步非阻塞
IO
10、Java 指令重排
就是指
Java
执行程序代码,在执行时并不一定按照写的顺序。 在
Java
中,
JVM
能够根据处理器特性(
CPU
多级缓存系统、多核处理器等)适当对机器指令进行重排序,最大限度发挥机器性能。
单线程不会存在这个问题, 主要是出现在多线程并发的情况,编译器不考虑多线程之间的语义,多线程在执行的时候可能会出现变量读写顺序问题。
防止指令重排使用用
volatile
修饰的变量。或者是
synchronized
修饰方法。
11、Java字符常量和字符串常量区别
字符常量是单引号引起的一个字符,是基础数据类型
char
。相当于整型的
ASCII
值。占两个字节。
字符串常量是
String
对象类型存在内存中,
String
的最大长度为
Integer
.
MAX
_
VALUE
-
2
或
2
^
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
异常处理是一种处理运行时错误的机制,如
ClassNotFoundException
、
IOException
、
SQLException
、
RemoteException
等。
出现异常的主要原因
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 表示层
数据的表示、安全、压缩。
格式有,
JPEG
、
ASCll
、
EBCDIC
、加密格式等
16.3 会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
16.4 传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:
TCP
UDP
,数据包一旦离开网卡即进入网络传输层
16.5 网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:
ICMP
IGMP
IP
(
IPV4
IPV6
)
16.6 数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验等功能。
将比特组合成字节进而组合成帧,用
MAC
地址访问介质,错误发现但不能纠正。
16.7 物理层
建立、维护、断开物理连接。
17、TCP连接
属于传输层协议。建立一个TCP连接需要经过“三次握手”。
第一次握手:客户端发送
syn
包(
syn
=
j
)到服务器,并进入
SYN
_
SEND
状态,等待服务器确认;
第二次握手:服务器收到
syn
包,必须确认客户的
SYN
(
ack
=
j
1
),同时自己也发送一个
SYN
包(
syn
=
k
),即
SYN
ACK
包,此时服务器进入
SYN
_
RECV
状态;
第三次握手:客户端收到服务器的
SYN
+
ACK
包,向服务器发送确认包
ACK
(
ack
=
k
1
),此包发送完毕,客户端和服务器进入
ESTABLISHED
状态,完成三次握手。
如果没有第一次握手那就没有建立连接。
如果没有第二次握手,也就是不需要服务端返回
ACK
响应,那么客户端以为服务端没有收到就会重新请求,服务端会重新申请资源去连接。
如果没有第三次握手 也就是客户端没有确认这个
ACK
响应,服务端会等待这个
AC
响应,如果这个响应迟迟没有来,就会认为这个
SYN
是无效的,就会释放相关资源。
18、HTTP连接
HTTP
协议即超文本传送协议(
Hypertext
Transfer
Protocol
),是
Web
联网的基础,
HTTP
协议是建立在
TCP
协议之上的一种应用。
HTTP
连接最显著的特点是客户端发送的每次请求都需要服务器响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
19、深拷贝和浅拷贝区别
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
上一篇:
JAVA知识 Java8新特性
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目