注释规约:
1)类、字段、方法必须使用文档注释,不能使用单行注释和多行注释。
2)所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、 异常说明外,还必须指出该方法做什么事情,实现什么功能。
3)所有的类都必须添加创建者和创建日期。
4)所有的枚举类型字段必须要有注释,说明每个数据项的用途。
5)代码修改的同时,注释也要进行相应的修改。
必须得先指定变量的类型和名称
基本数据类型: boolean、char、byte、short、int、long、float 和 double
引用数据类型: 除了基本数据类型以外的类型,都引用类型。数组、类、接口。
为什么数组也是引用类型?
基本数据类型:变量名指向具体的数值;基本数据类型存储在栈上。
引用数据类型:变量名指向的是存储对象的内存地址,在栈上。内存地址指向的对象存储在堆上。
eg.list接口:
List<String> list = new ArrayList<>();
System.out.println(list);
对于接口类型的引用变量来说,只能 new 一个实现它的类的对象。
boolean默认值false;byte :0;int :0;
引用数据类型的默认值为 null,包括数组和接口。
Java 中的一种特殊类型,用于将基本数据类型(如 int、float、char 等)转换为对应的对象类型。
eg.
基本类型和包装类型的区别
:public boolean equals(Object obj) {
return (this == obj);
}
类没有覆盖 equals()方法时,通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
一般我们都覆盖 equals()方法来比较两个对象中的属性是否相等;
程序运行时,数据存储的位置:
自动装箱:基本类型转为包装类型
自动拆箱:包装类型转为基本类型
Java 1.5 为了减少开发人员的工作,提供了自动装箱与自动拆箱的功能。
Integer chenmo = 10; // 自动装箱
int wanger = chenmo; // 自动拆箱
反编译:
Integer chenmo = Integer.valueOf(10);
int wanger = chenmo.intValue();
面试题:
// 1)基本类型和包装类型
int a = 100;
Integer b = 100;
System.out.println(a == b);
// 2)两个包装类型
Integer c = 100;
Integer d = 100;
System.out.println(c == d);
// 3)
c = 200;
d = 200;
System.out.println(c == d);
byte -> short -> int -> long -> float -> double
char -> int -> long -> float -> double
将较大的数据类型转换为较小的数据类型
将浮点数转换为整数
将字符类型转换为数值类型
强制类型转换可能会导致数据丢失或精度降低
IntegerCache
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert Integer.IntegerCache.high >= 127;
}
private IntegerCache() {}
}
静态代码块中,low 为 -128,也就是缓存池的最小值;high 默认为 127,也就是缓存池的最大值,共计 256 个。可以在 JVM 启动的时候,通过 -XX:AutoBoxCacheMax=NNN 来设置缓存池的大小。
assert 是 Java 中的一个关键字,寓意是断言,为了方便调试程序
在命令行运行 Java 程序的时候加上 -ea 参数打开断言。
运算符
当浮点数除以 0 的时候,结果为 Infinity 或者 NaN;
整数除以 0 的时候(10 / 0),会抛出异常。
eg.按位右移
System.out.println(10>>2);//10/2^2=10/4=2
System.out.println(20>>2);//20/2^2=20/4=5
System.out.println(20>>3);//20/2^3=20/8=2
int a = 60, b = 13;
System.out.println("a 的二进制:" + Integer.toBinaryString(a)); // 111100
System.out.println("b 的二进制:" + Integer.toBinaryString(b)); // 1101
int c = a & b;
System.out.println("a & b:" + c + ",二进制是:" + Integer.toBinaryString(c));
c = a | b;
System.out.println("a | b:" + c + ",二进制是:" + Integer.toBinaryString(c));
c = a ^ b;
System.out.println("a ^ b:" + c + ",二进制是:" + Integer.toBinaryString(c));
c = ~a;
System.out.println("~a:" + c + ",二进制是:" + Integer.toBinaryString(c));
c = a << 2;
System.out.println("a << 2:" + c + ",二进制是:" + Integer.toBinaryString(c));
c = a >> 2;
System.out.println("a >> 2:" + c + ",二进制是:" + Integer.toBinaryString(c));
c = a >>> 2;
System.out.println("a >>> 2:" + c + ",二进制是:" + Integer.toBinaryString(c));
构造方法不能被override(重写)
hashCode() 的作用是获取哈希码,也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。
当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashCode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashCode 值作比较,如果没有相符的 hashCode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashCode 值的对象,这时会调用 equals() 方法来检查 hashCode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
------
著作权归JavaGuide(javaguide.cn)所有
基于MIT协议
原文链接:https://javaguide.cn/java/basis/java-basic-questions-02.html
为什么两个对象有相同的 hashCode 值,它们也不一定是相等的?
哈希碰撞
抽象类不一定有抽象方法;但是包含一个抽象方法的类一定是抽象类。