[二叉查找树](https://zh.wikipedia.org/wiki/% E4% BA%8C% E5%85%83% E6%90%9C% E5% B0%8B% E6% A8% B9) 也称为排序二叉树或有序二叉树。将二叉查找树中序遍历就能得到一个有序数组。所以,有序数组转换成二叉查找树是中序遍历的逆操作。将数组中下标为中数的元素作为根节点,利用递归实现转换。以下是实现代码:
用数组实现 Stack
在一些面试题中,常常出现用数组实现 Stack,主要实现它的 push()/push()/pop() 方法。也可以用容器(List)和链表实现,可以看 这篇博文。以下是使用数组实现 Stack:
逐行分析 HashMap 的 put() 方法源码
HashMap 是底层结构是数组 + 链表,数组是存放 Node(Entry)的数组 Entry[],链表是 Node 组成的链表,充分利用了 Node 的特性。链表的头结点存放在数组中。
put 方法的大致思路
- 调用 hash(key) 方法,根据 key 对象的 hashCode 计算出 kay 的 hash,根据 hash 计算出其在 tab 数组中的 index,将键和值放入 Node(Entry) 中;
- 如果 index 位置的 Node 为空,称为没碰撞,直接 Node 放入数组中;
- 如果碰撞(index 位置存在 Node),先跟头结点比较,key 不相等时,循环链表比较,如果 key 已经存在,替换 old value,否则将 Node 链接到链表最后。
- 如果碰撞导致链表的长度大于等于 7,将链表的结构转换为红黑树。
- 如果 bucket 存放的 current capacity(当前容量)超过容量的 load factor(0.75),就 resize,容量扩大为两倍。
Java 的参数传递
String 的两种实例化方式
String 的两种实例化方式
隐式实例化:直接赋值
public class Demo { |
true |
Object 的常用方法
所有的类都默认继承 Object 这个基类。
基本数据类型不是类,所以不继承,但它们的封装类继承,使用基本数据类型时会自动封箱为其封装类。equals()、hashCode()、getClass() 和 toString() 是 Object 常用的方法。
equals(Object obj) 方法
API,源码:
public boolean equals(Object obj) { |
==
用于比较两个数值是否相等。
==
比较基本数据类型时,用来判断两个基本数据类型数值是否相等;引用变量存放的是对象在堆中的地址,==
比较两个引用时,比较两个地址的数值是否相等,即判断两个引用是否指向同一个对象。
int a = 1; |
所以 equals 方法用于判断两个对象是否在意义上相等,即这两个对象是否是同一个对象。
d.equals(c); // false |
String 重写了 equals 方法,比较两个 String(匿名)对象是否带有相同的字节组合:
public boolean equals(Object anObject) { |
算法:数据结构之反转字符串
反转字符串
题目描述:将字符串 "##We###Are###Family!###"
反转为 "###!ylimaF###erA###eW##"
。
分析与解答:这题我们的解答方法有很多,常见的方法是使用数组,下面来介绍用数据结构中的 Stack(栈)来完成反转。
Stack 的特点是 FILO(First In,Last Out)— 先进后出。此特点用于将字符串反转非常合适,以下是代码实现:
import java.util.Stack; |
从字节码(ByteCode)角度理解 String 的连接
首先来看一道题。
题目描述
问下面两种赋值方式有何区别?
public class Demo { |
分析与解答
从表面其实看不出什么,我们可以通过 Class 文件反编译成的字节码(Byte Code)来分析。
如果你在使用 IDEA,请先在 IDEA 中安装 ASMified Bytecode Outline 插件,点击 安装详细教程,如果是其他集成环境,请自行 Google 安装插件教程。
Java 虚拟机运行时数据区域
JVM 对于是每个 Java 程序员掌握一定 Java 基础后,都需要学习的。因为很多代码问题,只能了解了 JVM 底层原理后才能解决。大多数 Java 后端开发者都知道堆(Heap)和栈(Stack)的概念,却没有真正理解其原理。推荐 《深入理解 Java 虚拟机(第二版)》— 周志明著 学习 JVM。
进程和线程
学习 JVM 前要了解进程和线程的概念。
以下是一个类比,来自 阮一峰 — 进程与线程的一个简单解释。
- 计算机的 CPU 是像一座工厂,时刻在运行。
- 因工厂电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个 CPU 一次只能运行一个任务。
- 进程就好比工厂的车间,它代表 CPU 所能处理的单个任务。任一时刻,CPU 总是运行一个进程,其他进程处于非运行状态。
- 一个车间里,可以有很多工人。他们协同完成一个任务。
- 线程就好比车间里的工人。一个进程可以包括多个线程。
我奶奶人很胖,但心很美
我奶奶生在一个重男轻女的家庭中,她小时候被她的亲生母亲虐待,让她的右脚落下了隐疾。但奶奶不以此为芥蒂,始终性格开朗,特别爱笑。
奶奶人很胖,饭量大,脚大,笑起来声音也大。我听我爷爷说,他娶奶奶的时候是 27 岁,奶奶是 20 岁。爷爷那时候是铁匠,给远近乡邻铸造各种生活、农耕工具。奶奶料理家务,兼顾农田,两人虽然日子清苦,但尚能温饱。