java中编程技巧

来源:互联网 发布:阳煤集团知乎 编辑:程序博客网 时间:2024/06/03 14:51
//======================================================     java中的编程小技巧     ======================================================


//======================================================     java中的奇数判断     ======================================================
java中的奇数判断


在进行奇数的判断运算中 如果所判断的数据中包含负数 那么 使用 num % 2 == 1 判断会出现错误  因为负奇数 %2 结果是 -1


可以使用  num & 1 == 1   进行判断奇数


//======================================================     java中获取时间     ======================================================
java中获取时间


System.currentTimeMillis() 可用于时间 new Data(data);
System.nanoTime()  不可用于时间    但是这种方式 是毫微秒级的


System.currentTimeMillis()、System.nanoTime()


平时产生随机数时我们经常拿时间做种子,比如用System.currentTimeMillis的结果,但是在执行一些循环中使用了System.currentTimeMillis,那么每次的结果将会差别很小,甚至一样,因为现代的计算机运行速度很快。后来看到java中产生随机数函数以及线程池中的一些函数使用的都是System.nanoTime。


>System.currentTimeMillis返回的是从1970.1.1 UTC 零点开始到现在的时间,精确到毫秒,平时我们可以根据System.currentTimeMillis来计算当前日期,星期几等,可以方便的与Date进行转换,


> System.nanoTime提供相对精确的计时,但是不能用他来计算当前日期,


所以在使用中,我们可以根据我们具体的目的去正确的选择他们。


//======================================================     java中对循环控制     ======================================================
long start = System.currentTimeMillis();
for(int i=0;i<10000000;i++){
   if(i%10==9){
   //每循环10次执行一次
}
}
System.out.println(System.currentTimeMillis() - start  +"       asdasd1111111");   48       asdasd1111111  耗时


修改优化为以下


long start1 = System.currentTimeMillis();
for(int i=0,j=10;i<10000000;i++,j--){
   if(j==0){
       //每循环10次执行一次
       j=10;
}
}
System.out.println(System.currentTimeMillis() - start1 + "     asdasd22222222");    5     asdasd22222222  耗时


//======================================================     java中枚举的使用    ======================================================


 通常定义常量方法和枚举定义常量方法区别


以下内容可能有些无聊,但绝对值得一窥


1. 代码:


复制代码
public class State {


public static final int ON = 1;


public static final Int OFF= 0;


}
复制代码
有什么不好了,大家都这样用了很长时间了,没什么问题啊。


首先,它不是类型安全的。你必须确保是int


其次,你还要确保它的范围是0和1


最后,很多时候你打印出来的时候,你只看到 1 和0 ,


但其没有看到代码的人并不知道你的企图,抛弃你所有旧的public static final常量 


2. 可以创建一个enum类,把它看做一个普通的类。除了它不能继承其他类了。(java是单继承,它已经继承了Enum),


可以添加其他方法,覆盖它本身的方法

枚举的使用 详见 http://blog.csdn.net/chushoutaizhong/article/details/77648376



3. switch()参数可以使用enum了


4. values()方法是编译器插入到enum定义中的static方法,所以,当你将enum实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例


5. 无法从enum继承子类,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。


6. 使用EnumSet代替标志。enum要求其成员都是唯一的,但是enum中不能删除添加元素。


7. EnumMap的key是enum,value是任何其他Object对象。


8. enum允许程序员为eunm实例编写方法。所以可以为每个enum实例赋予各自不同的行为。


9. 使用enum的职责链(Chain of Responsibility) .这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。


10. 使用enum的状态机


11. 使用enum多路分发







public enum Color {  //这种是直接使用的枚举  后面没有分好
  RED, GREEN, BLANK, YELLOW  
}  


public enum Color{  //java中enum是(枚举)关键字  这个enum可以定义在一个类中(在类中可以定义)   也可以单独定义一个类
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  //这种是自定义的enum  后面需要分号  里面的参数和你在下面定义的构造方法有关系

private String name;
private int index;  // 其中自定义的属性

private Color(String name,int index){  //自定义的构造方法
this.name = name;
this.index = index;
}
public String getName(){
return this.name;
}
public int getIndex(){
return this.index;
}
}

@Test
public void color(){
Color[] color = Color.values();
for(Color c : color){
System.out.println(c.name);  //相当于类变量
System.out.println(c.getIndex()); //相当于get方法
System.out.println(c.ordinal()); //类似于数组的下标 从0开始 
}
}






//======================================================     java中使用移位运算符 代替乘除 2的幂次运算    ======================================================
java中有三种移位运算符


<<      :     左移运算符,num << 1,相当于num乘以2


>>      :     右移运算符,num >> 1,相当于num除以2


>>>    :     无符号右移,忽略符号位,空位都以0补齐




//======================================================     java中字符串操作    ======================================================


对字符串的相加操作 效率 StringBuild > StringBuffer(线程安全) >String.contact  > + 或者 +=
String.subString() 速度快  但是容易引起内存的溢出 ,因为需要保留原来的字符串引用  建议使用 new String(***.substring(...)); 
将基本数据类型转换成字符串 效率  使用 .toString > String.valueOf(数据)  >  数据 + "" (最慢)


//======================================================     java中容器类的使用    ======================================================


由随机get操作的 需要使用ArrayList 不要使用 LinkedList 
有在头部或者尾部有进行新增/删除操作的要用LinkedList 不能使用ArrayList  尤其是在头部删除元素的场景 不能使用ArrayList
对LinkedList进行遍历操作的时候 要么使用 foreach 要么使用 Iterator  不要使用for(int i = 0; i<size ; i++;) 因为get(i) 每次都是需要从头遍历
使用entrySet来遍历Map的key和value比用keySet和ValueSet快很多
对于能预估元素个数的容器对象 尽量在new的时候指定预估最大值 减少底层对象的拷贝开销  
原创粉丝点击