文档章节

Java基础方面的陷阱(1)

英年求肥
 英年求肥
发布于 2013/07/13 02:39
字数 856
阅读 70
收藏 2

01. 找奇数 ★★★☆☆


    不能用 i % 2 == 1 来当条件,因为需要考虑负数。
    判断一个数是否为奇数的条件应该是 “不能整除”。
    而不是 除了2之后 等于 1。

public static boolean isOdd(int i){
        return i % 2 != 0; // “不能整除”
}
public static void main(String[] args){
   syso(isOdd(-1)); // true
   syso(isOdd(0)); // false
   syso(isOdd(1)); // true
   syso(isOdd(2)); // false
}


02. 浮点数相减 ★★★★★


public static void main(String[] args){
 System.out.println(2.0 - 1.1); // = 0.89999999  不符合需求,应该是0.9才对
 System.out.printf("%.1f", 2.0 - 1.1); // = 0.9  JDK API特性使然
 BigDecimal value = new BigDecimal("2.0")
                           .subtract(new BigDecimal("1.1"));
 syso(value);
}


03. 长整除 ★★★★★


public static void main(String[] args){
        final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000; // 微秒
        final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000; // 毫秒
        syso(MICROS_PER_DAY / MILLIS_PER_DAY); // = 5 错误 应该是1000
        
        /*
            java语法中 对于乘法两端的常数 24和60 会默认为int类型
            这样一直乘下去 就会出现越界情况
            正确的解决方案应该是:
                强调其为Long类型的数据
        */
        final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000; // 微秒
        final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000; // 毫秒
        syso(MICROS_PER_DAY / MILLIS_PER_DAY); // = 1000
    }


04. 互换内容 ★★☆☆☆


public static void main(String[] args){
        // 不需要定义temp变量 实现数值互换
        int x = 5;
        int y = 8;
        
        x = x ^ y; // 第一次 x = 13 ,y = 8 不变
        y = x ^ y; // 第二次 x = 13 , y = 5, 原理为 一个数异或同一个数两次 结果还是原来的值
        x = x ^ y; // 第三次 x = 8, y = 5 依旧为5
        syso("x = " + x + ", y = " + y); // x=0, y=1984
    }


05. 字符串和字符 ★★★★★


public static void main(String[] args){
        syso("H" + "a"); // Ha
        syso('H' + 'a'); // 169
        /*
            由于char类型的数据在加减乘除运算中,
            会自动提升为int类型的数据。
            使用ascii表来存储char类型数据具体的值。
            所以就会变成
            'H' = 72
            'a' = 97
            所以等于 169
        */
    }


06. 字符数组 ★★★★☆


public static void main(String[] args){    
        String letters = "ABC";
        char[] numbers = {'1','2','3'};
        System.out.println(letters + "easy as " + numbers);  // ABC easy as [C@de6ced
        System.out.println(numbers); // 123
        /*
            println()该方法为重构,可以传递String类型参数,
            也可传递其它类型参数。
            当与字符串拼接的时候,println()方法默认传递的参数为字符串类型。
            那么,数组会调用自身的toString()方法,即打印该数组的哈希码
            如果println()中传递的参数为char[]数组,
            默认将一个字节数组中的所有数,一一打印出来,便成了 123.
        */
        
    }


07. 转义字符 ★★☆☆☆


public static void main(String[] args){    
        // \u0022 是双引号的Unicode转义字符
        System.out.println("a\u0022.length()+\u0022b".length());// = 2
        // 说白了 就是 "a".length() + "b".length() = 2
    }


08. 打印输出类名 ★★☆☆☆


public static void main(String[] args){    
        
        System.out.println(
            MyClass.class.getName()
                .replaceAll(".","/") + ".class"
        );
        // 特殊字符必须转义 不然输出结果会事与愿违u
        System.out.println(
            MyClass.class.getName()
                .replaceAll("\\.","/") + ".class"
        );
        
    }


09. 随机数问题 ★★★★☆


public class RandomTest{
        private static Random rnd = new Random();
        public static void main(String[] args){    
            StringBuffer word = null;
            switch(rnd.nextInt(2)){
                case 1: word = new StringBuffer('P');
                    break;
                case 2: word = new StringBuffer('G');
                    break;
                default: word = new StringBuffer('M');
            }
            word.append('a');
            word.append('i');
            word.append('n');
            System.out.println(word); // 输出结果为: ain
            /*
                该题有3个知识点
                1. case语句后面一定要加上break。
                2. char类型的数据会自动提升为int类型,所以需要加上双引号,
                    将其改为字符串数据类型。
                3. rnd.nextInt(2) 得出的结果是 0到2 不包含2
                    也就是只有 0 1
                    所以就算都改正了,但是Gain也一定不会出现的,因为条件不允许。
                switch(rnd.nextInt(2)){
                case 1: word = new StringBuffer("P");
                    break;
                case 2: word = new StringBuffer("G");
                    break;
                default: word = new StringBuffer("M");
            }
            */
        
        }
    }

本文转载自:

共有 人打赏支持
英年求肥
粉丝 1
博文 12
码字总数 8366
作品 0
广州
程序员
私信 提问
Java自动装箱与拆箱及其陷阱

在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时这种特性也留有一个陷阱。开发者如果不注意,就会很容易跌入...

LCZ777
2014/07/26
0
0
JetBrains 开源其 Kotlin 语言,基于 JVM 的新编程语言

近日,JetBrains宣布将其Kotlin编程语言开源,这是一个针对Java和JavaScript平台的现代编程语言,该语言的设计目的是成为Java语言的替代品。 Kotlin 是JetBrains在2010年推出的基于 JVM 的新...

虫虫
2012/02/16
2.3K
11
Kotlin 1.0 Beta Candidate 发布,基于 JVM 的编程语言

Kotlin 1.0 Beta Candidate 发布,更新主要集中在以下几个方面: imports from objects, new safer collection interfaces, inlining for Java constants, better support for Java statics,......

oschina
2015/10/23
832
5
Kotlin 1.0 Beta 2 发布,基于 JVM 的编程语言

Kotlin 1.0 Beta 2 发布,此版本主要是 bug 修复和标准库方面的改进。 语言方面改进:类型参数强制约束 single-instantiation inheritance;改进 Diagnostics;改进编译器 库改进:为标准库清...

oschina
2015/11/17
1K
8
Java程序设计经典300例

《Java程序设计经典300例》共分为3篇。 第1篇 基础篇(第1~5章)本篇主要内容包括:Java语言基础、流程控制、数组、字符串和面向对象编程。通过本篇的学习,读者可以掌握Java开发环境的配置...

请叫我院长
2013/12/03
402
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
45分钟前
1
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
48分钟前
1
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
1
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
1
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部