Java,循环还是递归?
开始比较前,先来了解下循环和递归的定义。
- 循环是一段在程序中只出现一次,但可能会连续执行多次的代码。循环中的代码会执行特定的次数(例如for),或者是执行到特定条件成立时结束循环(例如while),或者是针对某一集合中的所有项目都执行一次。
- 递归指在函数的定义中使用函数自身的方法,即一个函数不断调用自身的行为。
注意: 上面的循环定义不适用于所有情况,在一些函数编程语言(例如Haskell和Scheme)中会使用递归或不动点组合子来达到循环的效果。
开始比较前,先来了解下循环和递归的定义。
注意: 上面的循环定义不适用于所有情况,在一些函数编程语言(例如Haskell和Scheme)中会使用递归或不动点组合子来达到循环的效果。
在前面的Java虚拟机-内存布局一文中我们简单介绍了虚拟机栈:
本文将继续详细介绍虚拟机栈。
在HotSpot JVM(jvm 8以前)中,永久代中用于存放类和方法的元数据以及常量池,在Java中对应能通过反射获取到的数据,比如Class和Method。每当一个类初次被加载的时候,它的元数据都会放到永久代中。永久代是有大小限制的(启动时设置),因此如果加载的类太多,很有可能导致永久代内存溢出(java.lang.OutOfMemoryError: PermGen)。Java 8为了解决这一问题,彻底将永久代移除出了HotSpot JVM,将其原有的数据迁移至Java Heap或Metaspace1。
因为堆是全局共享的,因此在同一时间,可能有多个线程在堆上申请空间,那么,在并发场景中,如果两个线程先后把对象引用指向了同一个内存区域,那么对象的内存分配过程就必须进行同步控制。无论是使用哪种同步方案,都会影响内存的分配效率。
而Java对象的分配是Java中的高频操作,所有,人们想到另外一个办法(TLAB)来提升效率。
本文介绍和深入分析 Java 中 String 类的 intern 方法。
本文介绍 Java 虚拟机的内存布局。
OOM(OutOfMemoryError)是java工程师都会了解的一种异常,实质上,OOM并不是只有一种,一共有9种不同类型的OOM:
不同的原因触发不同类型的OOM,每种OOM类型的解决方案也不同。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
假设我们正在编写一个剪刀-布-石头游戏。我们可以使用三个任意整数(例如,0,1,2或88,128,168),三个字符串(“剪刀”,“布”,“石头”)来表示三个手势。主要缺点是我们需要检查程序中其他不可行的值(例如 3、“Rock"等)以确保正确性。
枚举是一种特殊类型,它为程序中的常量提供类型安全的实现。换句话说,我们可以声明一个类型的变量,它只接受预先定义的值。
Annotations是一种元数据,其作用在于提供程序本身以外的一些数据信息,也就是说Annotation他不会属于程序代码本身,不参与逻辑运算,故而不会对原程序代码的操作产生直接的影响。