• JAVA中需要注意的问题收集版本


    一、java中String和StringBuffered有什么区别?--看到的一个很好的回答

    在我以前的了解中,String是一个final Class, StringBuffer不是。所以对于 String a = "yacht" ,String b = "yacht1" String c = a + b ; 存在一个对象拷贝构造和解析的消耗问题;对于一个StringBuffer来说,StringBuffer sb = new StringBuffer();sb.append("yacht") ; sb.append("yacht1"); 因为StringBuffer是一个可以实例化的类,而且它的内建机制是维护了一个capacity大小的字符数组,所以它的append操作不存在对象的消耗问题,所以我觉得如果存在String连接这种事情,StringBuffer来做会好很多。

           但事情并不是这么简单,看下面代码
           String a = "yacht1" + "yacht2" + "yacht3" + "yacht4";
           StringBuffer sb = new StringBuffer(); sb.append("yacht1") ; sb.append("yacht2"); sb.append("yacht3") ; sb.append("yacht4");  String a = sb.toString();

           如果按照我先前说的看法,红色的效率肯定比蓝色的低,但经过测试不是这样,为什么?这里,我们需要理解程序过程的两个时期,一个是编译时,一个是运行时,在编译时,编译器会对你的程序做出优化,所以红色的String a会被优化成yacht1yacht2yacht3yacht4,而蓝色的StringBuffer只会在运行时才处理。所以效率是不一样的。
           如果代码是这样的:
           String a ; for(int i = 0; i< 100000;i++){ a += String.valueOf(i) ;} 
           StringBuffer sb = new StringBuffer(); for(int i = 0; i< 100000;i++){ sb.append(i) ;} String a = sb.toString(); 
           如果是这种情况的话,红色的效率就大大不如蓝色,区别在哪里,就在于运行时和编译时的优化问题上!

          我们要做一个好的writer,不仅要知道怎么用,还要知道怎么用好,这需要内功的修练,花拳绣腿是招架不住的

     

    二、Java学习之Iterator(迭代器)的一般用法 (转)
     
    迭代器(Iterator)

      迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

      Java中的Iterator功能比较简单,并且只能单向移动:

      (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

      (2) 使用next()获得序列中的下一个元素。

      (3) 使用hasNext()检查序列中是否还有元素。

      (4) 使用remove()将迭代器新返回的元素删除。

      Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

    迭代器应用:

     1  list l = new ArrayList();
    2 l.add("aa");
    3 l.add("bb");
    4 l.add("cc");
    5 for (Iterator iter = l.iterator(); iter.hasNext();) {
    6 String str = (String)iter.next();
    7 System.out.println(str);
    8 }
    9 /*迭代器用于while循环
    10 Iterator iter = l.iterator();
    11 while(iter.hasNext()){
    12 String str = (String) iter.next();
    13 System.out.println(str);
    14 }
    15 */

    关于数位处理的问题:

    JAVA中的小数点处理
    
    保留两位小数{
    方法一:{
    
       double   c=3.154215;
    
       java.text.DecimalFormat myformat=new java.text.DecimalFormat("0.00");
    
       String str = myformat.format(c);    
    }
    
    
    方式二:{
    
       java.text.DecimalFormat   df   =new   java.text.DecimalFormat("#.00"); 
       df.format(你要格式化的数字);
    
       例:new java.text.DecimalFormat("#.00").format(3.1415926)
    
       #.00 表示两位小数 #.0000四位小数 以此类推...
    }
    
    
    方式三:{
    
       double d = 3.1415926;
    
       String result = String .format("%.2f");
    
       %.2f %. 表示 小数点前任意位数   2 表示两位小数 格式后的结果为f 表示浮点型
    }
    
    }
    
    
    四舍五入 {
    
    double   f   =   111231.5585; 
    BigDecimal   b   =   new   BigDecimal(f); 
    //保留2位小数
    double   f1   =   b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue(); 
    }
    
    import java.math.BigDecimal;
    
    public class PreciseCompute {
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;
    
    /**
    * 提供精确的加法运算。
    * @param v1 被加数
    * @param v2 加数
    * @return 两个参数的和
    */
    
    public static double add(double v1, double v2) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.add(b2).doubleValue();
    }
    
    /**
    * 提供精确的减法运算。
    * @param v1 被减数
    * @param v2 减数
    * @return 两个参数的差
    */
    
    public static double sub(double v1, double v2) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.subtract(b2).doubleValue();
    }
    
    /**
    * 提供精确的乘法运算。
    * @param v1 被乘数
    * @param v2 乘数
    * @return 两个参数的积
    */
    public static double mul(double v1, double v2) {
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.multiply(b2).doubleValue();
    }
    
    /**
    * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
    * 小数点以后10位,以后的数字四舍五入。
    * @param v1 被除数
    * @param v2 除数
    * @return 两个参数的商
    */
    
    public static double div(double v1, double v2) {
       return div(v1, v2, DEF_DIV_SCALE);
    }
    
    /**
    * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
    * 定精度,以后的数字四舍五入。
    * @param v1 被除数
    * @param v2 除数
    * @param scale 表示表示需要精确到小数点以后几位。
    * @return 两个参数的商
    */
    public static double div(double v1, double v2, int scale) {
       if (scale < 0) {
        throw new IllegalArgumentException(
          "The scale must be a positive integer or zero");
       }
       BigDecimal b1 = new BigDecimal(Double.toString(v1));
       BigDecimal b2 = new BigDecimal(Double.toString(v2));
       return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    
    /**
    * 提供精确的小数位四舍五入处理。
    * @param v 需要四舍五入的数字
    * @param scale 小数点后保留几位
    * @return 四舍五入后的结果
    */
    public static double round(double v, int scale) {
       if (scale < 0) {
        throw new IllegalArgumentException(
          "The scale must be a positive integer or zero");
       }
       BigDecimal b = new BigDecimal(Double.toString(v));
       BigDecimal ne = new BigDecimal("1");
       return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    }
    

      

     
    欢迎转载,转载请注明出处。本文出自:http://www.cnblogs.com/zdcaolei
    0
  • 相关阅读:
    使用SQL Server Management Studio 创建数据库备份作业
    ClickOnce 获取客户端发布版本号
    在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
    找不到方法:“Void System.Data.Objects.ObjectContextOptions.set_UseConsistentNullReferenceBehavior(Boolean)
    常用操作类
    数据库命名规范
    expression动态构成
    C# 获得当前方法 和 方法调用链 的 方法
    EF架构封装类
    基于微软企业库的分层代码框架
  • 原文地址:https://www.cnblogs.com/zdcaolei/p/2408289.html
Copyright © 2020-2023  润新知