指南

bing搜索中文文档
JavaGuideZhongFuCheng3y / 3yjavatpointbaeldung

Java 8系列之Stream的基本语
Java 8系列之Stream的基本语法详解法详解
等……
Java开发人员必知必会的20种常用类库和API
image.png

数据类型

image.png
指数位决定了大小范围,小数位决定了计算精度。

float double
符号位 1 1
指数位 8 11
小数位 23(十进制精度6位) 52(十进制精度15位)
指数位偏移 127 1023

十进制浮点数转二进制

十进制数的小数部分 M 对应二进制部分应为 A1 2^(-1) + A2 2^(-2) + … + An 2^(-n) 其中An 为 0 或 1 现在将 M 乘 2 :M 2 = A1 2^0 + A2 2^-1 + … + An 2^(1-n) 此时,A1 2^0 = A1 即为 M 2的整数部分的值 求出了A1,然后舍弃M 2 的整数部分……

BigDemical

Java中的BigDecimal类你了解多少?

  1. 使用new BigDemical(String val)或BigDemical.valueOf(double val),不使用BigDemical(double val)
  2. 使用compareTo()

image.png

  1. public enum RoundingMode {
  2. // 2.5 -> 3 , 1.6 -> 2
  3. // -1.6 -> -2 , -2.5 -> -3
  4. // 远离0
  5. UP(BigDecimal.ROUND_UP),
  6. // 2.5 -> 2 , 1.6 -> 1
  7. // -1.6 -> -1 , -2.5 -> -2
  8. // 趋近0
  9. DOWN(BigDecimal.ROUND_DOWN),
  10. // 2.5 -> 3 , 1.6 -> 2
  11. // -1.6 -> -1 , -2.5 -> -2
  12. // 趋近正无穷
  13. CEILING(BigDecimal.ROUND_CEILING),
  14. // 2.5 -> 2 , 1.6 -> 1
  15. // -1.6 -> -2 , -2.5 -> -3
  16. // 趋近负无穷
  17. FLOOR(BigDecimal.ROUND_FLOOR),
  18. // 2.5 -> 3 , 1.6 -> 2
  19. // -1.6 -> -2 , -2.5 -> -3
  20. // 四舍五入
  21. HALF_UP(BigDecimal.ROUND_HALF_UP),
  22. // 2.5 -> 2, 1.6 -> 2
  23. // -1.6 -> -2 , -2.5 -> -2
  24. // 四舍五入(大于5才入,等于5舍)
  25. HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),
  26. }

转换

Java中的基本数据类型转换(自动、强制、提升)
image.png

  • 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
  • 转换过程中可能导致溢出或损失精度

    自动类型转换

    转换从低级到高级。
    char转为数字类型:c1 的值为字符 a ,查 ASCII 码表可知对应的 int 类型值为 97, A 对应值为 65,所以 i2=65+1=66。

    1. public class ZiDongLeiZhuan{
    2. public static void main(String[] args){
    3. char c1='a';//定义一个char类型
    4. int i1 = c1;//char自动类型转换为int
    5. System.out.println("char自动类型转换为int后的值等于"+i1);
    6. char c2 = 'A';//定义一个char类型
    7. int i2 = c2+1;//char 类型和 int 类型计算
    8. System.out.println("char类型和int计算后的值等于"+i2);
    9. }
    10. }

    强制类型转换

    格式:(type)value
    可能导致溢出或损失精度

    类型提升

    多种不同数据类型的表达式中,类型会自动向范围表示大的值的数据类型提升。

    常量

  • 在 Java 中使用 final 关键字来修饰常量

  • 当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制

    1. int decimal = 100;
    2. int octal = 0144;
    3. int hexa = 0x64;
  • 字符串常量和字符常量都可以包含任何Unicode字符

    1. char a = '\u0001';
    2. String a = "\u0001";
  • Java语言支持一些特殊的转义字符序列。

java中常量定义在interface中好还是定义在class中好,结论:都可以,看个人喜好

不可变类型

总结一下,不可变类型你修改它的内容改不动,同一指向的变量(例如传入的局部变量和形参)你在字面上修改它了,内部实际是开辟了一个新的内存空间指向新的对象/地址。
千万不要用可变类型做HashMap和HashSet键值,例如StringBuilder、数组。
如何理解 String 类型值的不可变?

String

  1. /**
  2. * 从路径中分离出文件名
  3. */
  4. public static String getFullName(String fullPath) {
  5. int index = fullPath.lastIndexOf('/');
  6. if (index == -1) {
  7. index = fullPath.lastIndexOf('\\');
  8. }
  9. return fullPath.substring(index + 1);
  10. }
  11. // => 编译后
  12. public static String getFullName(String fullPath) {
  13. int index = fullPath.lastIndexOf(47);
  14. if (index == -1) {
  15. index = fullPath.lastIndexOf(92);
  16. }
  17. return fullPath.substring(index + 1);
  18. }

String.foramt

java-string-format

equals和==

==判断地址是否相同,equals默认判断地址相同(仅引用类型可用),一般重写为判断内容是否相同。

equals四大特性 BaseEntityTest.java BaseEntity.java

  1. 对称性:如果x.equals(y)返回是”true”,那么y.equals(x)也应该返回是”true”。
  2. 反射性:x.equals(x)必须返回是”true”。
  3. 传递性:如果x.equals(y)返回是”true”,而且y.equals(z)返回是”true”,那么z.equals(x)也应该返回是”true”。
  4. 一致性:如果x.equals(y)返回是”true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是”true”。
  5. 非空性,x.equals(null),永远返回是”false”;x.equals(和x不同类型的对象)永远返回是”false”。

hashCode

默认hashCode是内存地址计算后的整数(哈希码/散列码),确定该对象在哈希表中的索引位置。根据“键”快速的检索出对应的“值”(对象)。

重写equals和hashCode

为何重写equals方法就得重写hashCode方法
根据Java的Object类的约定:

  1. 相同(equals为true)的两个对象拥有相同的哈希值
  2. 相同哈希值的两个对象不一定相等(哈希碰撞)

image.png
Java基础 - 图7
如果不重写呢?
hashCode方法的重写原则就是保证equals方法认定为相同的两个对象拥有相同的哈希值,如果不重写,主要会影响HashMap、HashSet、HashTable等散列表:(仅仅当创建某个“类”的散列表时,该类的hashCode() 才有用更通俗地说就是创建包含该类的HashMap,Hashtable,HashSet集合时,hashCode() 才有用。)
以String类型为key为例,我们put两个字面量完全相同的s1与s2,如果他们的哈希值不同,导致查出的索引位置不同,会创建一个新的节点,而不是覆盖原节点。

泛型

  • 泛型不能使用基本类型,因为使用基本类型时会编译出错。
  • Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同?

    枚举

    ```java public enum ResponseStatus { OK(“200”, “OK”), BAD_REQUEST(“400”, “Bad Request”), UNAUTHORIZED(“401”, “Unauthorized”), NOT_FOUND(“404”, “Not Found”), INTERNAL_SERVER_ERROR(“500”, “Internal Server Error”), SERVICE_UNAVAILABLE(“503”, “Service Unavailable”);
  1. private final String code;
  2. private final String message;
  3. ResponseStatus(String code, String message) {
  4. this.code = code;
  5. this.message = message;
  6. }
  7. public String getCode() {
  8. return code;
  9. }
  10. public String getMessage() {
  11. return message;
  12. }

}

  1. <a name="zOuuE"></a>
  2. ## valueOf
  3. ```java
  4. matchType = Enum.valueOf(MatchType.class, matchTypeCode);

name()和toString()

区别:toString()可以override