• Dao持久层定义sql语句拼接参数之String和StringBuffer区别 与 数组、List和ArrayList的区别


    Dao层代码:
    @Override
    public int findTotalCount(int cid,String rname) {
    //String sql = "select count(*) from tab_route where cid = ?";
    //1.定义sql模板
    String sql = "select count(*) from tab_route where 1=1 ";
    StringBuilder sb = new StringBuilder(sql);

    List params = new ArrayList();//条件们
    //2.判断参数是否有值
    if(cid != 0){
    sb.append( " and cid = ? ");

    params.add(cid);//添加?对应的值
    }

    if(rname != null && rname.length() > 0){
    sb.append(" and rname like ? ");

    params.add("%"+rname+"%");
    }

    sql = sb.toString();


    return template.queryForObject(sql,Integer.class,params.toArray());
    }

    String和StringBuffer区别

    转载自:http://pengcqu.iteye.com/blog/487538

    Java笔试题经常考到“String和StringBuffer的区别”,对于二者区别网上已经有很多,实际应用中也要主要到二者的区别,二者性能的差别很大。本人通过小例子来比较二者性能,效果显著!

    String:是对象不是原始类型.
               为不可变对象,一旦被创建,就不能修改它的值.
               对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
               String 是final类,即不能被继承.

    StringBuffer:
               是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
               它只能通过构造函数来建立,
              StringBuffer sb = new StringBuffer();
              对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.通过它的append方法向其赋值.

              sb.append("hello");

    字符串连接操作中StringBuffer的效率要明显比String高:

    String对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.

    StringBuffer对象实例化后,只对这一个对象操作。
     

    我这里写了一个小的例子,来测试String和StringBuffer在时间和空间使用上的差别。

    复制代码
     1 public class Test {  
     2     public static void main(String args[]) {  
     3           
     4         String str = "abc";  
     5         StringBuffer sb = new StringBuffer("abc");  
     6         Runtime runtime = Runtime.getRuntime();  
     7         long start = System.currentTimeMillis();  
     8         long startFreememory = runtime.freeMemory();  
     9         for (int i = 0; i < 10000; i++) {  
    10             str += i;  
    11             //测试StringBuffer时候把注释打开  
    12             //sb.append(i);  
    13         }  
    14         long endFreememory = runtime.freeMemory();  
    15         long end = System.currentTimeMillis();  
    16         System.out.println("操作耗时:" + (end - start) + "ms," + "内存消耗:"  
    17                 + (startFreememory - endFreememory)/1024 + "KB");  
    18     }  
    19 } 
    复制代码

    测试结果:

    使用String做10000次向一字符串后添加字符串

    操作耗时:1872ms,内存消耗:1301KB

    使用StringBuffer做10000次向一字符串后添加字符串

    操作耗时:15ms,内存消耗:162KB

    差别显著!

    ================================================================

    数组、List和ArrayList的区别 (转载自:https://www.cnblogs.com/mabingxue/p/9176324.html)

    有些知识点可能平时一直在使用,不过实际开发中我们可能只是知其然不知其所以然,所以经常的总结会对我们的提高和进步有很大的帮助,这里记录自己在工作之余的问题,持续更新,欢迎高手斧正.

      数组、List和ArrayList的区别

      数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单,比如:

    string[] s=new string[3];
    //赋值
     s[0]="a"; s[1]="b"; s[2]="c";
    //修改
     s[1]="b1";

      但是数组也存在一些不足的地方。比如在数组的两个数据间插入数据也是很麻烦的,还有我们在声明数组的时候,必须同时指明数组的长度,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。这样如果在声明数组时我们并不清楚数组的长度,就变的很麻烦了。C#中最先提供了ArrayList对象来克服这些缺点。

      ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加,插入和移除.比如:

    复制代码
    复制代码
    ArrayList list = new ArrayList();
    //新增数据
     list.Add("abc"); list.Add(123);
    //修改数据
     list[2] = 345;
    //移除数据
     list.RemoveAt(0);
    //插入数据 
    list.Insert(0, "hello world");
    复制代码
    复制代码

      从上面示例看,ArrayList好像是解决了数组中所有的缺点,那么它应该就是完美的了,为什么在C#2.0后又会出现List呢?

      在list中,我们不仅插入了字符串"abc",而且又插入了数字123。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据都当作为object类型来处理。这样,在我们使用ArrayList中的数据来处理问题的时候,很可能会报类型不匹配的错误,也就是说ArrayList不是类型安全的。既使我们保证在插入数据的时候都很小心,都有插入了同一类型的数据,但在使用的时候,我们也需要将它们转化为对应的原类型来处理。这就存在了装箱与拆箱的操作,会带来很大的性能损耗。

      装箱与拆箱的概念: 简单的来讲: 装箱:就是将值类型的数据打包到引用类型的实例中 比如将int类型的值123赋给object对象o

                        int i=123; object o=(object)i;

                      拆箱:就是从引用数据中提取值类型 比如将object对象o的值赋给int类型的变量i

                        object o=123; int i=(int)o;

               装箱与拆箱的过程是很损耗性能的。

      正是因为ArrayList存在不安全类型与装箱拆箱的缺点,所以在C#2.0后出现了泛型的概念。而List类是ArrayList类的泛型等效类。它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。 比如:

    复制代码
    复制代码
    List<int> list = new List<int>();
    //新增数据
     list.Add(123);
    //修改数据 
    list[0] = 345;
    //移除数据
    list.RemoveAt(0);
    复制代码
    复制代码

      上例中,如果我们往List集合中插入string字符"hello world",IDE就会报错,且不能通过编译。这样就避免了前面讲的类型安全问题与装箱拆箱的性能问题了。

      同时 List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。 

    List list;     //正确   list=null; 
    List list=new List();    //   是错误的用法

      List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。 而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。 

      List泛型的好处: 
      通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从您转移给了编译器。不需要编写代码来检测数据类型是否正确,因为会在编译时强制使用正确的数据类型。减少了类型强制转换的需要和运行时错误的可能性。泛型提供了类型安全但没有增加多个实现的开销。

  • 相关阅读:
    滚动数组
    leetcode动态规划
    初中数学学习
    LCS最长公共子序列
    Help Jimmy
    IntelliJ IDEA 设置和查看内存使用
    无法嵌入互操作类型“ApplicationClass”。请改用适用的接口
    代码重构与单元测试——重构6:使用“多态”取代条件表达式(九)
    一个屌丝程序猿的人生(一百二十六)
    一个屌丝程序猿的人生(一百二十五)
  • 原文地址:https://www.cnblogs.com/Yi-ling/p/14006917.html
Copyright © 2020-2023  润新知