自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 收藏
  • 关注

原创 毕业前学学git(1)

作为一名人类高质量程序员,是一定要会使用Git的,毕竟现在没几个公司不用Git了,本文是Git系列第一篇文章。Git是一款分布式版本控制系统,它允许每个程序员的电脑上都有一个版本库,这样即使没有网络也可以保证代码可以继续开发。除此之外,Git对于分支管理的支持也使它成为了优秀的版本管理系统。下载安装Git国内访问Git官网下载Git速度可能比较慢,因此推荐使用淘宝镜像下载。这里选择最新的v2.33.1.windows.1版本为例,进入该目录,点击Git-2.33.1-64-bit.exe进行下载。安

2021-10-17 21:39:38 143

原创 HashSet能同时存入引号包围和new出来的两个String对象吗

今天面试遇到一个很有意思的问题,先说一下这个问题的背景,面试的时候被问到有两个String对象,分别是String a="abc"和String b=new String(“abc”),问这两个对象同时存进HashSet吗?了解这个问题之前我们先看看HashSet的源码。HashSet源码解析话不多说,先看代码。public HashSet() { map = new HashMap<>();}首先是HashSet的构造方法,我们可以看到HashSet在构造方法里调用了一下

2021-07-28 21:42:07 457

原创 如何保证Kafka的可靠性、幂等性和有序性

之前的项目中由于用到了Kafka,所以在前一阵的实习面试中被问到了如何保证Kafka消息的有序性,所以本文对于Kafka这三个常被问到的问题进行总结归纳。可靠性对于消息队列而言,如果不能保证消息的可靠性可能会引起重大的生产事故。如果我们在超市里买完东西用手机进行支付,这条支付的消息存进了Kafka,但是因为某些原因导致消息丢失,商家没有收到钱,而我们却已经显示扣费,这是绝对不能容忍的,所以消息队列的可靠性至关重要。对于可靠性的保障,主要需要从生产者、Broker和消费者三个角度来进行实现,我们先简单

2021-06-15 23:02:32 1206 4

原创 图解堆排序

本文介绍一下常见的堆排序的原理及实现代码。简介堆排序是一种树形选择排序方法,要了解堆排序就不得不了解一下堆。简单的说,堆是一种完全二叉树,根据父子节点之间的大小关系的不同还可以细分为大顶堆和小顶堆。大顶堆是指任一节点的值都大于或等于其左右孩子的值,小顶堆是指任一节点的值都小于或等于其左右孩子的值。下图分别是大顶堆和小顶堆的结构。堆排序过程我们以大顶堆为例,演示一下堆排序过程。现在我们有一个待排序数组[2,7,4,3,1,9,5],初始状态是这样的:进行堆排序时,一般需要对节点从下到上,从右

2021-02-04 23:39:26 118

原创 动态代理了解一下?

介绍动态代理之前,先介绍一下什么是代理模式。当我们不想访问或者不能直接访问一个对象的时候,我们就需要用到代理模式。代理模式一般涉及到委托类与代理类两个概念,代理类用于为委托类处理一些事务,代理类对象常常与委托类对象相关联。代理模式可以分为静态代理和动态代理,静态代理需要为每一个委托类实现一个代理类,程序运行之前代理类的.class文件就已经存在了,而动态代理则是在运行时利用反射机制动态生成的。静态代理为了帮助大家看懂静态代理,我们举个简单的例子,小丽要买一只口红,但是这只口红在国内买不到,只有美国有得

2021-01-31 20:04:14 101

原创 HTTPS的原理是什么

HTTPS作为HTTP的升级版本,最大的特点就是加了一层SSL/TLS协议将原来明文的HTTP变成了更安全的加密版本。“裸奔”的HTTP在HTTPS还没有普及的日子里,HTTP一直将报文作为明文传输。对于黑客来说,明文传输的报文简直就是在“裸奔”!我们举个例子来说明一下:小明在某论坛上介绍自己是一名优秀的Java程序员,然后点下了浏览器上的发送按钮。正常情况下,当发送方使用HTTP向接收方发送一个消息时,是能够正确传输的,但是一旦有黑客进行了中间人攻击,事情的发展就可能超出我们的控制了,比如:

