复习背诵整理版

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复习背诵整理版相关的知识,希望对你有一定的参考价值。

复习

1. int 和 Integer 的区别主要体现在以下几个方面:

  1. 数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型;
  2. 默认值不同:int 的默认值是 0,而 Integer 的默认值是 null;
  3. 内存中存储的方式不同:int 在内存中直接存储的是数据值,而 Integer 实际存储的是对象引用,当 new 一个 Integer 时实际上是生成一个指针指向此对象;
  4. 实例化方式不同:Integer 必须实例化才可以使用,而 int 不需要;
  5. 变量的比较方式不同:int 可以使用 == 来对比两个变量是否相等,而 Integer 一定要使用 equals 来比较两个变量是否相等。

2. 为啥要有包装类?

包装类的存在解决了基本数据类型无法做到的事情泛型类型参数、序列化、类型转换、高频区间数据缓存等问题。

3. 重写 equals 时为什么一定要重写 hashCode?

hashCode 和 equals 两个方法是用来协同判断两个对象是否相等的,采用这种方式的原因是可以提高程序插入和查询的速度,如果在重写 equals 时,不重写 hashCode,就会导致在某些场景下,例如将两个相等的自定义对象存储在 Set 集合时( Set 集合最大的特点:去重。),就会出现程序执行的异常,为了保证程序的正常执行,所以我们就需要在重写 equals 时,也一并重写 hashCode 方法才行。

4. final关键字和final的4种用法?

final 翻译成中文是“最终”的意思,它是 Java 中一个常见关键字,使用 final 修饰的对象不允许修改或替换其原始值或定义。

final 有 4 种用法,可以用来修饰类、方法、变量或参数。

5. final、finally、finalize 有什么区别?

final、finally 和 finalize 从英文字面角度来看,看似很像,实则 3 者在 Java 中没任何关系。final 是用来修饰类、方法、变量和参数的关键字,被 final 修饰的对象不允许修改或替换其原始值或定义;finally 是 Java 中保证重点代码一定要被执行的一种机制;finalize 是 Object 类中的一个基础方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收的,但其执行“不稳定”,且有一定的性能问题,已经在 JDK 9 中被设置为弃用的方法了。

6. finally 是否一定会被执行?

这是一个有诱导嫌疑的问题,正常情况下 finally 一定是会执行的,但有一个特殊情况 finally 也是不会执行的,特殊的实现代码和执行结果如下:

7. HashMap有几种遍历方法?推荐使用哪种?

7 种。

JDK 8 之前主要使用 EntrySetKeySet (遍历方式是循环 Key 内容,再通过 map.get(key) 获取 Value 的值,性能比较低,循环了两次,一般不推荐用)的遍历方式 。EntrySet 迭代器遍历KeySet 迭代器遍历

JDK 8 之后遍历方式可以使用比较简洁的 Lambda 遍历,也可以使用性能比较高的 Stream 多线程遍历。

Stream 单线程遍历是先得到 map 集合的 EntrySet,然后再执行 forEach 循环。

Stream 多线程的遍历方式和上一种遍历方式类似,只是多执行了一个 parallel 并发执行的方法,此方法会根据当前的硬件配置生成对应的线程数,然后再进行遍历操作。因为程序是并发执行的,所以没有办法保证元素的执行顺序和打印顺序,这就是并发编程的特点。

推荐:不同的场景推荐使用的遍历方式是不同的,例如,如果是 JDK 8 之后的开发环境,推荐使用 Lambda 的遍历方式,因为它足够简洁;而如果在遍历的过程中需要动态的删除元素,那么推荐使用迭代器的遍历方式;如果在遍历的时候,比较在意程序的执行效率,那么推荐使用 Stream 多线程遍历的方式,因为它足够快。所以这个问题的答案是不固定的,我们需要知道每种遍历方法的优缺点,再根据不同的场景灵活变通。

