其他

System.exit(n)n 的值对程序运行的作用

退出标识,根据不同标识可触发不同操作

为什么类内部声明私有属性,但提供公开的getter,setter方法?

  1. 可以改变getter,setter方法的实现,不影响其他代码
  2. setter方法可做数据检查
使用静态方法的场景
  1. 方法不访问对象状态,方法需要的参数都是通过显示参数提供
  2. 方法只需要访问类的静态域
方法参数使用情况
  1. 方法不能修改基本数据类型的参数
  2. 方法可以改变一个对象参数的状态
  3. 方法不能让对象参数引用一个新对象
初始化块

在构造函数前执行

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类实现
    1. String 值相同则相同(内部实现:先比较引用,相同返回true;再比较字符,相同则返回true)Integer 值相同则相同
    2. Integer 值相同则相同
Integer 特殊说明
1
2
3
4
5
6
7
8
9
10
11
Integer n1=128;
Integer n2=128;
System.out.print("n1==n2:");
System.out.println(n1==n2);//false
System.out.print("n1.equals(n2):");
System.out.println(n1.equals(n2));//true

Integer n3=127;
Integer n4=127;
System.out.print("n3==n4:");
System.out.println(n3==n4);//true

Integer包装类型中存在自动装箱的情况,
当数据范围在-128~127之间时,创建的对象会在方法区的常量池中开辟空间(可复用),
数据超出范围就会在堆区中开辟空间,
由于指向不同对象所以n1==n2判等的结果为false,n3与n4指向常量池同一地址所以判等结果为true。

Objects.equals(a,b)
  • 两个参数都是null 返回true

实现:

1
2
3
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
编写一个完美的 equals 方法的建议:
  1. 显式参数命名为 otherObject, 稍后需要将它转换成另一个叫做 other 的变量。
  2. 检测 this 与 otherObject 是否引用同一个对象:if (this = otherObject) return true;
  3. 检测 otherObject 是否为 null, 如 果 为 null, 返 回 false。if (otherObject = null) return false;
  4. 比较 this 与 otherObject 是否属于同一个类。如果 equals 的语义在每个子类中有所改
    变,就使用 getClass 检测:if (getClass() != otherObject.getCIassO) return false;如果所有的子类都拥有统一的语义,就使用 instanceof 检测:if (!(otherObject instanceof ClassName)) return false;
  5. 将 otherObject 转换为相应的类类型变量:ClassName other = (ClassName) otherObject
  6. 对所有需要比较的域进行比较了。使用=比较基本类型域,使用 equals 比
    较对象域。如果所有的域都匹配, 就返回 true; 否 则 返 回 false
    1
    2
    3
    return fieldl == other.field
    && Objects.equa1s(fie1d2, other.field2)
    && ...;

实现equals时的常见错误:
以下代码声明了一个新equals 没有覆盖object类的equals
©Override public boolean equals(Object other)

1
2
3
4
5
6
7
8
9
10
11
public class Employee
{
public boolean equals(Employee other) //
{
return other != null
&& getClassO == other.getClass0
&& Objects.equals(name , other.name)
&& salary— other,sal ary
&& Objects.equals(hireDay, other.hireDay)
}
}
hashcode
  • 返回一个整形数值(可负数)
  • 合理组合字段的散列码(以便不同对象的散列码均匀分布)
    例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

public class JDBCPropertiesUtil {
String path;
Properties properties;

//HashMap propertiesMap;

public JDBCPropertiesUtil(String path) {
this.path = path;
this.load();
}

private void load() {
this.properties = new Properties();
InputStream stream = this.getClass().getResourceAsStream(this.path);
try {
properties.load(stream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

public String getProperty(String key) {
String property = this.properties.getProperty(key);
return property;
}

}
isAssignableFrom

ClassA.isAssignableFrom(ClassB)==true B继承或实现A

Java内省Introspector

https://fangshixiang.blog.csdn.net/article/details/95907073?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-17-95907073-blog-139313514.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-17-95907073-blog-139313514.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=20

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
2
3
4
ServiceLoader<SPIService> load = ServiceLoader.load(SPIService.class);
for (SPIService it : load) {
it.doSomething();
}
x