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也不为空串
if (str != null && str.length() != 0) { System.out.println("字符串不为空"); } else { System.out.println("字符串为空"); }
4、“==”与“equals”的区别
“==”:
1)用于比较值类型(int、float、boolean等)
2)用于比较引用类型,如果两个对象的引用地址相同,则返回true
“equals”:
1)用于比较引用类型,默认情况下与“==”的返回结果相同
2)由开发者覆写此方法,自己定义逻辑。比如常见的String类对此方法的覆写,覆写过后,即使两个对象的引用地址不同,返回结果仍然可以相同
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; }
5、Objects.equals(A,B)与A.equals(B)比较
查看源码,会发现Objects.equals(A,B)方法在比较之前,会先检查A是否为空,避免程序报空指针的异常
public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }
6、LocalDate与Date
如果只想对日期进行操作,而不对时间点进行操作,建议使用LocalDate类,而不是Date类,前者拥有更多的操作方法,后者的方法已经逐渐被废弃
7、在将父类转换成子类之前,应该使用instanceof进行检查
Object obj = "test"; if (obj instanceof String) { String str = (String) obj; System.out.println(str); }
尽量避免进行强制类型转换,可以通过重新设计父类的方式,来避免这种操作
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);
转换符,不需要特意的记忆,使用的时候,再进行查找
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);
对数组实施插入和删除元素的操作其效率很低。对于小型数组来说,这一点也不必担心。但如果数组存储的元素数比较多,又经常在中间位置插入、删除元素,就应该考虑使用链表来处理了。