• AJPFX总结java开发常用类(包装,数字处理集合等)(一)


    一:首谈java中的包装类

         Java为基本类型提供包装类,这使得任何接受对象的操作也可以用来操作基本类型,直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元.但在java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相关的方法,java为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了.这些包装类有:Boolean,Byte,Short,Character,Integer,Long,Float,Void等

    值得说明的是,java是可以直接处理基本类型的,但是在有些情况下我们需要将其作为对象来处理,这时就需要将其转化为包装类了.所有的包装类(Wrapper Class)都有共同的方法,他们是:

    (1)带有基本值参数并创建包装类对象的构造函数.如可以利用Integer包   装类创建对象,Integer obj=new Integer(145);

    (2)带有字符串参数并创建包装类对象的构造函数.如new Integer("45");

    (3)生成字符串表示法的toString()方法,如obj.toString().

    (4)对同一个类的两个对象进行比较的equals()方法,如obj1.eauqls(obj2);

    (5)生成哈稀表代码的hashCode方法,如obj.hasCode();

    (6)将字符串转换为基本值的 parseType方法,如Integer.parseInt(args[0]);

    (7)可生成对象基本值的typeValue方法,如obj.intValue();

    在一定的场合,运用java包装类来解决问题,能大大提高编程效率.

    包装类的自动装箱,自动拆箱

    所谓装箱,就是把基本类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int型包装成Integer类的对象,或者把double包装成Double,等等。 
    所谓拆箱,就是跟装箱的方向相反,将Integer及Double这样的引用类型的对象重新简化为值类型的数据

    javaSE5.0后提供了自动装箱与拆箱的功能,此功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的方法,决定是否进行装箱或拆箱动作。 
    自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。 

    自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方法。 
    自动装箱,只需将该值赋给一个类型包装器引用,java会自动创建一个对象。例如:Integer i=100;//没有通过使用new来显示建立,java自动完成。

    自动拆箱,只需将该对象值赋给一个基本类型即可,例如

    · int i = 11;  

    · Integer j = i; //自动装箱  

    · int k = j //自动拆箱

    然而在Integer的自动装拆箱会有些细节值得注意:

    public static void main(String[] args) {  

        Integer a=100;  

        Integer b=100;   

        Integer c=200;  

        Integer d=200;   

       System.out.println(a==b);   //1  

       System.out.println(a==100); //2     

      System.out.println(c==d);   //3  

      System.out.println(c==200); //4  

       }  
    在java种,"=="是比较object的reference而不是value,自动装箱后,abcd都是Integer这个Oject,因此“==”比较的是其引用。按照常规思维,1和3都应该输出false。但结果是: 
    true 
    true 
    false 
    true
    结果2和4,是因为ac进行了自动拆箱,因此其比较是基本数据类型的比较,就跟int比较时一样的,“==”在这里比较的是它们的值,而不是引用。 
    对于结果1,虽然比较的时候,还是比较对象的reference,但是自动装箱时,java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100); 
    关键就在于这个valueOf()的方法。

    public static Integer valueOf(int i) {     

    final int offset = 128;     

    if (i >= -128 && i <= 127) { // must cache     

    return IntegerCache.cache[i + offset];     

    }     

    return new Integer(i);     

    }     

    private static class IntegerCache {     

    private IntegerCache(){}     

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];     

    static {     

    for(int i = 0; i < cache.length; i++)     

    cache = new Integer(i - 128);     

    }     

    }   
    根据上面的jdk源码,java为了提高效率,IntegerCache类中有一个数组缓存 了值从-128到127的Integer对象。当我们调用Integer.valueOf(int i)的时候,如果i的值是>=-128且<=127时,会直接从这个缓存中返回一个对象,否则就new一个Integer对象。 
    具体如下:

    static final Integer cache[] = new Integer[-(-128) + 127 + 1]; //将cache[]变成静态  

    static {  

            for(int i = 0; i < cache.length; i++)  

            cache = new Integer(i - 128); //初始化cache  

    }  
    这是用一个for循环对数组cache赋值,cache[255] = new Integer(255-128),也就是newl一个Integer(127) ,并把引用赋值给cache[255],好了,然后是Integer b= 127,流程基本一样,最后又到了cache[255] = new Integer(255-128),这一句,那我们迷糊了,这不是又new了一个对象127吗,然后把引用赋值给cache[255],我们比较这两个引 用(前面声明a的时候也有一个),由于是不同的地址,所以肯定不会相等,应该返回false啊!呵呵,这么想你就错了,请注意看for语句给 cache初始化的时候外面还一个{}呢,{}前面一个大大的static关键字,是静态的,那么我们就可以回想下static有什么特性了,只能 初始化一次,在对象间共享,也就是不同的对象共享同一个static数据

    。那么当我们Integer b = 127的时候,并没有new出一个新对象来,而是共享了a这个对象的引用,记住,他们共享了同一个引用!!!,那么我们进行比较a==b时,由于是同一个对象的引用(她们在堆中的地址相同),那当然返回true了!

  • 相关阅读:
    Nginx 负载均衡
    wordpress 页面显示指定分类文章
    Linux 下 wordpress 无法安装插件
    在 Linux 上安装配置 BitTorrent Sync [转]
    nagios 配置 check_traffic 流量监控模块(Server 端)
    install nagios pnp4nagios on centos 6
    bat 脚本处理windows 文件
    Mac 下重新安装配置ibm Lotus 邮箱
    Domino 邮箱服务器接收不存在的邮箱账号的邮件
    Linux 下统计Apache每分钟的并发数
  • 原文地址:https://www.cnblogs.com/AJPFX/p/10867783.html
Copyright © 2020-2023  润新知