Java作业

常年与Java打交道,总会遇到各种问题,都一一记录下来了。
为督促自己的学习,也为了与大家分享,写下本文,并持续更新。


Object中的方法

  • private static native void registerNatives(),本地方法,在Object类初始化的时候注册其他native方法 hashCodewaitnotifynotifyAllclone,源码位于Object.c
  • public final native Class<?> getClass(),从oop_metadata中读取_klass_compressed_klass
  • public native int hashCode(),返回对象的identity hash code。具体实现还和锁有关:

    • 当一个对象已经计算过identity hash code,它就无法进入偏向锁状态

    • 当一个对象当前正处于偏向锁状态,并且需要计算其identity hash code的话,则它的偏向锁会被撤销,并且锁会膨胀为重量锁;

    • 重量锁的实现中,ObjectMonitor类里有字段可以记录非加锁状态下的mark word,其中可以存储identity hash code的值。或者简单说就是重量锁可以存下identity hash code。

    来源:RednaxelaFX在知乎“当Java处在偏向锁、重量级锁状态时,hashcode值存储在哪?”下的回答

  • public boolean equals(Object obj),需要满足自反性、对称性、传递性、一致性。

  • protected native Object clone() throws CloneNotSupportedException,由虚拟机实现的对象拷贝方法。对于没有实现java.lang.Cloneable接口的对象,JVM有能力拷贝,但是拒绝拷贝。拷贝时先开辟一块相等的内存空间,然后以jlong(8字节)为原子,从头按顺序拷贝内容。期间原始对象的内容可能改变,因此clone()不是线程安全的,需要自行加锁。但是因为对象内部的所有数据都是以8字节对齐的,所以不会出现只拷贝了半个引用或者只拷贝了半个double的情况。
  • public String toString(),人可读的描述信息。
  • public final native void notify()
    public final native void notifyAll()
    public final native void wait() throws InterruptedException,调用这三个方法的位置都必须同步,并且执行时都会导致偏向锁膨胀为重量级锁。
  • protected void finalize() throws Throwable,实现了这个方法的对象会在初始化时被包装成java.lang.ref.Finalizer塞到Finalizer维护的链表unfinalized中。通过实现这个方法,对象可以在被垃圾回收之前做些事情,比如可以发送一些通知,或者避免自己被垃圾回收,且这个机会最多只有一次,因为这个对象不可能再次进入链表中了。其实finalize()的实现和软、弱、虚引用有些相似,都是java.lang.ref.Reference的子类,通过引用队列实现的。

虚引用实践

整理为博客《弱引用、虚引用、finalize实践,及它们的顺序》


WeakHashMap的实现

WeakHashMapEntry继承自WeakReference,且其referent为entry的key,也就意味着,只要一个entry的key被回收,这个entry就被加入到引用队列中。在WeakHashMapget()put()forEach()size()remove()等诸多方法调用的时候都会调用到一个expungeStaleEntries()方法,这个方法就会遍历引用队列来清理无用的entry。


try-return-finally-return

// 返回值是0
private static int foo1() {
  int i = 0;
  try {
    return i; // 生效
  } finally {
    i++;
  }
}

// 返回值是1
private static int foo2() {
  int i = 0;
  try {
    return i;
  } finally {
    return ++i; // 生效
  }
}

// 返回值是1
private static int foo3() {
  try {
    return 0;
  } finally {
    return 1; // 生效
  }
}

总结:finally中的赋值不会改变try中已经计算好的返回值,但是finally中的return会截胡。


编译器常量

final字面量在编译时会被替换为常量。包括final的类属性、final的本地变量。


Arrays.asList(array)的返回值和数组绑定且不可修改?

这个竟然是真的。。。。

Arrays.asList()的返回值不是java.util.ArrayList,而是java.util.Arrays$ArrayList,它没有重写任何定义在AbstractList中的新增和删除有关的方法,因此尝试新增或删除时会调用到AbstractList中的版本,直接抛出异常。

原地排序、修改以及读取,这些底层数组支持的操作都是支持的。


接口和抽象类的区别

Java8和Java9对接口的改变太大了,最近时常会疑惑,为什么接口和抽象类越来越像了。。

其实还是很多“底线”没有突破的,比如单继承和多实现。

下面整理一下,接口简写为I,抽象类简写为A

  • A既可以声明abstract方法,又可以定义任意可见性的带方法体的方法,I只能声明public abstract方法
    • Java8开始I可以声明default方法,也可以声明static方法
    • 预计Java9开始I可以声明private方法
  • A可以声明变量,I只能定义常量
  • A可以extends A,也可以implements II只能extends I
  • 一个类只能extends一个A,但可以implements多个I
  • AconstructorI没有

顺序读写/随机读写 RandomAccessFile

常规使用ReaderWriterInputStreamOutputStream读写文件都是顺序读写,进行随机读写需要使用java.io.RandomAccessFile


20170513 最后更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用来完成大作业的。文档内容: 1 Java技术体系 1.1 Java语言 1.2 Java平台 1.3 Java应用领域 2 Java语言的技术特点 2.1 1 2.2 2 2.3 3 3 Java语言与C++的异同分析总结。 4 选用C和java语言时编程算法程序有什么不同,有什么优势和劣势。 5 自己编程学习的级别和状态。以及自己以后的编程学习的计划和想法。 6 下面3道题目中选一道,给出算法分析和程序。 1)“黄金分割数”在我们的生活中很常见,但是在不同的应用领域,要求的精度也不一样。 例如:三位小数是0.618 现在我们需要你能求出保留100位小数的黄金分割数,采用的算法为“分层计算法”: 黄金数= 1 --------------- 1+ 1 ------------- 1+ 1 ----------- 1+ 1 --------- ..... 注意,计算出的结果,如果第100位为0也需要保留。 2)已知一个数列: 5,2,4,3,7,6 那么,在这个数列中存在这样一些“连续数”,例如:5,2,4,3这个子数列排序后是连续的。同样2,4,3也是连续的,为了方便表示 我们使用下标来标识,这样,这个数列中存在以下“连续数”: [1,1] [1,4] [1,6] [2,2] [2,4] [3,3] [3,4] [4,4] [5,5] [5,6] [6,6] 这样,他就存在11个“连续数”。现在需要你在用户找出一个数组中所有的“连续数”。 要求: 1、用户输入一个整数N,表示下面数组的个数 2、用户每输入一行作为一个数组 如: 用户输入: 1 5,2,4,3,7,6 程序输出: 11 3)有一种数我们称之为幸运数,它的特点是这样的,首先,由自然数按顺序排列: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 … 这样,1比较特殊, 1为第一个幸运数,那么,我们移除掉序号能被2整除的数(注意:是序号,而不是数本身,每次移除后都重新排序)就剩下: 1 3 5 7 9 11 13 15 17 19… 3为第二个幸运数,那么我们需要去掉序号能被3(下一次是除4,然后是5,每次加1)整除的数,5 11 17...剩下: 1 3 7 9 13 15 19… 那么7为第三个幸运数,后面的幸运数,依此类推,移除之后剩下的数字都是幸运数。 现在我们需要你求出给定的m和n之间的幸运数的个数: 例如:给定1 20,那么个数为:5(5个幸运数分别是1,3,7,13,19) 现在要求用户输入两个数m和n(m<n<=1000*1000),输出幸运数的个数。 例如: 用户输入: 1 20 程序输出: 5 格式:小四,1.5倍行距
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值