`
步青龙
  • 浏览: 297787 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
72ba33fb-eefe-3de1-bd65-82a6e579265d
Java面试
浏览量:0
社区版块
存档分类
最新评论

探索Java身体内部

阅读更多
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

 1、内存分配: 
共有五个地方来存储数据,分别是: 
a.寄存器; 
b.堆栈(stack):局部变量; 
c.堆(heap):存放所有的Java对象;(编译器不需要知道存储的数据在堆里存活多长时间); 
d.常量存储:常量值通常直接存放在程序代码的内部; 
e.非RAM存储: 
   流对象:对象转化成字节流,通常被发送给另一台机器; 
   持久化对象:对象被存放于磁盘上。 
2.特例:基本类型 
创建一个并非是引用的“自动”变量。这个变量直接存储“值”,并置于堆栈中。 
Java SE5的自动包装功能将自动地将基本类型转换为包装器类型(Character ch = 'x';) 

 

Java提供了两个用于高精度计算的类:BigInteger和BigDecimal 

BigInteger: 
BigInteger:支持任意精度的整数。 
BigInteger(String val) 
          将 BigInteger 的十进制字符串表示形式转换为 BigInteger。 
BigInteger(String val, int radix) 
          将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。 

例如: 
BigInteger bigInt = new BigInteger("11",2); 
System.out.println("the big number is: " + bigInt); 
结果显示: 
the big number is: 3 

BigDecimal: 
BigDecimal:支持任何精度的定点数。 

网上摘录技巧集: 
1、当你在数据库里插入一条数据是6.00时,在显示时却是6.000000000000000000000。 
解决方法:使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为String(如果利用double作为参数的构造函数,无法精确构造一个BigDecimal对象),然后构造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。 
即: 
import java.math.BigDecimal; 
/** 
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 
* 确的浮点数运算,包括加减乘除和四舍五入。 
*/ 
public class Arith{ //默认除法运算精度 
     private static final int DEF_DIV_SCALE = 10; //这个类不能实例化 
     private Arith(){ 
    } 
    /** 
     * 提供精确的加法运算。 
      * @param v1 被加数 
      * @param v2 加数 
      * @return 两个参数的和 
      */ 
    public static double add(double v1,double v2){ 
        //将传入的double转换为String 
        //如果利用double作为参数的构造函数,无法精确构造一个BigDecimal对象 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        //再将运算结果转换为double 
        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 one = new BigDecimal("1"); 
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
    } 
}; 
2、因此,使用这个类BigDecimal,需要注意在构造方法中如果传入double,那么不能保证他的精确程度。 
如: 
           BigDecimal bigDec = new BigDecimal(6.217); 
BigDecimal bigDecAdd = new BigDecimal(6.3229); BigDecimal bigDecResult = bigDec.add(bigDecAdd); System.out.println("the big decimal is: " + bigDecResult); 
结果却是: 
the big decimal is: 12.53989999999999938040673441719263792037963867187500 
如果传入的是String类型,则: 
the big decimal is: 12.5399

 

2:

 

 

        Integer a = 127;
        Integer b = 127;
		Integer a2 = 128;
		Integer b2 = 128;
		System.out.println(a == b);// true
		System.out.println(a2 == b2);//false

 后面的注释就是结果,为什么?请看源码

 

    public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }

 看IntegerCache ,它是Integer的一个私有静态内部类,对Integer进行缓存处理

 

 

    private static class IntegerCache {
        static final int high;
        static final Integer cache[];

        static {
            final int low = -128;

            // high value may be configured by property
            int h = 127;
            if (integerCacheHighPropValue != null) {
                // Use Long.decode here to avoid invoking methods that
                // require Integer's autoboxing cache to be initialized
                int i = Long.decode(integerCacheHighPropValue).intValue();
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - -low);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }
 

所以我们进行对象比较时最好还是使用equals,便于按照自己的目的进行控制。

注意静态代码块的代码:

 

            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

  由于cache[]在IntegerCache类中是静态数组,也就是只需要初始化一次,即static{......}部分,

所以,如果Integer对象初始化时是-128~127的范围,就不需要再重新定义申请空间,
都是同一个对象---在IntegerCache.cache中,这样可以在一定程度上提高效率。

 

顺便把chm版本的Thigking in Java传上来

分享到:
评论

相关推荐

    JAVA程序员的心得

    作为JAVA程序员,应当保持好奇心和求知欲,不断探索新的技术栈和技术框架,如Spring Boot、MyBatis等。同时,也要关注计算机科学的基础理论,比如数据结构与算法、设计模式等,这些基础知识不仅能帮助我们更好地理解...

    java手机游戏 贪吃蛇 源代码.zip

    内部类是Java的一个特色,它可以被定义在一个类的内部,提供了一种封装和隐藏复杂性的手段。在这个游戏里,内部类可能用于表示游戏中的不同实体,如蛇、食物等。 4. **图形用户界面(GUI)**: 手机游戏通常会有一...

    新手学习opencv--基于Hog的视频行人检测

    每个细胞单元统计其内部像素的梯度信息。 3. **方向梯度直方图**:在每个细胞单元内,计算像素的梯度方向,并构建一个直方图。通常使用9或16个方向。 4. **块归一化**:为了处理光照变化和局部阴影,将相邻的细胞...

    完整的贪吃蛇项目

    《贪吃蛇游戏项目:全面探索面向对象编程》 贪吃蛇游戏,作为一个经典的小型游戏,它在编程教育中常常被用作实践面向对象编程(Object-Oriented Programming, OOP)理念的实例。这个完整的贪吃蛇项目,不仅包含了...

    LeagueOfWorkout:在每场联赛比赛后通过锻炼联盟锻炼身体!

    《在每场联赛比赛后通过锻炼联盟锻炼身体:探索Android应用开发的魅力》 "LeagueOfWorkout:在每场联赛比赛后通过锻炼联盟锻炼身体!"这个标题揭示了一个以运动和健康为主题的Android应用程序。这款应用旨在激励用户...

    大创项目申报表1

    项目成员包括姚悦、仇思宇和钟婷,他们都是南京师范大学计算机科学与技术学院的在读学生,具备扎实的编程基础,熟悉C、C++、Java、Python等编程语言,有实际项目开发经验。指导教师王琼副教授,有丰富的教学和科研...

    Pro/E学习资料

    通过深入理解并正确配置其内部设置,用户能够显著提升工作效率和设计精度。本文将详细探讨Pro/E配置文件选项的重要性和具体设置方法,帮助读者实现个性化学习与工作流程优化。 #### 配置文件选项的重要性 配置文件...

    alarm-app-wakemeup:具有其他功能的警报应用程序

    "alarm-app-wakemeup-master"这个压缩包文件名暗示了这是项目源代码的主分支,意味着如果你对应用的内部机制感兴趣,可以下载并研究源码,学习如何利用Java来实现类似的功能,这对于Android开发者来说是一份宝贵的...

    大数据技术分享 Spark技术讲座 利用Apache Spark加速脑组织模拟数据分析 共27页.pdf

    大脑作为人体中最复杂的器官之一,其内部结构和功能机制至今仍有许多未知之处。为了更好地理解和治疗各类脑疾病,以及促进神经机器人学、神经形态计算和人工智能的发展,科学家们不断探索新的方法和技术。本研究的...

    ActiveMQ 5.7源码API

    Apache ActiveMQ是开源的、高性能的、功能丰富的消息中间件,它遵循JMS(Java Message Service)规范,为分布式系统提供了可靠的消息传递服务。ActiveMQ 5.7版本是其重要的一个里程碑,其中包含了丰富的功能和优化。...

    光电传感器的测量设计研究 6.11 9000 3.5%.docx

    内光电效应传感器(如光敏电阻、光电池)则是光能直接改变材料内部的电导率,产生电信号。 1.2 光电传感器的研究现状 近年来,随着科技的发展,光电传感器的研究方向主要集中在提高灵敏度、拓宽响应波段、降低暗...

    50 Activities for Developing People Skills

    通过此类活动,团队成员可以学会如何倾听他人意见,改善团队内部的沟通质量。 #### 8. 控制身体语言(Controlling Body Language) - **定义**:强调使用肢体语言来加强口头表达的重要性。 - **应用**:无论是面...

Global site tag (gtag.js) - Google Analytics