Java基础
JVM、JRE 和 JDK 的关系
- JRE是Java Runtime Environment(Java运行时环境)的简称, 包括JVM虚拟机和Java基础类库, 为编译好的Java程序(.class字节码文件)提供运行环境.
- JDK是Java Development Kit(Java开发工具包)的简称, 不仅包括JRE, 而且包括编译Java源文件(.java)所需的编译器和各种调试分析的工具.
- JRE提供给想运行Java程序的用户使用; JDK提供给Java开发者使用
为什么 Java 代码可以实现一次编写, 到处运行?
- JVM(Java虚拟机)是Java跨平台的关键, JVM在Java应用程序和操作系统之间采用适配器模式, 屏蔽了操作系统的异构性
- 在Java程序运行前, 通过java编译器将源代码文件(xxx.java)编译成字节码文件(.class)
- 在Java程序运行时, 通过jvm将字节码文件翻译成对应操作系统平台的机器码文件
== 和 equals() 的区别
==
: 基本数据类型比较值, 引用数据类型比较地址(实际上还是比较引用变量的值是否相同)
equals()
: 由于所有的类都继承自Object, 所以默认情况下equals()和==相同, 只有当重写equals()方法时, 二者才产生区别. 例如String重写的equals()为字符串比较
public static void main(String[] args) {
String s1 = "hello world";//字符串常量池
String s2 = "hello world";//字符串常量池
String s3 = new String("hello world");//堆空间对象
System.out.println("s1.equals(s2) = " + s1.equals(s2));//true
System.out.println("(s1==s2) = " + (s1 == s2));//true
System.out.println("s1.equals(s3) = " + s1.equals(s3));//true
System.out.println("(s1==s3) = " + (s1 == s3));//false
}

为什么重写equals()方法的同时要重写hashCode()方法
- Java对象默认情况下比较的是两个对象的地址值是否相等,而Object类中的equals()方法的实现也是简单地使用
==
来实现。但很多时候我们实际想要比较的是两个对象的内容在逻辑层面是否相等,所以我们需要重写equals()方法。(equals()方法的存在是为了体现对象逻辑层面的一个相等) - 例如,Java中的String类中重写的equals()方法就是比较两个字符串的内容是否完全相同。对于任意一个对象,如果都去调用equals()对象来判断两个字符串是否相等,那么遍历整个字符串,时间复杂度是O(n)。所以引入hashCode作为缓存,重写hashCode()方法是为了让逻辑层面上相等的两个对象(equals()方法判断返回true的两个对象)拥有相同的hashCode。这样,在判断的时候,根据逆否命题,hashCode值不同,则equals()返回false,从而实现加速判断两个对象是否相等。如果重写equals()方法而没有重写hashCode()方法,那么即使两个对象的hashCode不相同,也不能推断出equals()方法返回false,从而失去了hashCode作为缓存而存在的意义。(hashCode存在的意义是为了作为equals()方法的缓存,hashCode()方法应该按照equals()方法的实现逻辑进行重写)
普通for循环和增强for循环的比较
差异 | 普通for循环 | 增强for循环 |
---|---|---|
适用 | 底层数组 | 底层链表 |
局限 | 用于链表的遍历时可能导致系统崩溃 | item不能是基本数据类型, 除了static修饰的类成员变量 |
原因 | 基本数据类型在赋值操作时, 是将内容进行复制,而不是将引用进行复制 |
计算机网络
TCP为什么建立连接需要三次握手, 释放连接需要四次挥手?
TCP三次握手
TCP连接的目的是在不可靠传输的信道上建立可靠的传输.
对于客户端发送过来的一个连接请求报文段, 由于链路的不可靠, 所以服务端无法分辨其真实性: 是此时此刻客户端想建立连接? 还是由于网络延迟接收到的以前的请求报文? 但无论其真实性, 服务端都会返回一个允许连接的响应. 如果客户端此时对服务端返回的响应做出了反应, 则服务端可以判断确实是客户端想要建立连接. 而如果客户端没有反应, 那么说明可能是以前发送的失效的报文. (但也有可能是网络问题导致的服务端的响应丢失了吧, 这种情况应该不会超时重传, 所以才有重试机制吗?)
TCP四次挥手