2021-01-28 23:39:00 344

原创 腾讯面试官:ThreadLocal会产生内存泄露的原因是什么

通常情况下,我们在内存中创建的变量是可被多个线程同时访问的,Java通过ThreadLocal实现了线程数据隔离的机制。ThreadLocal的用法既然前面提到了ThreadLocal存储的变量是线程隔离的,我们不妨就测试一下是否如我们所说。我们先创建两个线程,然后为这两个线程设置ThreadLocal变量。public class ThreadLocalDemo { private static ThreadLocal<String> threadLocal = new Thre

2020-11-08 20:38:55 318

原创 聊聊Java 8的Lambda表达式和函数式接口

Java 8作为Java的一个里程碑版本,提供了很多特性,本文主要介绍Java 8的Lambda表达式及函数式接口的内容。Lambda表达式Java引入Lambda表达式是为了简化代码,使代码更加简洁优雅。因此,一般使用Lambda表达式的代码也是比较简短的。那么Lambda表达式的代码可以写的多简洁呢?我们看看下面的几个例子。public void fun1() { Thread t = new Thread(() -> System.out.println("Hello")); t.s

2020-10-30 22:04:03 106

原创 小米面试官:说说Java的反射

反射是框架设计的灵魂。什么是反射反射是Java中的一种运行机制,与我们正常的代码思路完全不同,只有在运行时才会知道要操作的类是什么,能够完全访问类的属性和方法(包括private修饰的属性和方法)。反射的使用方式反射主要有四种使用方式,分别是知道类名直接根据类名className.class获取Class对象、根据类路径Class.forName("classPath")获取Class对象、根据对象实例通过getClass()方法获取Class对象以及通过类加载器使用loadClass("clas

2020-10-25 22:38:48 124

原创 字节面试官:synchronized能保证可见性吗

synchronized是Java并发中最常见的关键字之一,使用锁保证线程间同步,下面介绍synchronized相关内容。synchronized的三种用法synchronized主要有三种用法,分别是修饰普通方法、静态方法和代码块,下面用代码分别演示一下三种用法。修饰普通方法synchronized修饰普通方法作用于对象实例,进入同步代码前获得当前对象实例的锁。public class SynchronizedDemo { public static void main(String[

2020-10-21 20:33:05 7706 22

原创 拼多多面试官:说说数据库事务隔离级别

什么是数据库事务?数据库事务是一系列数据库操作的集合,数据库事务是数据库管理系统与文件系统的重要区别之一。从事务的四个特性谈起记得之前一个教数据库的老师说过,如果考研复试遇到了她,一定会问什么是ACID。一般学过数据库的同学基本都能说上一些。A指的是Atomicity,也就是原子性,原子性是指一个事务的所有操作要么全部做完,要么全部不做,不存在停在中间环节的情况。C指的是Consistency,也就是一致性,事务在执行前后,数据保持一致。例如小张给小王转了100块钱,那么小张的账户里少了100元,同

2020-10-15 20:43:57 199

原创 滴滴面试官:如何实现一个线程安全的单例模式

单例模式作为最常见的设计模式,有很多实现方式,今天介绍一下单例模式相关的内容。什么是单例模式从字面上理解,单例模式需要确保一个类只有一个对象。比如线程池、缓存、日志对象、打印机驱动对象、显卡驱动对象等,这些类的对象往往只需要一个实例就可以。如果一个类的对象需要被频繁创建,那么也会需要频繁GC,单例模式就可以解决这样的问题。单例模式的实现方式单例模式的实现方式非常多,但总体上可以分为两类:饿汉式和懒汉式。饿汉式是在类加载过程中就创建对象的方式,而懒汉式是需要使用时才会去创建对象的方式,这两种方式各有

2020-10-10 22:37:15 565

原创 美团面试官:说说Redis的缓存雪崩、缓存穿透和缓存击穿

缓存雪崩想象这样一个场景,当我们的Redis服务器中的缓存在某一段时间内大量失效或者Redis服务器瘫痪,用户的请求没有了缓存的拦截直接落在了数据库服务器上导致数据库服务器直接瘫痪,这就是我们今天要介绍的缓存雪崩。对于缓存雪崩常见的解决方法主要有以下几种:随机设置key的过期时间。由于缓存雪崩的产生原因是短时间内key大量失效,我们可以将key的过期时间进行随机设置,防止这种情况发生。如果是使用Redis集群部署,防止因为某个Redis服务器故障导致MySQL服务器瘫痪。采用服务降级

2020-10-09 20:26:42 154

原创 美团面试官:说说MySQL的索引

从本文开始,选取牛客网上大厂的面试题,整理出相关内容的知识点。什么是索引小学时我们经常用到的字典里有音节索引和部首目录,当我们查字典时,常常用音节索引和部首目录帮助我们提高查找汉字的速度。MySQL中同样也有索引,当MySQL需要查找数据时,索引也会提高检索数据的速度。索引的优缺点创建索引的一个最重要的原因是索引能够快速检索数据,极大减少了数据检索量。创建唯一索引能够保证数据表中数据的唯一性。当我们需要进行表连接操作时,索引加速表连接操作。进行分组或排序查询时,也能够加速查询。以上都是索引的优

2020-10-06 17:04:46 258 1

原创 Java内存模型

本文介绍一下Java多线程中比较重要的部分——Java内存模型,也就是我们说的JMM。很多人会把Java内存模型和Java内存区域弄混,Java内存区域又叫运行时数据区,我们之前在介绍Java虚拟机的文章中也已经讲过了,有兴趣的朋友可以翻一翻我之前的文章。但是这两个概念也并不是完全没有关系,我们先简单回顾一下Java内存区域的概念。Java内存区域主要分为线程共享的堆和方法区以及线程私有的程序计数器、虚拟机栈和本地方法栈。下图展示了Java内存模型的结构。主内存是多个线程共享的区域,对应上面的Jav

2020-09-13 22:28:21 55

原创 Java线程通信

线程通信是Java线程部分的重点,我们介绍一下常见的几种线程通信方式。线程锁与同步锁机制是线程通信的一种重要方式。当多个线程竞争某一个对象时,一旦某个线程获得对象就会立刻将其上锁,其他线程只能等待锁被释放才可以继续竞争。当我们需要进行多个线程间的同步时,经常利用线程锁完成。在下面的代码中,两个线程总会有一个执行先后顺序,但后执行的线程必须等待先执行的代码运行结束才可以执行。public class ObjectLock { private static Object obj = new Ob

2020-09-12 22:59:17 125

原创 电路交换、报文交换与分组交换

在计算机网络中有三种主要的数据交换方式,分别是电路交换、报文交换和分组交换。电路交换电路交换需要建立一条专用的数据通信路径,这条路径上可能包含许多中间节点。这条通信路径在整个通信过程中将被独占,直到通信结束才会释放资源。电路交换适合实时性要求较高的大量数据传输的情况。电路交换的优点主要包括以下几个方面:通信时延小。通信双方通过专用线路进行通信,数据可以直达。当数据传输量较大时,优点将十分显著。线路独占,没有冲突。实时性强。一旦通信线路建立,双方可以实时通信。电路交换的缺点主要包括以下几

2020-08-29 15:43:45 603

原创 不会吧不会吧,不会有人连线程池都没听说过吧

在上一篇文章中,我们介绍了创建线程的三种方法,但实际开发中如果需要频繁创建线程则不会使用前文说的那三种方法,而是选择使用线程池创建线程。使用线程池可以有效减少在手动创建线程过程中产生的开销,方便线程进行统一管理,提高系统资源利用率。在阿里巴巴Java开发手册中也强制规定了要使用线程资源必须通过线程池创建,不允许在应用中自行显式创建线程。下面介绍几种常见的线程池:newFixedThreadPool(固定大小的线程池)newCachedThreadPool(可缓存线程的线程池)newS

2020-08-09 10:33:57 109

原创 从Java创建线程入门多线程

本文是Java多线程系列的第一篇文章,关于线程的基础知识这里不多介绍,在我之前的文章中就已经介绍过了,不熟悉什么是线程的同学可以先去看一下。操作系统-进程与线程从最老生常谈的Java创建线程方式谈起稍微了解过一点Java多线程编程的朋友一定知道,Java创建线程的方式一般有三种:重写Thread类、实现Runnable和实现Callable接口,当然线程池也算是创建线程的一种方式,但那就扯远了,我们暂时从这三种方式聊起。重写Thread类public class CreateThreadTest

2020-08-04 21:01:22 116

原创 一道广联达秋招算法题

今天下午师兄在教研室群里发了一道热乎的广联达算法题,乍一看完全没有思路,于是实验室的小伙伴们饶有兴致地开始讨论起了这道题。先给大家看一下题目:题目描述有一种排序算法定义如下,该排序算法每次把一个元素提到序列的开头,例如2, 1, 3, 4,只需要一次操作把1提到序列起始位置就可以使得原序列从小到大有序。现在给你个乱序的1-n的排列,请你计算最少需要多少次操作才可以使得原序列从小到大有序。输入描述输入第一行包含两个正整数n,表示序列的长度。(1 <= n <= 100000)接下

2020-07-22 21:33:52 3154 6

原创 类加载器与双亲委派模型

之前说到类加载机制的相关原理,这次来谈谈类加载器以及双亲委派模型的概念。类加载器类加载器是Java进行类加载的重要部分,但它的作用又不仅仅局限于进行类加载这么简单。对于两个类,如果要比较它们是否“相等”,首先要确认这两个类来自通过一个类加载器,否则谈论这两个类是否相等将毫无意义。这里的“相等”,包括代表类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回结果。类加载器一般被分为三种:启动类加载器、扩展类加载器、应用程序类加载器。启

2020-07-21 20:11:54 85

原创 类加载机制

之前我们了解过class文件的存储格式,本文将介绍虚拟机如何加载class文件。类的生命周期一般来说,类的生命周期被划分为加载、验证、准备、解析、初始化、使用和卸载几个阶段,其中验证、准备和解析被统称为连接阶段。解析的过程顺序不确定,可能在初始化开始之后才开始,这常常出现在Java的晚绑定(动态绑定)中。类加载过程加载“加载”和“类加载”听起来十分相似,但是加载只是类加载的一个阶段。加载阶段的三个任务:通过类的全限定名获取类的二进制字节流。将二进制字节流转化成运行时数据结构。在内存中生

2020-07-20 19:18:05 108

原创 简单理解线段树

线段树是二叉树的一种,常常被用于求区间和与区间最大值等操作。场景假设想象一下这种场景,一个数组现在需要进行两种操作:对某区间内数字进行求和和更新数组中的某个元素。对于更新元素操作很容易看出它的时间复杂度是O(1)O(1)O(1),区间求和的时间复杂度是O(n)O(n)O(n)。通过下面这种方法可以降低区间元素求和的时间复杂度:设置另一个数组sum_table,这个数组每个位置的值存储table数组中当前位置及之前的所有元素之和。这样,我们可以把区间元素求和的时间复杂度降为O(1)O(1)O(1),

2020-07-14 18:07:41 116

原创 关于HashMap,你想知道的可能都有

在现在的互联网大厂面试中,HashMap几乎是必问的知识点。因此本文对HashMap进行系统性的总结,将HashMap常见的知识点都整理出来。前面铺垫了两篇红黑树的文章,终于进入这篇HashMap了。如果有不知道什么是红黑树的同学,先去看一下我前面讲红黑树的文章。本科数据结构课程的漏网之鱼-红黑树(上)本科数据结构课程的漏网之鱼-红黑树(下)简介相信大家之前或多或少都接触过HashMap,这是一种用来存放键值对的数据结构。它实现了Map接口,是最常用的Java容器之一。在JDK7及之前版本中,H

2020-07-10 23:09:27 150

原创 本科数据结构课程的漏网之鱼-红黑树(下)

title: 本科数据结构课程的漏网之鱼-红黑树(下)date: 2020-06-26 15:21:26tags:数据结构categories: 数据结构红黑树删除节点的操作与插入操作相比难度大大提高,以至很多博客讲的很不细致,但是为了内容的完整性,还是决定尝试写一下这篇红黑树删除节点的文章。在正式开始介绍红黑树的删除操作之前,我们先来介绍一下普通的二叉搜索树的删除节点操作。二叉搜索树删除节点二叉搜索树删除节点的基本情况有三种:当待删除节点是叶子节点时,直接删除这个节点即可。.

2020-06-30 19:31:08 122

原创 本科数据结构课程的漏网之鱼-红黑树(上)

在我大学的时候,就曾经从参加面试的学长那里知道红黑树这种数据结构,但是经过我的观察,绝大部分的本科数据结构课程里都没有这部分内容。本文将介绍这种被本科教学体系遗弃,但却常常被工作面试中提到的数据结构,并且为后面的HashMap的内容做铺垫。定义与性质首先需要明确的是,红黑树是一棵二叉搜索树,如果不了解二叉搜索树的朋友可以先去了解一下。这里想到了本人在研究生复试的时候被问到什么是二叉搜索树,一时竟然没想起来。下面是一棵典型的红黑树,我们可以看到这颗红黑树的确是一棵二叉搜索树。一般来说,红黑树具有

2020-06-24 19:08:04 232

原创 class类文件结构(这是一篇非常枯燥的文章)

我们知道,Java文件编译后会产生一个字节码文件(.class文件),本文介绍字节码文件的文件结构相关内容。前言Java诞生之初就宣称的“一次编译,处处运行”的性质一直是Java的一大特点,而Java实现这个特点的方式是将.java文件编译成.class文件,通过JVM屏蔽系统差异实现的。事实上,不仅是Java,其他的比如Kotlin、Groovy等语言也都可以通过编译成字节码文件运行在Java虚拟机上,而Java虚拟机也并不关心被编译成字节码文件之前是什么语言。类文件结构按照Java虚拟机规范

2020-06-21 22:26:28 139

原创 操作系统-处理机调度

本文介绍处理机调度相关的内容,主要涉及三级调度与调度算法等知识。三级调度作业从提交到完成一般需要经历三级调度:作业调度(高级调度)、内存调度(中级调度)和进程调度(低级调度),调度的频率依次递增。作业调度:作业调度一般是将一个作业从外存调入内存,为其分配内存、外设等资源,使其能够竞争处理机资源。对每个作业来说,每个作业一般只调入一次、调出一次。内存调度:内存调度是为了提高内存利用率和系统吞吐量,一般会将暂时无法运行的进程挂起,当具备运行条件且内存有空闲时,会将这些进程调回,挂在就绪队列上等

2020-06-18 15:46:08 507

原创 后浪-下一代垃圾收集器

随着Java虚拟机技术的不断发展,垃圾收集器也进行了大量迭代。前面介绍了7种经典的垃圾收集器,各有优缺点。Serial GC虽然是最古老的垃圾收集器,但由于设计简单,未必就是过时的收集器。CMS收集器由于自身有些算法缺陷,在JDK9中被标记为废弃,在最新版的JDK14中,CMS已经被彻底移除,进入了历史垃圾堆。我们可以发现G1收集器在JDK的各个版本中仍然在不断改进,并且成为了JDK9到JDK13的默认垃圾收集器。今天,我们要介绍的三种垃圾收集器算是垃圾收集器的新发展。Epsilon收集器我们看一下J

2020-06-16 19:45:14 166

原创 分治算法与归并排序

距离上次写快排算法的文章已经过去一个半月了,和本文要提到的归并排序算法类似,快排也是分治思想的一种典型应用,如果有不熟悉快速排序的同学可以翻阅我之前写过的的快速排序算法的文章。分治算法首先为大家介绍一下什么是分治,分治是将一个大问题分割成若干个和原来问题形式相同但规模更小的子问题,然后处理这些小问题,最终实现整个大问题的过程。额…上面说的概念确实很难理解,我们换一个生活中的场景来介绍一下什么是分治吧。小明手里有8枚硬币,其中有1枚是假币,已知假币比真币轻,现在我们有一架天平,那么我们该怎么找出假

2020-06-13 19:35:45 419

原创 操作系统-进程与线程

本文是进程管理中的第一部分,进程管理的内容是操作系统的核心,也是考试和面试的重点内容,本文将对进程与线程相关的内容进行梳理。进程的概念及组成对于进程的定义有很多,下面给出几种典型的定义:进程是程序的一次运行过程。进程是一个程序及其数据在处理机上顺序执行的活动。进程是进程实体运行的过程,是系统进行资源分配和调度的独立单位。进程主要由程序段、数据段和PCB(进程控制块)组成,其中PCB是进程存在的唯一标识。PCB一般包括程序ID(PID)、特征信息(表示是系统进程、用户进程还是内

2020-06-11 19:07:01 109

原创 你一定要了解的数据结构-并查集

今天要介绍一种非常重要的数据结构-并查集,这种数据结构常常被用于检测有环图的问题。问题引入给定一些节点,我们想要确定这些节点哪些属于同一个子集,该怎么做?现在假定这些节点之间通过边来连接,我们尝试用图片来表示一下。我们可以看到一共有6个节点,其中0、1、2、3这几个节点之间是连通的,4和5也是连通的。所以我们可以把上面6个节点分为两个集合,集合1包含0、1、2、3共4个节点,集合2包含4和5两个节点。通过图片表示很直观,但是,我们如何用代码实现呢?思路分析由上面的内容我们很容易知道,两个节点

2020-06-09 17:21:49 112

原创 深入理解Java虚拟机-垃圾收集器

在前面的文章中,我们提到了几种常见的垃圾收集算法,今天咱们来说一说商用Java虚拟机中经典的垃圾收集器。新生代收集器我们首先介绍三种新生代的垃圾收集器,分别是Serial收集器、ParNew收集器和Parallel Scavenge收集器。Serial收集器Serial收集器是最古老的垃圾收集器,曾经是新生代垃圾收集的唯一选择。这是一种单线程的垃圾收集器,采用标记-复制算法,在进行垃圾收集时,所有的工作线程都会停止等待垃圾收集完成,也就是所谓的“Stop the world”。对于服务器来说,可

2020-06-07 21:55:12 129

原创 谈谈Java容器-LinkedList

之前的文章中,我们谈到了ArrayList的源码分析,在今天的文章中,我们来看一种和ArrayList非常相似的Java容器——LinkedList。链表谈到LinkedList,我们就不得不谈到它的底层数据结构——链表。private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Nod

2020-06-05 18:41:21 199

原创 操作系统-概述

本文是操作系统系列文章的第一篇,后续将陆续更新操作系统相关的文章。什么是操作系统?计算机系统自底向上大致可分为四个部分:硬件、操作系统、应用程序和用户,我们这里比较关心位于硬件之上的操作系统。操作系统是控制和管理硬件和软件资源,组织调度计算机工作和资源分配,并为用户提供接口与环境的程序集合。操作系统的特征并发。并发是指多个事件在同一时间段内发生,当我们一边在QQ上聊天,一边听着音乐,此时操作系统同时处理着多个程序,我们可以说QQ和播放器是并发执行的。需要注意的是,与并发容易混淆的概念——并行,

2020-06-03 21:26:16 184

原创 深入理解Java虚拟机-垃圾收集算法

今天讨论的话题是垃圾收集算法,主要介绍一下标记-清除、标记-整理和标记-复制算法,还会基于这些算法讲一下分代垃圾收集算法。标记-清除算法首先讲一下标记-清除算法,这是最早出现也是最基础的一种算法。从名字就可以看出该算法分为两个过程:标记和清除。标记可以是标记存活对象,也可以是标记将要回收的对象,清除自然就是将要回收的对象的内存收回。我们通过一张图来了解标记-清除算法。上图中青色的部分是存活对象,棕色部分是可回收的对象,空白部分是未使用的内存。在一次垃圾回收以后,标记为可回收的对象均被清除。这种算法

2020-06-01 17:23:00 127

原创 谈谈Java容器-ArrayList

ArrayList是面试中常见的Java容器,也算是Java中比较简单的容器,我们今天就来讲讲ArrayList的源码和常见的面试点。概述ArrayList是一种底层基于数组实现的容器,并且能够实现随元素数量增加而进行动态扩容。与LinkedList相比,ArayList非常适合于查找元素,原因在于ArrayList底层实现原理是数组存储的内存在物理上是连续的,但增加和删除元素时,ArrayList比起LinkedList就比较慢了。此外,ArrayList时线程不安全的容器,要使用线程安全的集合容器

2020-05-28 18:54:20 159

原创 计算机网络-传输层

计算机网络的传输层是整个计算机网络体系中的关键层次,向上层的应用层提供服务,它是面向通信部分的最高层,也是用户功能中的最低层。传输层的功能提供应用进程间的通信。我们的计算机上运行着多个应用程序,而每个程序却能够准确与对应服务器进行通信,你知道这是为什么吗?我们需要引出一个概念:端口。什么是端口?参考文献2020王道计算机网络...

2020-05-27 09:22:22 680

原创 深入理解Java虚拟机-判断对象是否存活算法与对象引用

在之前的文章中我们谈到过Java内存区域的概念,我们知道Java中的对象一般存放在堆中,但是总不能让这些对象一直占着内存空间,这些对象最终都会被回收并释放内存,那么我们如何判断对象已经成为垃圾呢?这篇文章会提出两种算法解决这个问题。另外,本文还要谈一谈对象引用相关的知识,这在面试中也是经常被问到的问题。判断对象是否存活算法引用计数算法引用计数算法的原理比较简单,在对象中添加一个引用计数器,当有一个引用指向一个对象时,这个对象的引用计数器会加1,当引用不再指向对象时,引用计数器便减1。当引用计数器的值

2020-05-25 13:40:56 219

原创 深入理解Java虚拟机-运行时数据区

在Java虚拟机的概念中,运行时数据区又被称为Java内存区域。主要由线程私有的程序计数器、虚拟机栈和本地方法栈以及线程共享的堆和方法区组成。程序计数器程序计数器在Java内存中占据的空间比较小,是当前线程正在执行的字节码的行号指示器。字节码指令执行的过程中,分支、循环、跳转、异常处理、线程恢复等都需要通过程序计数器来完成。在某一个时刻,一个内核只会执行一个线程中的指令,因此需要程序计数器来确保多线程切换后回复到某一线程能够继续之前的指令向后执行。因此,这也就决定了程序计数器必须是线程私有的。当

2020-05-21 18:04:40 101

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除