8. 元素排序Comparable和Comparator有什么区别?

Comparable 和 Comparator 都是用来实现元素排序的,它们二者的区别如下:

  • Comparable 是“比较”的意思,而 Comparator 是“比较器”的意思;
  • Comparable 是通过重写 compareTo 方法实现排序的,而 Comparator 是通过重写 compare 方法实现排序的;
  • Comparable 必须由自定义类内部实现排序方法,而 Comparator 是外部定义并实现排序的。

所以用一句话总结二者的区别:Comparable 可以看作是“对内”进行排序接口,而 Comparator 是“对外”进行排序的接口。

9. 如何实现 List 集合去重?

自定义去重功能实现起来相对繁琐,而 Set 集合依靠其自带的去重特性,可以很方便的实现去重功能,并且可以使用 LinkedHashSet 在去重的同时又保证了元素所在位置不被更改。而最后一种去重的方法,是 JDK 8 中新增的,使用 Stream 中的 distinct 方法实现去重,它的优点是不但写法简单,而且无需创建新的集合,是实现去重功能的首选方法。

10. HashSet如何保证元素不重复?

HashSet 底层是由 HashMap 实现的,它可以实现重复元素的去重功能,如果存储的是自定义对象必须重写 hashCode 和 equals 方法。HashSet 保证元素不重复是利用 HashMap 的 put 方法实现的,在存储之前先根据 key 的 hashCode 和 equals 判断是否已存在,如果存在就不在重复插入了,这样就保证了元素的不重复。

当将一个键值对放入 HashMap 时,首先根据 key 的 hashCode() 返回值决定该 Entry 的存储位置。如果有两个 key 的 hash 值相同,则会判断这两个元素 key 的 equals() 是否相同,如果相同就返回 true,说明是重复键值对,那么 HashSet 中 add() 方法的返回值会是 false,表示 HashSet 添加元素失败。因此,如果向 HashSet 中添加一个已经存在的元素,新添加的集合元素不会覆盖已有元素,从而保证了元素的不重复。如果不是重复元素,put 方法最终会返回 null,传递到 HashSet 的 add 方法就是添加成功。

11. 接口和抽象类有什么区别?

接口和抽象类都是用来定义对象的公共行为的,但二者有以下 7 点不同:

  1. 定义的关键字不同。
  2. 子类继承或实现关键字不同。
  3. 类型扩展不同:抽象类是单继承,而接口的实现类可以有多个。
  4. 属性访问控制符:抽象类无限制;接口中只能是 public,属性默认是 public static final 修饰的。
  5. 方法控制符:抽象类无限制,只是抽象方法不能用 private 修饰;接口中方法的默认控制符是 public,并且不能定义为其他控制符。
  6. 方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;而接口中普通方法不能有实现,但在 JDK 8 中的 static 和 defualt 方法必须有实现。
  7. 静态代码块的使用不同:抽象类可以有静态代码块,而接口不能有。

12. 接口的特点?

  1. JDK 8 中接口可以定义 static 和 default 方法,并且这两种方法可以包含具体的代码实现。
  2. 实现接口要使用 implements 关键字。
  3. 接口不能直接实例化。
  4. 接口中定义的变量默认为 public static final 类型。
  5. 子类可以不重写接口中的 static 和 default 方法,不重写的情况下,默认调用的是接口的方法实现。

13. 抽象类的特点?

  1. 抽象类使用 abstract 关键字声明。
  2. 抽象类中可以包含普通方法和抽象方法,抽象方法不能有具体的代码实现。
  3. 抽象类需要使用 extends 关键字实现继承。
  4. 抽象类不能直接实例化。
  5. 抽象类中属性控制符无限制,可以定义 private 类型的属性。

14. this和super有什么区别?this能调用到父类吗?

