软引用 VS 弱引用
软引用 在内存不足时回收
弱引用 在垃圾回收时不管内存是否充足都回收
进程和线程的区别
- 一个程序至少一个进程, 一个进程最少一个线程
- 进程间相互独立, 同一个进程的各线程共享内存, 某个进程内的线程在其他进程中不可见
- 操作系统中, 一般把进程作为分配资源的基本单位, 把线程作为独立运行和独立调度的基本单位
java 中 关键字 final 的理解
- 变量: 一旦初始化, 变量值就不能修改
- 方法: 该方法不能被子类重写 ( override )
- 类: 该类不能派生子类
比如public final class String extends Object
java 中 finally 关键字
finally 常于 trt/catch 语句块配对使用, 即使有异常抛出, 也能确保某段代码一定能执行。
finally 常用于关闭流资源或者数据库连接等。
overload 和 override 的区别
overload 重载, 是指两个方法的名称相同, 但参数类型或者个数不同, 即方法的签名不同。注意:方法的返回值不能作为其签名
override 重写, 是指某个方法与父类的方法拥有相同的名称和函数签名。比如实现某个接口, 需要进行 override 其中的抽象方法
equal() 和 hashCode() 理解
- equal() 相等, hashCode() 必定相同
原因:
java按照hashCode来访问小内存块,所以hashCode必须相等。
HashMap获取一个对象是比较key的hashCode相等和equal为true。
HashMap比较对象时先通过hashcode缩小范围,然后再使用equal方法比较是否相等
但是 hashCode() 相同, 未必 equal() 相等
原因:
比如对象 A 和 对象 B 有 id 和 name, hashCode 按照name 来计算, 但是 equal 按照 id来进行比较. 可能出现 name 相同, id 不同的情况. (公司员工同名同姓的情况). 这时候 hashCode 相同, equal 不同
java interface 接口 成员函数 可以是 private 吗
成员函数只有声明, 没有方法体, 自动都是 public 修饰的 (我们 code 时候 可以省去)
成员变量默认都是静态变量 static final
interface 和 抽象类
抽象类更相当于 is-a (是不是) 的关系 。接口是 has-a (有没有)的关系
比如抽象类 Bird 和 Plane 表示鸟、飞机,可以继承它们实现更具体的鸟(老鹰、麻雀等),更具体的飞机(直升机、战斗机)。
用 Fly 表示接口,一组抽象的飞行行为,不能设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。
Collection和Collections的区别
java.util.Collection 和 java.util.Collections
Collection 是接口
The root interface in the collection hierarchy. A collection represents a group of objects,
Collections 里面包含了一些 处理 集合的静态方法
This class consists exclusively of static methods that operate on or return collections.
HashSet, TreeSet 和 LinkedHashSet 的区别
HashSet无序
LinkedHashSet 按照 插入顺序 排序
使用链表维护元素的次序。
TreeSet是SortedSet接口的唯一实现类,有序
TreeSet支持两种排序方式,自然排序 或者 定制排序
Comparable Comparator 区别
java.lang.Comparable 和 java.util.Comparator
从英文名字也可以看出, Comparable是一种 able, 表示该对象可以比较, 是 对象自身的属性
其中要Override的方法 compareTo
compareTo 是 同种对象 之间 比较
Comparator是一个名词, 如果一个对象没有实现 Comparable 时, 就要外部实现 一个 单独的 Comparator 接口, 传递给 sort 方法]
其中要Override的方法 是 compare
compare 像是 外部 对两个对象比较
sort(Object[]), 所有对象都必须实现Comparable接口,它用来确定对象之间的大小关系
sort(Object[], Comparator) 对象不必实现Comparable接口, 各个对象根据 Comparator 确定大小关系