0%

深拷贝和浅拷贝的区别

  • 浅拷贝:对于对象内的引用数据类型,浅拷贝会直接复制其对象的地址,也就是拷贝对象和原对象公用一个内部对象。
  • 深拷贝:会完全复制整个对象,包括对象所包含的内部对象,都是新创建的对象。

浅拷贝

浅拷贝的示例代码如下,我们这里实现了 Cloneable 接口,并重写了 clone() 方法。

clone() 方法的实现很简单,直接调用的是父类 Objectclone() 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Address implements Cloneable{
private String name;
// 省略构造函数、Getter&Setter方法
@Override
public Address clone() {
try {
return (Address) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

public class Person implements Cloneable {
private Address address;
// 省略构造函数、Getter&Setter方法
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}

测试:

1
2
3
4
Person person1 = new Person(new Address("武汉"));
Person person1Copy = person1.clone();
// true
System.out.println(person1.getAddress() == person1Copy.getAddress());

从输出结构就可以看出, person1 的克隆对象和 person1 使用的仍然是同一个 Address 对象。

阅读全文 »

两者的区别

基本类型 vs 包装类型

  • 用途:除了定义一些常量和局部变量之外,我们在其他地方比如方法参数、对象属性中很少会使用基本类型来定义变量。并且,包装类型可用于泛型,而基本类型不可以。
  • 存储方式:基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有对象实例都存在于堆中。
  • 占用空间:相比于包装类型(对象类型), 基本数据类型占用的空间往往非常小。
  • 默认值:成员变量包装类型不赋值就是 null ,而基本类型有默认值且不是 null
  • 比较方式:对于基本数据类型来说,== 比较的是值。对于包装数据类型来说,== 比较的是对象的内存地址。所有整型包装类对象之间值的比较,全部使用 equals() 方法。

为什么说是几乎所有对象实例都存在于堆中呢? 这是因为 HotSpot 虚拟机引入了 JIT 优化之后,会对对象进行逃逸分析,如果发现某一个对象并没有逃逸到方法外部,那么就可能通过标量替换来实现栈上分配,而避免堆上分配内存

⚠️ 注意:基本数据类型存放在栈中是一个常见的误区! 基本数据类型的成员变量如果没有被 static 修饰的话(不建议这么使用,应该要使用基本数据类型对应的包装类型),就存放在堆中。

1
2
3
class BasicTypeVar{
private int x;
}
阅读全文 »

在ubuntu或debian下安装zerotier,并代理局域网所有流量

  1. 首先去zerotier官网按照其安装命令安装zerotier

    1
    curl -s https://install.zerotier.com | bash
  2. 加入zerotier虚拟局域网

    1
    zerotier-cli join <network id>
  3. 开启流量转发

    临时生效:

    1
    echo "1" >/proc/sys/net/ipv4/ip_forward

    永久生效:

    修改 /etc/sysctl.conf 文件,将 net.ipv4.ip_forward=1 注释去掉,并运行下列命令生效

    1
    sysctl -p
阅读全文 »

下载

1. 进入Redis官网

进入下载页面,找到下载按钮,右键复制下载链接

2. 下载Redis

1
wget https://github.com/redis/redis/archive/7.2.0.tar.gz -O redis.tar.gz

3. 解压压缩包

解压压缩包到opt目录

1
tar -xvf redis.tar.gz -C /opt
阅读全文 »

ubuntu server 安装时默认使用lvm进行磁盘管理,只使用磁盘空间的一半,如果要把另一半也用起来,需要如下处理:

1
2
3
4
# 利用以下方式将空间全部分给这个盘
sudo lvextend -l +100%FREE /dev/mapper/ubuntu–vg-ubuntu–lv
# 重新计算磁盘大小
sudo resize2fs /dev/mapper/ubuntu–vg-ubuntu–lv

其中/dev/mapper/ubuntu–vg-ubuntu–lv可以通过’df -h’查看

基本认识

TCP头格式

TCP 头格式

序列号:在建立连接时,由计算机生成的随机数作为初始值,通过SYN包传给接收端主机,每发送一次数据,就累加一次该「数据字节数」的大小,来解决网络包乱序的问题

确认应答号:指下次期望收到的数据序列号,发送端收到这个确认应答后可以认为在这个序号之前的数据都已经被正常接收,用来解决丢包问题

控制位

  • ACK:为1时,「确认应答」的字段变为有效,TCP规定除了最初建立连接时的SYN 包之外该位必须为1。
  • RST:为1时,表示TCP连接中出现异常,必须强制断开连接。
  • SYN:为1时,表示希望建立连接,并在其「序列号」的字段就行序列号初始值的设定。
  • FIN :为1时,表示之后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间相互交换FIN位位1的TCP段。
阅读全文 »

SSL/TLS协商基本流程

  1. 客户端向服务器索要并验证服务器公钥
  2. 双方协商产生「对话秘钥」
  3. 双方使用「会话秘钥」进行加密通信

前面两步是SSL/TLS的建立过程,也就是TLS握手阶段,SSL/TLS「握手阶段」设计的四次通信,如下图所示:

HTTPS 连接建立过程
阅读全文 »

HTTP基本概念

HTTP是什么

HTTP全称为超文本传输协议(HyperText Transfer Protocol)。

  1. 超文本

    如HTTP名字中所说的,其传输的是超文本,超文本从字面上理解是超过了普通的文本文字,也就是还包括文字以外的内容,如图片、视频、超链接等,超文本 就是这些内容的混合体。

    HTML(Hyper Text Markup Language)就是最常见的超文本了,它本身只是纯文字的文件,但是内部用很多标签定义了图片、视频的链接,经过浏览器解释之后,呈现给我们的就是一个有文字、有图片和视频的网页了。

  2. 传输

    所谓“传输”,就是将东西从一个地方搬到另一个地方。

    HTTP协议是一个双向协议。

    我们上网的时候,浏览器是请求方A,访问的网站就是应答方B,双方约定使用HTTP协议来通信,于是浏览器把请求数据发送给网站,网站再把一些数据返回给浏览器,最后由浏览器渲染出来显示在屏幕上。

    请求-应答
    阅读全文 »

TCP/IP网络模型适用于不同设备上进程间的通信,共分为四层分,从上到下分别是应用层、传输层、网络层、网络接口层

应用层(Application Layer)

应用层是最上层的,我们能直接接触到的层,我们日常所使用的软件都是在应用层上实现的。

应用层不关心数据是如何传输的,就和我们寄快递的时候只需要把包裹交给快递员,我们不关心包裹是如何运输的。

协议

应用层的协议包括HTTP、FTP、Telnet、DNS、SMTP等。

传输层(Transport Layer)

传输层是为应用层提供网络支持的,在传输层有两个传输协议,分别是TCP和UDP。

TCP(Transmission Control Protocol)

TCP的全称是传输控制协议,大部分应用传输层协议使用的都是TCP,TCP为了保证数据能够可靠的传输到目的地,有流量控制、超时重传、拥塞控制等特性。

UDP(User Datagram Protocol)

UDP全称是用户报文协议,UDP相对TCP来说就很简单,只负责发送数据包,至于数据包能否正常抵达目的地,UDP不能保证;但是换一个角度来说,UDP少干了这么多,那他的实时性相对TCP来说更好,传输效率也更高。

通常来说一台设备上会运行多个应用进程,为了区分数据要发送的具体进程,传输层中需要指定端口号来区分不同的进程和应用。

阅读全文 »