this 和 super 都是 Java 中的关键字,都起指代作用,当显示使用它们时,都需要将它们放在方法的首行(否则编译器会报错)。this 表示当前对象,super 用来指代父类对象。

  1. 指代的对象不同:super 指代的是父类,是用来访问父类的;而 this 指代的是当前类。
  2. 查找范围不同:super 只能查找父类,而 this 会先从本类中找,如果找不到则会去父类中找。
  3. 本类属性赋值不同:this 可以用来为本类的实例属性赋值,而 super 则不能实现此功能。
  4. this 可用于 synchronized:因为 this 表示当前对象,所以this 可用于 synchronized(this)… 加锁,而 super 则不能实现此功能。

14. 方法重写时需要注意的问题有哪些?

Java 中的方法重写(Override)是面向对象编程中多态的具体表现,它允许子类重新定义父类中已有的方法,且子类中的方法名和参数类型及个数都必须与父类保持一致,这就是方法重写。可以通过 @Override 关键字重写父类中的某个方法,过程中需要注意以下 5 个问题:

  1. 子类方法的权限控制符不能变小;public > protected > 无 > private
  2. 子类方法返回的类型只能变小;如果父类方法返回的是 Number 类型,那么子类方法只能返回 Number 类型或 Number 类的子类 Long 类型,而不能返回 Number 类型的父类类型 Object;
  3. 子类抛出异常的类型只能变小;
  4. 子类方法名必须和父类保持一致;
  5. 子类方法的参数类型和个数必须和父类保持一致。

15. 为什么不同返回类型不算方法重载?

方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同。

方法签名是由:方法名称 + 参数类型 + 参数个数组成的一个唯一值,这个唯一值就是方法签名,而 JVM(Java 虚拟机)就是通过这个方法签名来决定调用哪个方法的

方法重载的典型使用场景是 String 中的 valueOf 方法,它有 9 种实现。方法返回类型不能作为方法重载的依据,因为它不是方法签名的组成部分。方法重载有 5 个匹配原则:精准匹配 --> 基本类型自动转换成更大的基本类型匹配 --> 自动装/拆箱匹配 --> 按照继承路线依次向上匹配 --> 可变参数匹配

16. 方法优先调用可选参数还是固定参数?

优先调用固定参数。可选参数是 JDK 5 中新增的以“…”格式存在的参数类型,可选参数可以匹配 0 到无穷个参数,但一个方法中只能有一个可选参数,且可选参数要放在方法参数的最后面。它可以和固定参数组成方法重载,但可选参数的调用优先级是最低的。

17. 方法重写和方法重载有什么区别?

方法重写(Override)和方法重载(Overload)都是面向对象编程中,多态特性的不同体现,方法重写描述的是父类和子类的方法关系,而方法重载描述的是同一个类中多个同名方法的方法关系。除此之外方法重写和方法重载还有:Override 关键字、参数类型和参数个数、返回类型、抛出异常和权限控制符等不同点。

18. TCP/IP协议族各层功能:

1、应用层:确定进程间通信的性质,以满足用户的需要。
在应用层提供了多个常用协议。
–Telnet(Remote Login):远程登录
FTP(File Transfer Protocol):文件传输协议
SMTP(Simple Mail Transfer Protocol):简单邮件传输协议
POP3(Post Office Protocol 3):第三代邮局协议
HTTP(Hyper Text Transfer Protocol):超文本传输协议
NNTP(Network News Transfer Protocol):网络新闻传输协议
数据包传输的过程:应用层决定这次通信的应用类型和要进行什么工作,比如说HTTP、FTP、DNS、SMTP等等,通俗来讲,应用层决定这一次通信要干嘛。

