其他
System.exit(n)n 的值对程序运行的作用
退出标识,根据不同标识可触发不同操作
为什么类内部声明私有属性,但提供公开的getter,setter方法?
- 可以改变getter,setter方法的实现,不影响其他代码
- setter方法可做数据检查
使用静态方法的场景
- 方法不访问对象状态,方法需要的参数都是通过显示参数提供
- 方法只需要访问类的静态域
方法参数使用情况
- 方法不能修改基本数据类型的参数
- 方法可以改变一个对象参数的状态
- 方法不能让对象参数引用一个新对象
初始化块
在构造函数前执行
java析构方法finalize
- java不支持,但可自己添加finalize方法。
- 在垃圾回收前调用,但调用时机不确定(所以不要依赖他释放资源)
- System.mnFinalizersOnExit(true) 的方法能够确保 finalizer 方法在 Java 关
闭前被调用,但不安全,不鼓励使用。替代方案:Runtime.addShutdownHook 添加关闭钩;手动调用close方法关闭
javadoc使用方法???
…
final
将方法或类声明为final的意义:确保它们不会在子类中改变语义
final 修饰域(字段) 赋值后不可修改
final 修饰方法 子类不可重写
final 修饰类 子类不可重写父类方法
内联:如果一个方法没有被覆盖并且很短, 编译器就能够对它进行优化处理(编译时优化), 这个过程为称为内联
( inlining )。例如,内联调用 e.getName( ) 将被替换为访问 e.name 域。
重载
重载父类方法时,返回值应是父类返回值或其子类
比较相等
==
- 比较对象为基本数据类型时,比较的是数据的大小
- 比较对象为引用类型时,比较的是引用类型中存放的地址
equals
- object 类 使用 == 实现,比较引用相同则返回true
- String Integer Date file 此四个类java实现时覆盖了Object类的实现,其他没有覆盖的类使用Object类实现
- String 值相同则相同(内部实现:先比较引用,相同返回true;再比较字符,相同则返回true)Integer 值相同则相同
- Integer 值相同则相同
Integer 特殊说明
1 | Integer n1=128; |
Integer包装类型中存在自动装箱的情况,
当数据范围在-128~127之间时,创建的对象会在方法区的常量池中开辟空间(可复用),
数据超出范围就会在堆区中开辟空间,
由于指向不同对象所以n1==n2判等的结果为false,n3与n4指向常量池同一地址所以判等结果为true。
Objects.equals(a,b)
- 两个参数都是null 返回true
实现:
1 | public static boolean equals(Object a, Object b) { |
编写一个完美的 equals 方法的建议:
- 显式参数命名为 otherObject, 稍后需要将它转换成另一个叫做 other 的变量。
- 检测 this 与 otherObject 是否引用同一个对象:
if (this = otherObject) return true;
- 检测 otherObject 是否为 null, 如 果 为 null, 返 回 false。
if (otherObject = null) return false;
- 比较 this 与 otherObject 是否属于同一个类。如果 equals 的语义在每个子类中有所改
变,就使用 getClass 检测:if (getClass() != otherObject.getCIassO) return false;
如果所有的子类都拥有统一的语义,就使用 instanceof 检测:if (!(otherObject instanceof ClassName)) return false;
- 将 otherObject 转换为相应的类类型变量:
ClassName other = (ClassName) otherObject
- 对所有需要比较的域进行比较了。使用=比较基本类型域,使用 equals 比
较对象域。如果所有的域都匹配, 就返回 true; 否 则 返 回 false1
2
3return fieldl == other.field
&& Objects.equa1s(fie1d2, other.field2)
&& ...;
实现equals时的常见错误:
以下代码声明了一个新equals 没有覆盖object类的equals©Override public boolean equals(Object other)
1 | public class Employee |
hashcode
- 返回一个整形数值(可负数)
- 合理组合字段的散列码(以便不同对象的散列码均匀分布)
例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public class Employee{
public int hashCode(){
return 7 * name.hashCode0
+ 11 * new Double(salary).hashCode0
+ 13 * hireDay.hashCode();
}
}
//更好的方法1 :使用null 安全的方法 Objects.hashCode。
public int hashCode(){
return 7 * Objects.hashCode(name)
+ 11 * Double.hashCode(salary)
+ 13 * Objects.hashCode(hireDay);
}
//更好的方法2 :
public int hashCodeO
{
return Objects.hash(name, salary, hireDay);
}
其他数组散列码:Arrays.hashCode - Equals 与 hashCode 的定义必须一致:如果 x.equals(y) 返回 true, 那么 x.hashCode( ) 就必须与 y.hashCode( ) 具有相同的值。例如, 如果用定义的 Employee.equals 比较雇员的ID,那么 hashCode 方法就需要散列 ID,而不是雇员的姓名或存储地址。
toString
数组:Arrary.toString()
ArraryList.trimTosize()
确认数组列表的大小不再发生变化,就可以调用 trimToSize方法,将
存储区域的大小调整为当前元素数量所需要的存储空间数目。垃圾回收器将回收多余的存储
空间。
Properties
1 |
|
isAssignableFrom
ClassA.isAssignableFrom(ClassB)==true
B继承或实现A
Java内省Introspector
SPI
接口:vvf.ln.spi.SPIService
实现:vvf.ln.spi.imp.SPIServiceImpl1、vvf.ln.spi.imp.SPIServiceImpl2
在目录/resources/META-INF/services/中新建文件 vvf.ln.spi.SPIService
文件内容:vvf.ln.spi.imp.SPIServiceImpl1
使用:
1 | ServiceLoader<SPIService> load = ServiceLoader.load(SPIService.class); |