02 集合底层结构
Java 容器一、概览容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 Collection单列集合 1. Set TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 LinkedHashSet:具有 HashSet 的查找效率,并且内部使用双向链表维护元素的插入顺序。 2. List ArrayList:基于动态数组实现,支持随机访问。 Vector:和 ArrayList 类似,但它是线程安全的。 LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。...
06 JUC并发容器
2 J.U.C -并发容器并发集合是指使用了最新并发能力的集合,在JUC包下。而同步集合指之前用同步锁实现的集合。 其对应的基础集合类的接口并没有发生太大变化,主要是针对并发场景进行优化,使用各种方式保证并发集合的安全性。 1 CopyOnWriteCopyOnWriteArrayListCopyOnWriteArrayList在写的时候会复制一个副本,对副本写,写完用副本替换原值,读的时候不需要同步,适用于写少读多的场合。 CopyOnWriteArraySet基于CopyOnWriteArrayList来实现的,只是在不允许存在重复的对象这个特性上遍历处理了一下。 读写分离写操作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,互不影响。 写操作需要加锁,防止并发写入时导致写入数据丢失。 写操作结束之后需要把原始数组指向新的复制数组。 123456789101112131415161718public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); ...
30 问题排查和性能优化指南
30+ 是该主题下的文章和总结。
面试说明
评测 如何评测效果。有哪些指标,性能提升也要有指标,用哪些业务负载。要具体到用什么负载、用什么指标衡量,这个指标为什么能衡量,评测方案是如何设计的。 不要说你认为好的指标,而是经过筛选的最能反应负载的指标。 如何跟调度器集成 list watch的实现方案 代码没看原理应该清楚可以讲一讲。
02 Java内存区域与内存溢出
2 Java内存区域与内存溢出异常2.1 概述虚拟机提供的最大的能力:自动内存管理。不再需要用户为每一个操作去写配对的delete、free代码,不需要手动管理内存的申请和释放,不容易出现内存泄漏的问题。这也符合并奠定了Java的操作哲学,通过各种各样的运行时接管一些常规的传统语言的操作。 2.2 运行时内存区域 程序计数器:当前线程所执行的字节码的行号指示器。多线程通过线程切换、分配处理器执行,每条线程都需要一个独立的程序计数器,各线程之间计数器互不影响、独立存储,是线程私有的内存。 Java虚拟机栈:Java方法执行的内存模型。每个方法执行的时候,创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。线程私有的内存。局部变量表存放了编译器可知的各种Java虚拟机基本变量类型、对象引用、返回地址类型,局部变量表所需要的空间是在编译期间分配完成的,运行过程中,当进入一个方法时,这个方法需要再栈帧中分配多大的局部变量空间是完全确定的。 本地方法栈:本地方法的栈帧。也是线程私有的内存。 堆:用于存放对象实例。被所有线程共享的一块内存区域,是垃圾收集器管理的内存区域。可...
03 Java垃圾收集和内存分配
3 垃圾收集器与内存分配策略 https://github.com/TangBean/understanding-the-jvm/blob/master/Ch1-Java%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6/02-%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86(GC).md 3.1 概述垃圾收集器的概念定义:在应用程序运行时,应用程序会创建许多对象,每个对象都有其生命周期。 在内存中,被其他对象引用的对象被称为live objects 。 不再由任何活动对象引用的对象被视为dead objects ,并称为garbage 。 查找和释放(也称为回收)这些对象使用的空间的过程称为garbage collection 。 范围:在Java内存运行区域中,私有内存(程序计数器、虚拟机栈、本地方法栈)都是随着线程创建或者销毁。栈中的栈帧随着方法的进入和退出进行入栈和出栈操作。每一个栈帧多少内存基本上是在类结构确定下来的时候就是已经知道地,会由及时编译器进行优化。这里讨论的垃圾回收机制,主要...
01 数据类型和变量
如何速通各种语言 一个语言应该包括以下几个部分 核心语法:数据类型和变量、控制流程、数据结构、函数、面向对象、其他 内置工具库:数学、日期、字符串、系统、序列化等 内置高阶库:文件IO、网络编程、并发编程 生态库:Web框架、客户端、分布式 编译原理:虚拟机 安装 安装rustup,用来管理rust版本的工具。 1$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh 安装更新rust 1rustup update 查看安装的版本 1rustc --version 优势分析 所有权\move语法\借用引用 表达式与语句概念 变量变量和常量 默认情况下是不可变的。这也是rust的设计哲学之一:通过默认的方式避免掉了很多种可能会出现的错误,非常好的设计思路,将最稳定、最安全的方式作为...
02 控制流程
if表达式基本语句if 表达式允许根据条件执行不同的代码分支。你提供一个条件并表示 “如果条件满足,运行这段代码;如果条件不满足,不运行这段代码。” 123456789fn main() { let number = 3; if number < 5 { println!("condition was true"); } else { println!("condition was false"); }} elseif多重条件可以将 if 和 else 组成的 else if 表达式来实现多重条件。例如: 12345678910111213fn main() { let number = 6; if number % 4 == 0 { println!("number is divisible by 4"); } else if number...
03 数据结构
结构体结构体定义结构体和我们在“元组类型”章节论过的元组类似。和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。 定义结构体,需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field)。例如,示例 5-1 展示了一个存储用户账号信息的结构体: 12345678struct User { active: bool, username: String, email: String, sign_in_count: u64,}fn main() {} 结构体使用通过为每个字段指定具体值的方式来创建该结构体的实例。创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键-值对的形式提供字段,其中 key 是字段的名字,value 是需要存储在字段中的数...
04 函数
函数定义函数定义Rust 代码中的函数和变量名使用下划线命名法(snake case,直译为蛇形命名法)规范风格。在下划线命名法中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序: 123456789fn main() { println!("Hello, world!"); another_function();}fn another_function() { println!("Another function.");} 函数参数函数也可以被定义为拥有参数(parameter),参数是特殊变量,是函数签名的一部分。当函数拥有参数(形参)时,可以为这些参数提供具体的值(实参)。技术上讲,这些具体值被称为实参(argument),但是在日常交流中,人们倾向于不区分使用 parameter 和 argument 来表示函数定义中的变量或调用函数时传入的具体值。 1234567fn main() { another_function(5);...









