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),
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的时候指定预估最大值 减少底层对象的拷贝开销
//====================================================== 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的时候指定预估最大值 减少底层对象的拷贝开销
阅读全文
0 0
- java中编程技巧
- Java Applet编程技巧
- JAVA编程规范技巧
- Java编程技巧
- Java编程小技巧
- Java、Android编程技巧
- java 编程小技巧
- Java编程小技巧
- java高级编程技巧
- java编程技巧
- java 编程技巧
- 编程技巧:在Java应用开发中如何使用线程
- java编程中的一些技巧(持续更新中)
- Java 编程小技巧集锦
- Java编程技巧(信号量,管道)
- Java编程技巧:列表排序
- Java数据库编程中的技巧
- Java数据库编程中的技巧
- PHP进程通信基础——信号
- java el 表达式 null 空值
- 有关异或符号'^'在c++编程中的应用
- Linux sort命令中文手册(info sort翻译)
- linux yum方式安装mysql
- java中编程技巧
- 如何使用ABBYY FineReader 14填写表格
- C++事务型内存技术规范:表格及代码块
- linux在文件夹中查找文件包含的字符串,并进行相应的替换
- JAVASE回顾(1)-数据类型
- 滑动窗口
- 使用bazel 编译tensorflow serving时报错:fatal error: Python.h: No such file or directory
- Mybatis中XML开发和注解开发 个人理解
- Solr5之solrconfig.xml配置详解