一、BigDecimal 等值比较
- compareTo()
- 忽略精度
- equals()
- 比较值和精度(1.0,1.00比较结果为false)
- ==
- BigDecimal是对象,不能用==比较值
- BigDecimal(Double)创建是损失精度的
- BigDecimal(String)创建是精确的
二、对负数取绝对值不一定是正数
- Math.abs()
- int: − 2 31 —— 2 31 − 1 -2^{31}——2^{31} - 1 −231——231−1
- − 2 31 -2^{31} −231取负数越上界,取补码还是负数
- 所以在取绝对值之前int转为long即可
三、String、StringBuilder、StringBuffer
- String
- 不可变(String类被声明为final,不可被继承,方法无法被覆盖。且其中没有提供修改字符串的方法,要“修改”则创建新的对象)
- “+” 拼接字符串实际是语法糖。将String转为了StringBuilder然后append
- 不建议在for循环中用“+”拼接字符串(每次都实际上新建了对象)
- StringBuilder
- 可变
- 非线程安全
- 其中的char[] 不是final,所以可以修改
- 循环体内用StringBuilder。append扩展字符串
- StringBuffer
- 可变
- 线程安全(append方法用synchronized声明)
String a = “ab”; String b = “a” + “b”; a == b ?
- "=="比较字符串对象的引用地址是否相同
- a == b为true(分别都是字面量【固定值】)
String长度
- 编译期:counstant_utf8_info结构来表示字符串常量的值:65535(即在使用String a = xxx时会有限制)
- 运行期 :String的length是int类型, 2 31 − 1 2^{31} - 1 231−1
语法糖
- java虚拟机实际上不支持,编译阶段会还原为简单写法
- switch支持String与枚举
- switch “hello”实际上是switch 哈希值,然后用equals进行检查(万一哈希碰撞)
- 泛型
- 如:Map<String, String> map会进行类型擦除:Map map = new Hashmap()
- 条件编译
- 断言
- assert,底层是if,true则继续执行,false则抛出asserterror打断程序
- 可变参数
- public static void xxx(String… strs){ }
- 会建立一个数组,长度为调用该方法时传递的实参个数,然后把这个数组作为参数传到被调用函数里
- 自动拆、装箱
- 之前提过,响应数据类型包装类的ValueOf()
- 枚举
- enum,final修饰,不可被继承
- 内部类
- 嵌套类,内部类为外部类的一个成员class里套一个class
- 增强for循环
- for-each:for循环 +迭代器
- for(String s : strs)
- try-with-resources
- try-catch-finally(里面关闭资源)
- 如今变为try-catch
四、RPC接口返回的数据类型
- 应该使用包装类而不是基本数据类型(如果接口异常可能返回默认值,float是0.0,Float是null。看到null知道明确出错,减少歧义)
- 定义字段表示成功建议使用:Boolean success(首先作为接口的返回对象参数,不应该有不确定的值,Boolean默认值为null,boolean是false【会有歧义】)
- POJO类中任何布尔变量都不要加is(success而不是issuccess),否则部分框架解析会引起序列化错误【boolean isSuccess是属性,有方法为isSuccess(),RPC框架在反向解析时,会认为属性名称是success,导致属性获取失败,抛出异常】
五、常见字符编码
- ASCII:英文字符
- Unicode:UTF-8之类
- Unicode规定了编码,但没规定存储
- utf-8:使用1-4个字节为每个字符编码
- GBK:中文编码