java技巧(一)

[size=large][b] 调试窗口中的变量试图:[/b][/size]
变量是临时存贮在内存中的标示符,可以通过变量的值来获取整个程序错误的原因;
例如:变量为空是就是程序没有运行到该处,变量的值和预期的不一样的话就是逻辑问题.


 [b][size=large]Java变量命名规则[/size][/b]
包名全小写,类名首字母全大写,常量全部大写并使用下划线分割,变量采用驼峰命名法(在变量命名中不要引入容易混淆的字母)

 [b][size=large]提升java性能[/size][/b]

[size=medium]1、 不要在循环条件下计算[/size]

[size=medium]2、 尽量把变量、方法声明为final static 类型[/size]

public String toChineseNum(int num){
String[] cns = {"1","2","3","4"};

return cns[num];
}


变为:

final static  String[] cns = {"1","2","3","4"};
public String toChineseNum(int num){

return cns[num];
}


[size=medium]3、 缩小变量的作用范围[/size]

关于变量,能定义在方法内的就定义在方法内,能定义在一个循环体内的就定义在循环体内,能放在一个try......catch块内的就放置在该块内,其目的就是加快GC的回收;

[size=medium]4、 频繁字符串操作使用StringBuilder或StringBuffer
StringBuilder的append()比String的“+”性能要好;[/size]

[size=medium]5、 覆盖Exception的fillInStackTrace方法[/size]

FillInStackTrace方法是用来记录异常时的栈信息的,这是非常耗时的动作,
Class MyException extends Exception{
Public Throwable fillInStackTrace(){
Return this;
}


[size=medium]6、 如非必要,不要克隆对象[/size]

一般情况下new生成的对象比clone生成的性能要好得多

 [size=large][b]Java多线程和并发[/b][/size]

[size=medium]1、 不推荐覆写start方法,如果覆写我们调用start方法时,整个应用程序中只有一个主线程运行,并不会创建任何其他线程,对于我们来说只需要实现多线程的逻辑即可(run方法体);[/size]


[size=medium]2、 启动线程前stop方法是不可靠的,我们只要在判断条件中调用start()即可;[/size]

[size=medium]3、 使用stop时不能直接调用,stop比较粗暴不管线程执行玩没有就终止,我们可以使用如下方法:[/size]

(1)使用自定义的标志位决定线程的执行情况:

public class SafeStopThread extends Thread {

// 此变量必须加上volatile
private volatile boolean stop = false;

@Override
public void run() {

// 判断线程是否运行
while (stop) {

}
super.run();
}

// 线程终止
public void terminate() {
stop = true;
}

}


(2)如果是线程池(ThreadPoolExecutor)可以通过shutdown方法逐步关闭池中的线程

[size=medium]4、线程优先级只使用三个等级[/size]

		public class Thread implements Runnable{
// 最低优先级
public final static int MIN_PRIORITY = 1;
// 普通优先级,默认值
public final static int MORM_PRIORITY = 5;
// 最高优先级
public final static int MAX_PRIORITY = 10;
}


 [size=large][b]数组和集合[/b][/size]

[size=medium]1、 性能考虑,数组是首选,对于基本数据类型进行求和计算时,数组的效率是集合的10倍;[/size]

如:
public static int sum(int[] datas) {

int sum = 0;
for (int i = 0; i < datas.length; i++) {
sum += datas[i];
}
return sum;
}

public static int sum(List<Integer> datas) {

int sum = 0;
for (int i = 0; i < datas.size(); i++) {
sum += datas.get(i);
}
return sum;

}

List相当于数组做了装箱和拆箱的动作;

 [size=large][b]类、对象和方法[/b][/size]

[size=medium]1、 不要主动进行垃圾回收(System.gc),在system.gc时要停止所有的响应,才能检查是否有可回收的对象,所以,即使经常出现内存溢出也不要调用,内存溢出是可分析的,是可以找出原因的;[/size]


[size=medium]2、 推荐覆写toString(),java默认的toString()不是很友好,打印出来的(person@1fc4bec格式:类名+@+hashCode),我们可以覆写一下:[/size]

public String to String (){
return String.format("%s.name=%s", this.getClass(),name);
}



有这样的输出才好dubug,当Bean的属性较多时,自己实现就不可取了,但是有apache的commons工具包中的toStringBuilder类;


[size=medium]3、 使用静态内部类提高封装性[/size]

(1)
public class Person {

private String name;

private String home;


public Person(String _name) {
name = _name;
// TODO Auto-generated constructor stub.
}

/** home、name的getter、setter方法省了*/

public static class Home(){
private String address;
private String tel;

public Home(String _address, String _tel){
address = _address;
tel = _tel;

}

/** address\tel的gettter和setter方法省了*/
}


使用:
public static void main(String[] args) {
Person p = new Person("张三")

p.setHome(new Person.Home("上海","021"));
}


(2)静态内部类与普通内部类区别

a.静态内部类不持有外部类的引用
b.静态内部类不依赖外部类
c.普通内部类不能声明static的方法和变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值