指南
bing搜索中文文档
JavaGuide、ZhongFuCheng3y / 3y、javatpoint、baeldung
Java 8系列之Stream的基本语
Java 8系列之Stream的基本语法详解法详解
等……
Java开发人员必知必会的20种常用类库和API
数据类型
- Java里把int基本类型变成Integer包装类,有啥用?(了解):一方面期望用“万物皆对象”的方式来统一语言设计,但另一方面又不得不考虑对“值类型”数据提供支持。
-
基本数据类型
float、double和demical
Java 浮点类型 float 和 double 的主要区别,更详细偏原理的:Java 浮点类型 float 和 double 的主要区别,它们的小数精度范围大小是多少?
指数位决定了大小范围,小数位决定了计算精度。
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
- 使用new BigDemical(String val)或BigDemical.valueOf(double val),不使用BigDemical(double val)
- 使用compareTo()
public enum RoundingMode {
// 2.5 -> 3 , 1.6 -> 2
// -1.6 -> -2 , -2.5 -> -3
// 远离0
UP(BigDecimal.ROUND_UP),
// 2.5 -> 2 , 1.6 -> 1
// -1.6 -> -1 , -2.5 -> -2
// 趋近0
DOWN(BigDecimal.ROUND_DOWN),
// 2.5 -> 3 , 1.6 -> 2
// -1.6 -> -1 , -2.5 -> -2
// 趋近正无穷
CEILING(BigDecimal.ROUND_CEILING),
// 2.5 -> 2 , 1.6 -> 1
// -1.6 -> -2 , -2.5 -> -3
// 趋近负无穷
FLOOR(BigDecimal.ROUND_FLOOR),
// 2.5 -> 3 , 1.6 -> 2
// -1.6 -> -2 , -2.5 -> -3
// 四舍五入
HALF_UP(BigDecimal.ROUND_HALF_UP),
// 2.5 -> 2, 1.6 -> 2
// -1.6 -> -2 , -2.5 -> -2
// 四舍五入(大于5才入,等于5舍)
HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),
}
转换
- 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
-
自动类型转换
转换从低级到高级。
char转为数字类型:c1 的值为字符 a ,查 ASCII 码表可知对应的 int 类型值为 97, A 对应值为 65,所以 i2=65+1=66。public class ZiDongLeiZhuan{
public static void main(String[] args){
char c1='a';//定义一个char类型
int i1 = c1;//char自动类型转换为int
System.out.println("char自动类型转换为int后的值等于"+i1);
char c2 = 'A';//定义一个char类型
int i2 = c2+1;//char 类型和 int 类型计算
System.out.println("char类型和int计算后的值等于"+i2);
}
}
强制类型转换
类型提升
多种不同数据类型的表达式中,类型会自动向范围表示大的值的数据类型提升。
常量
在 Java 中使用 final 关键字来修饰常量
当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制
int decimal = 100;
int octal = 0144;
int hexa = 0x64;
字符串常量和字符常量都可以包含任何Unicode字符
char a = '\u0001';
String a = "\u0001";
Java语言支持一些特殊的转义字符序列。
java中常量定义在interface中好还是定义在class中好,结论:都可以,看个人喜好
不可变类型
总结一下,不可变类型你修改它的内容改不动,同一指向的变量(例如传入的局部变量和形参)你在字面上修改它了,内部实际是开辟了一个新的内存空间指向新的对象/地址。
千万不要用可变类型做HashMap和HashSet键值,例如StringBuilder、数组。
如何理解 String 类型值的不可变?
String
/**
* 从路径中分离出文件名
*/
public static String getFullName(String fullPath) {
int index = fullPath.lastIndexOf('/');
if (index == -1) {
index = fullPath.lastIndexOf('\\');
}
return fullPath.substring(index + 1);
}
// => 编译后
public static String getFullName(String fullPath) {
int index = fullPath.lastIndexOf(47);
if (index == -1) {
index = fullPath.lastIndexOf(92);
}
return fullPath.substring(index + 1);
}
String.foramt
equals和==
==判断地址是否相同,equals默认判断地址相同(仅引用类型可用),一般重写为判断内容是否相同。
equals四大特性 BaseEntityTest.java BaseEntity.java
- 对称性:如果x.equals(y)返回是”true”,那么y.equals(x)也应该返回是”true”。
- 反射性:x.equals(x)必须返回是”true”。
- 传递性:如果x.equals(y)返回是”true”,而且y.equals(z)返回是”true”,那么z.equals(x)也应该返回是”true”。
- 一致性:如果x.equals(y)返回是”true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是”true”。
- 非空性,x.equals(null),永远返回是”false”;x.equals(和x不同类型的对象)永远返回是”false”。
hashCode
默认hashCode是内存地址计算后的整数(哈希码/散列码),确定该对象在哈希表中的索引位置。根据“键”快速的检索出对应的“值”(对象)。
重写equals和hashCode
为何重写equals方法就得重写hashCode方法
根据Java的Object类的约定:
- 相同(equals为true)的两个对象拥有相同的哈希值
- 相同哈希值的两个对象不一定相等(哈希碰撞)
如果不重写呢?
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”);
private final String code;
private final String message;
ResponseStatus(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
}
<a name="zOuuE"></a>
## valueOf
```java
matchType = Enum.valueOf(MatchType.class, matchTypeCode);
name()和toString()
区别:toString()可以override