`
xiemingmei
  • 浏览: 210526 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

编写java代码的一些技巧

阅读更多
(1)BigDecimal中要使用String作为参数来构造(BigDecimal.valueOf()会把各种值转化成字符串,再调用 BigDecimal(String)的),否则照样会出问题;
		System.out.println(10000*1.005);
		System.out.println(new BigDecimal(10000).multiply(new BigDecimal(1.005)));
		System.out.println(BigDecimal.valueOf(10000).multiply(BigDecimal.valueOf(1.005)));
		System.out.println(new BigDecimal("10000").multiply(new BigDecimal("1.005")));
输出:
10049.999999999998
10049.99999999999893418589635984972119331359863281250000
10050.000
10050.000



(2)长整型要使用大写字母L而不是小写字母l来标识,因为小写字母l看起来有点像数字1;
例如:
    long i = 200l;//看起来是不是像2001呢;
    long i = 200L;//这样,就算有近视,也能辨认清楚了。


(3)如果一个类中有多处使用长数字,则可以定义并使用数字常量,到处写长的数字,容易出现多一个0或少一0等写错位数的问题,同时导致问题难以排查。
例如:
if(i > 10000000 && i<100000000) {...}
if(j >= 10000000 && j<=100000000) {...}
可改成:
final int BEGIN = 10000000;
//或 final int BEGIN = 10*1000*1000;
final int END = 100000000;
//或 final int END = 100*1000*1000
if (i > BEGIN && i< END){...}
if (j >= BEGIN && j<= END){...}

再如TimeUnit中的代码:
    // Handy constants for conversion methods
    static final long C0 = 1L;
    static final long C1 = C0 * 1000L;
    static final long C2 = C1 * 1000L;
    static final long C3 = C2 * 1000L;
    static final long C4 = C3 * 60L;
    static final long C5 = C4 * 60L;
    static final long C6 = C5 * 24L;



(4)在使用Map时,要注意Integer与Long的自动装箱,要与String类型的key区分开来
例如:
		Map<String,String> hm = new HashMap<String,String>();
		hm.put("1", "1Value");
		hm.put("2", "1Value");
		hm.put("3", "1Value");
		hm.put("4", "1Value");
		
		int i = 1;
		System.out.println(hm.get(i+1));//错误的做法,值为null
		System.out.println(hm.get(String.valueOf(i+1)));//正确的做法

输出:
null
1Value
因为i+1计算后自动装箱成Integer(2),而hm.get(new Integer(2)) 与hm.get(new String(2))是完全不一样的。


(5)有同学写代码,把数字转型为字串时喜欢用类似 i+"" 这种方式,个人认为这样的代码比较难看,可以写成 String.valueOf(i),它是不是好看一些。


(6)对于复杂的判断条件,最好不要经常使用“非”等排除条件式子,这样不便于理解组合条件的含义:
例如:
   如果 成功方案赢利≥1000元 或 成功方案赢利≥500元且回报率≥10倍 则返回战绩,否则 返回0;

不便于直接思维的、排除式的写法:
 if (profit.compareTo(minProfit) < 0 && (profit.compareTo(minRateProfit) < 0 || rate.compareTo(minRate) < 0)) {
            return 0; 
} else {
return 战绩值;}

这个是正确的写法,但是因为整合条件都要反过来写,类似:A&&B 变成 !A||!B,很难理解,也极容易把(!A || !B)写成 (!A && !B)。


便于理解的、直观式的写法:
 if (profit.compareTo(minProfit) >= 0 && (profit.compareTo(minRateProfit) >= 0 && rate.compareTo(minRate) >= 0)) {
       return 战绩值;
}else {
   return 0; 
}


(7)经常看见list!=null && list.size()>0 这样的代码,大概担心用到的list为null而导致空指针异常,其实list!=null一般是没有必要,这样的代码比较难看一点。

《Effective Java》建议:对返回值为Collection或Map的子类的,尽量返回一个元素为空的Collection或Map,而不是返回null。

事实上,很多开源的框架中就是这么做的,看下面应用Hibernate的一段代码:
 
       Query q = *Dao.createQuery(hql);
       List<?> list = q.list();
       if (list != null && list.size() > 0) {
          return (DcRace) list.get(0);
       }

可以改为:
 
       Query q = *Dao.createQuery(hql);
       List<?> list = q.list();
       if (list.size() > 0) {//删除 list != null && 
          return (DcRace) list.get(0);
       }

事实上,q.list()永远不会返回null,所以没有必要判断list是否为null,这样代码更加简洁、好看。

(8)BigDecimal是一个只读类,它的对象一旦构建好了,就无法修改该该对象的属性。如:
public BigDecimal setScale(int newScale, int roundingMode)
public BigDecimal add(BigDecimal augend)
等方法都是返回一个新的BigDecimal对象,而对原来的BigDecimal不会起热任何修改作用的。JDK中类似的只读类还有:所有的基本数据类型,所有的数据封装类,BigInteger,String等。

(9)java中,等式返回值是等式右边表达式的值,如
    public LinkedList() {
        header.next = header.previous = header;
    }

能看懂吗?第一步执行header.previous = header,第二部(header.previous = header)返回值为header,把header赋给header.next.

又如:
		String t;
		String x;
		System.out.println(x = t = "1222");
		System.out.println("x:" + x);
		System.out.println("t:" + t);
                //输出:1222 x1222 t1222



(10)Java1.5以上,String.format(String,object1...)提供了在字串中插入格式化的部分。
例如:
	
		System.out.println(String.format("test %s %s","ooo","pppp"));
		System.out.println(String.format("test %1$s %2$s","ooo","pppp"));
		System.out.println(String.format("test %2$s %1$s","ooo","pppp"));

输出为:
test ooo pppp
test ooo pppp
test pppp ooo



(11) 模运算的另类表达:
一般: M%N, 但这种效率不高,效率更高为: M & (N-1)。
HashMap中算key在Node[]的下标,就用&这种方式。
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);







分享到:
评论

相关推荐

    提高java代码性能各种技巧

    Java 代码性能优化技巧总结 Java 代码性能优化是每个 Java 开发者都需要掌握的重要技能。以下是对 Java 代码性能优化的各种技巧的总结: 字符串池的实现 在 Java 中,字符串池(String Intern Pool)是通过使用...

    JAVA编写的五子棋代码

    本项目名为"JAVA编写的五子棋代码",旨在提供一个友好的界面,让学生或初学者能够理解和实践基本的Java编程技巧。 首先,我们要关注的是GUI的实现。Java提供了Swing和JavaFX库来创建图形用户界面。在这个项目中,...

    Java代码审计(入门篇).pdf

    书中还提到,Java代码审计对研发部门的重要性,在编写本书的时候,作者将研发部门视为一类重要的读者群体。作者认为,研发部门对应用安全的认识有所欠缺是情有可原的,但研发部门未知的“代码安全技术盲区”常常和...

    Java编写的简单代码统计程序原代码

    标题中的“Java编写的简单代码统计程序原代码”表明这是一个使用Java编程语言开发的软件工具,其主要功能是统计代码量。这样的程序通常用于帮助开发者分析项目中的代码结构,了解不同模块的代码复杂性,或者在团队...

    北大青鸟S1课程全部Java代码

    【北大青鸟S1课程全部Java代码】是北大青鸟教育机构初级阶段(S1)的Java编程教学资源,这是一份极其宝贵的内部学习资料。它涵盖了初学者从零开始学习Java编程的基础到进阶的知识点,是学员们掌握Java语言的起点。这...

    编写java代码的Idea使用方法

    现在,你可以开始编写Java代码了。在编辑器中,输入`public class Main { ... }`并添加你需要的代码。例如,一个简单的"Hello, World!"程序: ```java public class Main { public static void main(String[] args...

    java代码审查.pdf

    在详细说明【标题】及【描述】中的知识点之前,需要明确这两个字段提供的是文件名和文件内容的描述,它们分别指出了文档的主题是关于Java代码审查的PDF文档,以及文档内容涉及到了Java编程语言中的代码审查技巧、bug...

    编写高性能 Java 代码的最佳实践.zip_adult1nm_apm_编写高性能 Java 代码的最佳实践

    编写高性能 Java 代码的最佳实践:本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。

    java入门学生GUI编写经典代码

    总之,"java入门学生GUI编写经典代码"是一个很好的起点,让你掌握Java GUI编程的基本概念和技巧。从简单的窗口和组件开始,逐步深入到事件处理和布局管理,你将能够构建出复杂且功能丰富的Java桌面应用。

    java语音源代码用例

    在这个"java语音源代码用例"中,我们可能找到了一些实际操作的例子,用于学习和探讨Java在语音处理方面的应用。 首先,Java提供了javax.sound.sampled包,这是Java Sound API的一部分,用于处理音频输入、输出和...

    JAVA编写的留言板源代码

    以下是对这个JAVA编写的留言板源代码的详细解读: 1. **Java基础**:首先,Java是这整个项目的基础,它是一种跨平台的面向对象编程语言。源代码将利用Java的基本语法,包括类、对象、变量、方法等进行程序设计。 2...

    JAVA代码+PPT+实例

    Java源码是用Java语言编写的程序代码,通过编译器转化为字节码(.class文件),可以在Java虚拟机(JVM)上执行。 【Java 2 Standard Edition (J2SE)】 J2SE是Java 2平台的标准版,它包含了开发和运行基于Java技术...

    使用LoadRunner-编写JAVA-测试脚本.docx

    【使用LoadRunner编写JAVA测试脚本】 LoadRunner是一款强大的负载测试工具,它允许测试人员模拟大量用户并发执行任务,以评估应用程序的性能和稳定性。在本文档中,我们将重点讨论如何使用LoadRunner来编写JAVA测试...

    文本编辑器+源代码+java

    在提供的压缩包文件中,可能包含了一个或多个文本编辑器的配置文件、Java源代码示例,或者是一些与Java开发相关的工具和库。这些资源对于初学者来说,可能是了解和学习Java编程的良好起点。例如,源代码文件可以用来...

    在Qt平台C++和Java代码的交互

    在C++代码中,你需要定义一些函数,这些函数将在Java代码中被调用。为了使Java能够识别这些函数,需要使用JNI的`JNIEXPORT`和` JNICALL`宏来修饰函数声明。例如: ```cpp extern "C" { JNIEXPORT void JNICALL Java...

    Java敏捷开发(王伟杰译)

    4. **测试驱动开发(TDD)**:在TDD中,开发者首先编写单元测试,然后编写刚好足够的代码来通过这些测试,以此保证代码质量。 5. **持续集成(CI)**:CI是开发过程中的关键实践,它要求开发人员频繁地将代码集成到...

    从Java代码到字节码(1)Java开发Java经验技巧共

    本资源“从Java代码到字节码(1)Java开发Java经验技巧共41页.pdf.zip”是一个关于Java开发的教程,旨在帮助开发者深入理解Java程序的生命周期,特别是从源代码编译成字节码的过程,这是Java平台的关键特性之一。...

    Java电子琴源代码

    2. **音频处理**:Java提供了一些API来处理音频,如Java Sound API。开发者可能使用这个API来播放、录制、合成和处理音频。在电子琴应用中,每按下一个键,就需要播放对应的音符。这涉及到音频缓冲、采样率、位深度...

    编写高性能 Java 代码的最佳实践.rar_Java最优代码_fella8y

    编写高性能 Java 代码的最佳实践,本文首先介绍了负载测试、基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践。最后研究了JVM特定的调优技巧、数据库端的优化和架构方面的调整。 ...

    java源码包---java 源码 大量 实例

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

Global site tag (gtag.js) - Google Analytics