2、传输层:其主要任务是向上一层提供可靠的端到端(End-to-End)服务,确保“报文”无差错、有序、不丢失、无重复地传输。它向高层屏蔽了下层数据通信的细节,是计算机通信体系结构中最关键的一层。含2个重要协议:
(1)TCP: TCP/IP体系中的传输层协议处于第4层传输层,负责数据的可靠传输(“三次握手”-建立连接、数据传送、关闭连接)。
(2)UDP: 和TCP相比,数据传输的可靠性低,适合少量的可靠性要求不高的数据传输。
3、网络层:主要功能是要完成网络中主机间“分组”(Packet)的传输
含有4个协议:
(1)网际协议IP
负责分组数据的传输,各个IP数据之间是相互独立的。
(2)互联网控制报文协议ICMP
IP层内特殊的报文机制,起控制作用,能发送报告差错或提供有关意外情况的信息。因为ICMP的数据报通过IP送出因此功能上属于网络的第3层。
(3)地址转换协议ARP
为了让差错或意外情况的信息能在物理网上传送到目的地,必须知道彼此的物理地址,这样就存在把互联网地址(是32位的IP地址来标识,是一种逻辑地址)转换为物理地址的要求,这就需要在网络层上有一组服务(协议)能将IP地址转换为相应的网络地址,这组协议就是APP.(可以把互联网地址看成是外识别地址和物理地址看成是内识别地址)
(4)反向地址转换协议RARP
RARP用于特殊情况,当只有自己的物理地址没有IP地址时,可通过RARP获得IP地址,如果遇到断电或重启状态下,开机后还必需再使用RARP重新获取IP地址。广泛用于获取无盘工作站的IP地址。
4、数据链路层:物理传输通道,可使用多种传输介质传输,可建立在任何物理传输网上。比如光纤、双绞线等。
5、 物理层:实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。透明传送就是说,传输的过程中,比特流是不变的,相当于实际电路是不存在的。

发送端数据从应用层往下走进行数据“封装”
接收端数据从链路层往上走进行数据“分片”

访问google.com,按下回车。

1.应用层准备好请求报文,通过DNS服务进行域名解析,得到google的ip地址,并将报文发到传输层。

2.传输层收到报文后,会将请求的数据包进行拆分,打包,并对每个包裹打上tag。在请求报文的基础上,加上一层TCP的首部信息,然后发往网络层。

3.到了网络层以后,IP协议就发挥了巨大的作用,IP协议中需要两个比较重要的信息,那就是ip地址和mac地址。ip已经在应用层通过dns解析出来了,那mac怎么办。。。真尴尬,然而这时ARP协议又冒了出来,它可以根据ip地址反向查询到目标主机的mac地址。好了,现在啥都有了,打包带走,把数据发到数据链路层

4.终于走到基础设施这里了,此时数据包就在一根根光纤中旋转跳跃的奔向目的地,当然,整个过程不一定是直达的,可能需要经过各种中转站,就跟坐火车转车一样的。

5.请求到达服务器后,先从数据链路层往上走,并验证消去以太网首部信息,在网络层消去IP首部,在传输层消去TCP首部,就像剥洋葱一样一层一层去皮,最后剩下的就请求报文。在应用层对请求做出处理之后,需要对请求返回一个响应。而整个响应的传输过程就和请求一样,一层一层的封装,响应到达客户端时再一层一层的消去首部,最后呈现响应的结果。
车转车一样的。

5.请求到达服务器后,先从数据链路层往上走,并验证消去以太网首部信息,在网络层消去IP首部,在传输层消去TCP首部,就像剥洋葱一样一层一层去皮,最后剩下的就请求报文。在应用层对请求做出处理之后,需要对请求返回一个响应。而整个响应的传输过程就和请求一样,一层一层的封装,响应到达客户端时再一层一层的消去首部,最后呈现响应的结果。

以上是关于复习背诵整理版的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯备赛[day02]3月16日|python|复习回顾|背诵枚举模版

计算机网络复习2---UDP数据报首部格式的问题

计算机网络复习2---UDP数据报首部格式的问题

整理装饰器的形成过程,背诵装饰器的固定格式

常见面试题整理:计算机网络篇,值得背诵收藏!

常见面试题整理:计算机网络篇,值得背诵收藏!