1,强烈建议,不使用 char 类型
那么,到底为什么 java 里不推荐使用 char 类型呢?其实,1 个 java 的 char 字符并不完全等于一个 unicode 的字符.char 采用的 UCS-2 编码,是一种淘汰的 UTF-16 编码,编码方式最多有 65536 种,远远少于当今 Unicode 拥有 11 万字符的需求.java 只好对后来新增的 Unicode 字符用 2 个 char 拼出 1 个 Unicode 字符.导致 String 中 char 的数量不等于 unicode 字符的数量.
然而,大家都知道,char 在 Oracle 中,是固定宽度的字符串类型(即所谓的定长字符串类型),长度不够的就会自动使用空格补全.因此,在一些特殊的查询中,就会导致一些问题,而且这种问题还是很隐蔽的,很难被开发人员发现.一旦发现问题的所在,就意味着数据结构需要变更,可想而知,这是多么大的灾难啊.
2,final 修饰的常量
用关键字 final 指示常量,关键字 final 表示这个变量只能被赋值一次,一旦被赋值,就不能再更改了,习惯上,常量名使用全大写.
如果经常希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量,使用关键字 static final 修饰.
3,检查字符串是否为 null 也不为空串
4,"==" 与 "equals" 的区别
if (str != null && str.length() != 0) {
System.out.println("字符串不为空");
} else {
System.out.println("字符串为空");
}
View Code
"==":
1)用于比较值类型(int,float,boolean 等)
2)用于比较引用类型,如果两个对象的引用地址相同,则返回 true
"equals":
1)用于比较引用类型,默认情况下与 "==" 的返回结果相同
2)由开发者覆写此方法,自己定义逻辑.比如常见的 String 类对此方法的覆写,覆写过后,即使两个对象的引用地址不同,返回结果仍然可以相同
5,Objects.equals(A,B) 与 A.equals(B) 比较
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
View Code
查看源码,会发现 Objects.equals(A,B) 方法在比较之前,会先检查 A 是否为空,避免程序报空指针的异常
6,LocalDate 与 Date
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
View Code
如果只想对日期进行操作,而不对时间点进行操作,建议使用 LocalDate 类,而不是 Date 类,前者拥有更多的操作方法,后者的方法已经逐渐被废弃
7,在将父类转换成子类之前,应该使用 instanceof 进行检查
尽量避免进行强制类型转换,可以通过重新设计父类的方式,来避免这种操作
Object obj = "test";
if (obj instanceof String) {
String str = (String) obj;
System.out.println(str);
}
View Code
8,public class 与 class
public class 是公共类的意思,public 是访问修饰符.java 规定一个类文件中,public 修饰的 class 只有一个,并且类名必须和这个类的文件名一样,所以一个类文件中可以有多个类,但由 public 修饰的类只能有一个
备注:protected,private 很少会用于修饰类
9,public,protected,private 修饰符
这里说的修饰,主要是对类中的方法,域等进行修饰
在说明这四个关键字之前,我想就 class 之间的关系做一个简单的定义,对于继承自己的 class,可以认为他们都是自己的子女,而对于和自己一个目录(同一个包路径)下的 class,认为都是自己的朋友.
1,public:public 表明该数据成员,成员函数是对所有用户开放的,所有用户都可以直接进行调用
2,private:private 表示私有,私有的意思就是除了 class 自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用.
3,protected:protected 对于子女,朋友来说,就是 public 的,可以自由使用,没有任何限制,而对于其他的外部 class,protected 就变成 private.
作用域 | 当前类 | 同一个 package | 子孙类 | 其他 package |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
private | √ | × | × | × |
friendly | √ | √ | × | × |
注:不写时默认为 friendly
10,Integer.valueOf() 与 Integer.parseInt()
Integer.parseInt() 把 String 类型转换为 int 类型
Integer.valueOf() 把 String 类型转换为 Integer 对象
11,格式化输出
转换符,不需要特意的记忆,使用的时候,再进行查找
String message = String.format("Hello,%s.Next year,you'll be %d","jyy", 24);
System.out.println(message);
System.out.printf("Hello,%s.Next year,you'll be %d","jyy", 24);
View Code
12,switch 语句
如果在 case 分支语句的末尾没有 break 语句,那么就会接着执行下一个 case 语句,这种情况相当危险,为此,我们程序中从不使用 switch 语句.
13,不定长数组 - ArrayList
对数组实施插入和删除元素的操作其效率很低.对于小型数组来说,这一点也不必担心.但如果数组存储的元素数比较多,又经常在中间位置插入,删除元素,就应该考虑使用链表来处理了.
// 初始化
ArrayList<Car> arrayList = new ArrayList<>();
// 添加
arrayList.add(new Car(1001, "奔驰", 200));
arrayList.add(new Car(1002, "宝马", 300));
// 在中间位置添加
arrayList.add(1, new Car(1003, "保时捷", 500));
// 修改
arrayList.set(0, new Car(1001, "奥迪", 400));
// 查询
Car c = arrayList.get(0);
System.out.println(c.toString());
// 删除
arrayList.remove(2);
// 查询长度
arrayList.size();
// 转数组
Car[] cars = new Car[arrayList.size()];
arrayList.toArray(cars);
View Code
来源: http://www.bubuko.com/infodetail-2482786.html