文档章节

Java基础方面的陷阱(1)

英年求肥
 英年求肥
发布于 2013/07/13 02:39
字数 856
阅读 69
收藏 2
点赞 0
评论 0

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简单认识

前言 小编在学习Java方面的基础知识,发现里面有很多是结合之前的语言的特点发展过来的,不同的地方是,Java有它自己的发展和特点。下面小编先简单地做一下总结,结合看过的1-2章的J2SE视频,...

m18633778874 ⋅ 04/01 ⋅ 0

方向选择(嵌入式 大数据 java)

嵌入式:单片机之类的 比如指纹解锁底层就是此技术,反正就是和硬件打交道。 大数据:最近很火的概念技术 有点玄玄乎乎的,前途不好定义,不过门槛也是高的,对算法之类的要求还是比较高的 ...

codingcoge ⋅ 05/03 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

阿里巴巴菜鸟Java一面11个问题,你会几个呢?

近日,w3cschool app开发者头条上分享了阿里菜鸟Java程序员一些面试题。 这吸引了不少程序员小伙伴们的注意。 在分享阿里菜鸟Java程序员面经前,来看下Java面试一些面试经验分享: 0、Java高...

W3Cschool ⋅ 04/03 ⋅ 0

大型互联网架构必备技术——性能调优专题

性能调优 深入内核,直击故障 ,拒绝蒙圈 性能优化如何理解 1、性能基准 2、什么是性能优化 3、衡量标准 JVM调优 1、Jvm虚拟机内存剖析 2、垃圾收集器 3、实战调优案例与解决方案 4、Jvm运行...

Java高级架构 ⋅ 04/15 ⋅ 0

为什么大批的JAVA程序员都是在转大数据

前言 首先JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入IT行业,首选的第一门语言就是JAVA。但是,在未来10年肯定是大数据的...

JAVA丶学习 ⋅ 04/18 ⋅ 0

学编程,学java还是大数据、android?平均月薪23k以上告诉你方向

学编程,学java还是大数据、android?有不少同学在纠结中,最近有不少初学者来问到,学习大数据,学习spark,公司主要使用那些语言编写,每听到这一个问题,起码还是很不错的,证明你已经开始...

编程南风 ⋅ 05/30 ⋅ 0

编写你的第一个HelloWorld

写在前面的话 因为Java基础是以后学习框架的基石,因此开个文集首先写写Java基础,本来想直奔基础知识的介绍,但是为了保证知识的完整性,因此从Java安装和运行“hello world”开始(虽然百度...

nanaFighting ⋅ 06/15 ⋅ 0

原来Java大数据才是真正的高富帅!

大数据时代,中国IT环境也将面临重新洗牌,不仅仅是企业,更是程序员们转型可遇而不可求的机遇。 国内大多数大型互联网公司的程序员被称作研发工程师,但实际上国内几乎没有研发项目,只能叫...

r6auo52bk ⋅ 05/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 25分钟前 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 35分钟前 ⋅ 0

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 53分钟前 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 今天 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 今天 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部