import java.util.*;
public class CommonProgram {
enum Suit { CLUB, DIAMOND, HEART, SPADE }
enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,
NINE, TEN, JACK, QUEEN, KING }
private static final Random rnd = new Random();
//了解和使用标准类库及其API的功能
//Boolean.getBoolean(name)返回System.getProperty(name)的boolean值
public static boolean yesOrNo(String s) {
s = s.toLowerCase();
if (s.equals("yes") || s.equals("y") || s.equals("t")) {
s = "true";
}
return Boolean.getBoolean(s);
}
public static void main(String[] args) {
System.out.println(yesOrNo("true") + " " + yesOrNo("Yes"));
Collection<Suit> suits = Arrays.asList(Suit.values());
Collection<Rank> ranks = Arrays.asList(Rank.values());
//throw NoSuchElementException
/*for (Iterator<Suit> i = suits.iterator(); i.hasNext(); )
for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); )
System.out.println(i.next() + ", " + j.next());
*/
//正确的用法
for (Iterator<Suit> i = suits.iterator(); i.hasNext(); ) {
Suit suit = i.next();
for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); )
System.out.println(suit + ", " + j.next());
}
//for-each
for (Suit suit : suits)
for (Rank rank : ranks)
System.out.println(suit + " " + rank);
//分布不平均的随机数
int n = 2 * (Integer.MAX_VALUE / 3);
int low = 0;
for (int i = 0; i < 1000000; i++)
if (rnd.nextInt() < n/2)
low++;
System.out.println(low);
//新类库功能更准确
low = 0;
for (int i = 0; i < 1000000; i++)
if (rnd.nextInt(n) < n/2)
low++;
System.out.println(low);
//float和double不精确
System.out.println(1.03 - .42);
}
}
* 将局部变量的作用域最小化:最有力的方法就是在第一次使用它的地方声明。
for/for each循环允许声明循环变量,它们的作用域被限定在正好需要的范围内。
当循环之外不需要循环变量时,for循环优先于while循环。
* ********************************************************************
* for each循环优先于传统的for循环:for each循环通过隐藏迭代器或者索引变量,避免了混乱和出错的
可能。
以下情况无法使用for each循环:
1.过滤:如果需要遍历集合,并删除指定元素,就需要使用显式的迭代器,以便可以调用
Iterator.remove(item)方法。
2.转换:如果需要遍历数组或者集合,并取代它部分或者全部的元素值,就需要集合迭代器或者
数组索引,以便设定元素的值。
3.平行迭代:如果需要并行地迭代多个集合,就需要显式地控制迭代器或者索引变量,以便迭代器
或者索引变量都可以同步前移。
* ********************************************************************
* 了解和使用标准类库:
通过使用标准类库,可以充分利用编写标准类库的专家的知识,以及之前其他人的使用经验。
标准类库的性能往往会随着时间的推移而不断提高。
使用标准类库可以使代码融入主流,更易读,更易维护和重用。
* ********************************************************************
* 如果需要精确的答案,避免使用float和double:尤其不适合用于货币计算。
使用BigDecimal或者放大数据使用int或者long进行精确计算并处理小数点。
* ********************************************************************
* 基本类型优先于装箱基本类型:
装箱基本类型具有与它们的值不同的同一性。
基本数据类型只有功能完备的值,装箱基本类型除了有对应的功能完备的值外,还有非功能值null。
基本数据类型比装箱基本类型更节省时间和空间。
对装箱基本类型使用==操作符几乎总是错误的。
当一项操作中混合使用基本类型和装箱基本类型时,装箱基本类型就会自动拆箱。
装箱基本类型应用场所:
1.作为集合中元素的key和value
2.在泛型中作为类型参数时
3.在进行反射的方法调用时
* ********************************************************************
* 如果其他类型更适合,则尽量避免使用字符串:
字符串不适合代替其他的值类型。
字符串不适合代替枚举类型。
字符串不适合代替聚集类型。
* ********************************************************************
* 当心字符串连接(+)的性能:
为连接n个字符串而重复地使用字符串连接操作,需要n的平方级的时间。这是由于字符串不可变
而导致的结果。当两个字符串被连接在一起时,它们的内容都要被拷贝。
多个字符串连接时,应该使用StringBuilder的append方法。
* ********************************************************************
* 通过接口引用对象:应该优先使用接口而不是类来引用对象。
如果有合适的接口类型存在,那么对于参数、返回值、变量和field来说,都应该使用接口类型进行声明。
只有当利用构造器创建某个对象的时候,才真正需要引用这个对象的类。
对于不存在接口的类,尽量使用基类(通常是抽象类)来引用对象,而不是具体的实现类。
* ********************************************************************
* 接口优先于反射机制:
使用反射需要付出的代价:
丧失了编译时类型检查的好处,执行反射访问所需要的代码非常笨拙和冗长。反射方法调用比普通方法
调用慢了许多。如果在编译时存在接口或者超类,就可以以反射方式创建实例,然后通过接口或者超类,
以正常的方式访问实例。
* ********************************************************************
* 遵循普遍接受的命名惯例:
static final 常量域的名称应该包含一个或者多个大写的单词,中间用下划线(_)隔开。
泛型类型参数通常由单个大写字母组成。T=任意类型、E=集合元素类型、(K/V)=映射的键和值得类型、
X=异常、(T/U/V)=任何类型的序列。
输出为:
false false
CLUB, ACE
CLUB, DEUCE
CLUB, THREE
CLUB, FOUR
CLUB, FIVE
CLUB, SIX
CLUB, SEVEN
CLUB, EIGHT
CLUB, NINE
CLUB, TEN
CLUB, JACK
CLUB, QUEEN
CLUB, KING
DIAMOND, ACE
DIAMOND, DEUCE
DIAMOND, THREE
DIAMOND, FOUR
DIAMOND, FIVE
DIAMOND, SIX
DIAMOND, SEVEN
DIAMOND, EIGHT
DIAMOND, NINE
DIAMOND, TEN
DIAMOND, JACK
DIAMOND, QUEEN
DIAMOND, KING
HEART, ACE
HEART, DEUCE
HEART, THREE
HEART, FOUR
HEART, FIVE
HEART, SIX
HEART, SEVEN
HEART, EIGHT
HEART, NINE
HEART, TEN
HEART, JACK
HEART, QUEEN
HEART, KING
SPADE, ACE
SPADE, DEUCE
SPADE, THREE
SPADE, FOUR
SPADE, FIVE
SPADE, SIX
SPADE, SEVEN
SPADE, EIGHT
SPADE, NINE
SPADE, TEN
SPADE, JACK
SPADE, QUEEN
SPADE, KING
666400
499585
0.6100000000000001