Java 基础知识1-10

1 接口的意义

规范(基于接口编程)、扩展(松耦合)、回调

2 抽象类的意义

为其子类提供一个公共的类型,封装子类中得重复内容
定义抽象方法,子类虽然有不同的实现,但是定义是一致的

3 内部类的作用

内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。

4 父类的静态方法能否被子类重写

子类继承父类后,用相同的静态方法和非静态方法,这时非静态方法覆盖父类中的方法(即方法重写),父类的该静态方法被隐藏(如果对象是父类则调用该隐藏的方法)

5 垃圾回收机制

Java 垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中。一般的实现是划分成3个世代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性。

6 ==和equals和hashCode

== 判断值是否相等,复杂类型判断引用的地址是否相等
Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;
hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数。根类Object的hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的;
在批量的对象比较中,hashCode要比equals来得快;
虑在集合中,判断两个对象是否相等的规则是:
    第一步,如果hashCode()相等,则查看第二步,否则不相等;
    第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。

改写equals时总是要改写hashcode;
改写String中的equals为基于内容上的比较而不是内存地址的话,那么虽然equals相等,但并不代表内存地址相等,由hashcode方法的定义可知内存地址不同,没改写的hashcode值也可能不同。

7 string-stringbuffer-stringbuilder

String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)

8 多态的实现方式

接口实现,继承父类进行方法重写,同一个类中进行方法重载。

9 线程阻塞

  1. sleep() 方法:sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。 典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。
  2. suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。
  3. yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程.
    阻塞时都不会释放占用的锁
  4. wait() 和 notify() 方法:(隶属于 Object 类)两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用.必须在 synchronized 方法或块中调用,释放锁

10 HashTable,HashMap

HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap

你可能感兴趣的:(Java 基础知识1-10)