Java编码经验

1,一行代码做一件事,不要在一行代码里面处理多件事。宁愿多声明几个变量,也要保持代码的清晰,因为代码的声明并不会占多少内存。

例如:
          String tmpa = errIdList.get(i).toString().substring(2);
          String tmpb = errIdList.get(j).toString().substring(2);

          long a = Long.parseLong(tmpa, 16);
          long b = Long.parseLong(tmpb, 16);
          
   if( a>b )
   {
    //……
   }

宁愿声明临时变量tmpa tmpb a b,也不要把一长串代码放到if的判断语句中。

 

 

 

2,把一个方法拆成几个方法:

 类class
 {
  方法1()
  {}


  方法2()
  {}

  主函数main()
  {
   //调用方法1;
   //调用方法2;
  }

 }

如果上述方法1或者方法2里面有大量代码做了多件事,可以继续细分:


 类class
 {
  方法1.1()
  {}

  方法1.2()
  {//调用方法1.1}

  方法1.3()
  {//调用方法1.2}

  方法2.1()
  {}

  方法2.2()
  {//调用方法2.1}

  主函数main()
  {
   //调用方法1.3;
   //调用方法2.2;
  }

 }

 

 

 

3,缓冲区的使用:
(1)读取文件时可使用BufferedReader;

(2)字符串写入文件 StringBuffer;
如果是将“字符串1”写入文件,可以直接用PrintWriter.print();
根据需要,如果涉及大量字符串拼接操作,使用StringBuffer可以提高效率。如果要将“字符串1”+“字符串2”+“字符串3”写入文件,要么先连接字符串再写入,要么调用三次print()方法连续写入,但是都不可取。可以如下:

   //使用字符串缓冲区,按行写文件
   StringBuffer strBuff = new StringBuffer(0);
   for(int i = 0; i < errIdList.size(); i++)
   {
    //将需要写入的一整行添加到缓冲区  
    strBuff.setLength(0);
    strBuff.append("字符串1").append("字符串2").append("字符串3");  
    
    /*等同于:
    strBuff.append("字符串1");
    strBuff.append("字符串2");
    strBuff.append("字符串3");
    */
         
   //再一次性从缓冲区写入文件   
          log.println(strBuff.toString());
          log.flush();   
   }

(3)如何清空StringBuffer:

有两种方式:buff.setLength(0);buff.delete(0,buff.length);  

(4)什么时候使用StringBuffer:

一般在拼接字符串操作时使用,避免多次产生新的String对象。如果在多线程下的话使用StringBuffer,单线程的话可使用StringBulder。

(5)在对字符串进行插入操作时,也可以考虑使用StringBuffer的insert()方法。

例如:

int end=str.length();    //定位结束位置
StringBuilder strBuffer=new StringBuilder(str);
while(end>3){
strBuffer.insert(end-3,',');     //向字符串插入逗号得到类似"1,234,567"的新字符串
end-=3;
}
return strBuffer.toString();

 

 

 

4,有多个并列的for循环时,循环变量i在各自中声明,不要全局定义。
for(int i; )
{}
for(int i;)
{}
for(int i;)
{}

 

 

 

5,colletions.sort()方法的使用
(1)基本变量的比较
(2)自定义对象的比较

 

 

 

6,排序方式的选择:
一般冒泡排序较多;
具体情况具体分析(比如目标序列“基本上是”一个升序)(比如序列元素的多少);

 

 


7,properties文件的读取,可以方便地借用Properties类,调用其方法.propertyNames()、.getProperty();

 

 

 

8,文件读取处理:

(1)文件读取,如果是按行读取成字符串,要考虑特殊情况的出现,比如要提取.h文件的宏定义行,请考虑C语言中宏定义的换行(一行宏定义写成两行或者多行);
(2)如果采用.substring()方法对字符串处理,请考虑:标记是否准确,是否会移位,是否会受到注释的干扰。
(3)需要考虑到程序的易用性,当文件格式发生细微变动时,程序依旧能够正常处理。

(4)可以使用.split()方法,结合正则表达式来精确分割字符串。

 

 


9,
(1)使用System.arraycopy()对数组进行复制赋值,提高效率,比循环赋值快1倍。
(2)int[] rows = new int[必须指明长度]
(3) int[] a = xxxxx;
        int[] b = xxxxx;
        a = b;  //把数组b的地址传给了a
(4) int[] a = xxxxx;
        int[] b = xxxxx;
        System.arraycopy(a,0,b,0,length); //把数组b的元素值复制到数组a中。

 

 


10,将Object类型转换为int类型:
(1) Integer.parseInt(String.valueOf(Object object));  //先转换为String

(2)Integer.parseInt((Object object).toString());
(3) ((Integer)(Object object)).intValue();    //先转换为Integer

 

 

 

11,replaceAll与replace的区别:
(1)replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);

        replaceAll的参数是regex,即基于规则表达式的替换,比如,可以通过replaceAll("//d", "*")把一个字符串所有的数字字符都换成星号;
(3)相同点是都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串,如果只想替换第一次出现的,可以使用
replaceFirst(),这个方法也是基于规则表达式的替换,但与replaceAll()不同的时,只替换第一次出现的字符串;
(4)另外,如果replaceAll()和replaceFirst()所用的参数据不是基于规则表达式的,则与replace()替换字符串的效果是一样的,即这两者也支持字符串的操作;
(5)还有一点注意:执行了替换操作后,源字符串的内容是没有发生改变的.

举例如下: 
        String src = new String("ab43a2c43d");

        System.out.println(src.replace("3","f"));=>ab4f2c4fd.
        System.out.println(src.replace('3','f'));=>ab4f2c4fd.
        System.out.println(src.replaceAll("//d","f"));=>abffafcffd.
        System.out.println(src.replaceAll("a","f"));=>fb43fc23d.
        System.out.println(src.replaceFirst("//d,"f"));=>abf32c43d
        System.out.println(src.replaceFirst("4","h"));=>abh32c43d.

 

 

 

12,Long.decode()方法:

Long.decode可以解析以0x,0X,#,0开头的字符串转换为long型,分别表示这个字符串是16或8进制的数字字符串。而valueOf只能解析纯数字的10进制字符串。
例如:
        System.out.println(Long.decode("011")); // 8进制,输出9.
        System.out.println(Long.decode("#11")); // 16进制,输出17.
        System.out.println(Long.decode("0X11"));// 16进制,输出17.
        System.out.println(Long.decode("0x11"));// 16进制,输出17.
        System.out.println(Long.decode("11"));  // 10进制,输出11.
       
        System.out.println(Long.valueOf("011")); // 输出11.
        System.out.println(Long.valueOf("#11")); // 出错.
        System.out.println(Long.valueOf("0X11"));// 出错.
        System.out.println(Long.valueOf("0x11"));// 出错.
        System.out.println(Long.valueOf("11"));  // 输出11.

 

 

 

13,

清空有两种方式:buff.setLength(0);buff.delete(0,buff.length);
一般在拼接字符串操作时使用,如果在多线程下的话使用StringBuffer,单线程的话使用StringBulder

 

 

 

14,

      (1)将数字转换成字符串   

int  i  =   7 ;
double  d  =   13.56 ;
String str1,str2;
str1 
=  Integer.toString(i);
str2 
=  Double.toString(d);
执行以后,str1存的字符串是
" 7 " ,str2存的字符串是 " 13.56 " .

       (2)将字符串转换成数值

String str1  =   " 3532 " ;
String str2 
=   " 187.863 " ;

Integer m;
Double n;

=  Integer.valueOf(str1);     // 将String类型转换成Integer类型
=  Integer.valueOf(str2);      // 将String类型转换成Double 类型

int  i  =  m.intValue();                // 将Integer类型转换成int类型
double  d  =  n.doubleValue(); 

执行以后,整型变量i为3532,浮点型变量为187.
863

 

        (3)从字符串转换成数值的第2种办法

String str1  =   " 3532 " ;
String str2 
=   " 187.863 " ;

int  i  =  Integer.praseInt(str1);
double  d  =  Double.praseDouble(str2);

执行以后,整型变量i为3532 ,浮点型变量d为187.
863

 

          (4)日期类型转换

// 把字符串转化成日期类型
import  java.sql.Date;
       Date date 
=   new  Date( 0 );
       date.valueOf(
" 1983-09-09 " );


// 把日期类型转换成字符串类型
import  java.sql.Date;
        Date date 
=   new  Date( 0 );
       date.valueOf(
" 1983-09-09 " ).toString();

 

         (5)int转成Integer

int  i = 0 ;
Integer temp 
=   new  Integer( i );

 

 

15,

获取类的唯一实例:

    /**
     * 获得类的唯一实例
     */
    public static synchronized CDTEmfNeMsgProcessor getInstance()
    {
        if( instance == null)
        {
            instance = new CDTEmfNeMsgProcessor();
        }
        return instance;
    } 

 

在其它类中要调用此类的方法或者字段,不需要另外再去“CDTEmfNeMsgProcessor cdtEmfNeMsgProcessor = new CDTEmfNeMsgProcessor () ”,可以直接“CDTEmfNeMsgProcessor.getInstance().方法/字段”。

 

 

16,

刚刚遇到了一个异常抛出,最后定位发现问题在于——目标JTable会定时刷新,刷新过程会先清空内容然后重新加载一次,异常抛出正是因为在鼠标点击列表选中行时JTable正在清空,所以刷新时间越短,异常抛出的几率越大。

原来的列表清空方法如下:

        int count = mainLogTableModel.getRowCount();
        for (int i = 0; i < count; i++) {
            mainLogTableModel.removeRow(0);
        }

 

查了一些资料提供了其它的列表清空方法:

        mainLogTableModel.getDataVector().clear();
        mainLogTable.updateUI();

        //通知所有侦听器,表的所有行单元格值可能已更改。
        mainLogTableModel.fireTableDataChanged();

 

但是只修改清空方法不能完全解决问题,只是减小了异常抛出的几率,因为后者清空效率高于前者,但是存在鼠标点击选中列表的某一行时,该行因为清空而已经不存在了的情况,从而抛出异常。解决方法还在思考中,但是这一个地方已经值得注意了。

另外,新的清空方法中代码语句mainLogTable.updateUI();的作用是什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值