finally 块用来执行即使有异常也能执行的代码,常用于出现异常时关闭流,或者释放锁。finally 总会执行。
关闭流的栗子:
InputStream is = null; |
释放锁的栗子:
// java.util.concurrent.ArrayBlockingQueue.java |
这是副标题
finally 块用来执行即使有异常也能执行的代码,常用于出现异常时关闭流,或者释放锁。finally 总会执行。
关闭流的栗子:
InputStream is = null; |
释放锁的栗子:
// java.util.concurrent.ArrayBlockingQueue.java |
[二叉查找树](https://zh.wikipedia.org/wiki/% E4% BA%8C% E5%85%83% E6%90%9C% E5% B0%8B% E6% A8% B9) 也称为排序二叉树或有序二叉树。将二叉查找树中序遍历就能得到一个有序数组。所以,有序数组转换成二叉查找树是中序遍历的逆操作。将数组中下标为中数的元素作为根节点,利用递归实现转换。以下是实现代码:
在一些面试题中,常常出现用数组实现 Stack,主要实现它的 push()/push()/pop() 方法。也可以用容器(List)和链表实现,可以看 这篇博文。以下是使用数组实现 Stack:
HashMap 是底层结构是数组 + 链表,数组是存放 Node(Entry)的数组 Entry[],链表是 Node 组成的链表,充分利用了 Node 的特性。链表的头结点存放在数组中。
public class Demo { |
true |
所有的类都默认继承 Object 这个基类。
基本数据类型不是类,所以不继承,但它们的封装类继承,使用基本数据类型时会自动封箱为其封装类。equals()、hashCode()、getClass() 和 toString() 是 Object 常用的方法。
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; |
首先来看一道题。
问下面两种赋值方式有何区别?
public class Demo { |
从表面其实看不出什么,我们可以通过 Class 文件反编译成的字节码(Byte Code)来分析。
如果你在使用 IDEA,请先在 IDEA 中安装 ASMified Bytecode Outline 插件,点击 安装详细教程,如果是其他集成环境,请自行 Google 安装插件教程。
JVM 对于是每个 Java 程序员掌握一定 Java 基础后,都需要学习的。因为很多代码问题,只能了解了 JVM 底层原理后才能解决。大多数 Java 后端开发者都知道堆(Heap)和栈(Stack)的概念,却没有真正理解其原理。推荐 《深入理解 Java 虚拟机(第二版)》— 周志明著 学习 JVM。
学习 JVM 前要了解进程和线程的概念。
以下是一个类比,来自 阮一峰 — 进程与线程的一个简单解释。