`
huangyonghy321
  • 浏览: 10913 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 需要注意的一些基础

    博客分类:
  • java
阅读更多
1. 关于基础数据类型。

还记得上一片文章中结尾部分的那个例子么?

因为计算机的2进制的特性,Java语言(其他语言好像也一样)无法准确地进行float,double类型数据的计算,所以,作这些计算的时候需要考虑使用BigDecimal着各类。



2. String类与StringBuffer类

Java的String类提供如下的简单的字符串连接方法。

String s1 = “a”;

String s2 = “b”;

String s3 = “c”;

String s = s1 + s2 + s3;

但是这里有一个问题,String类的每一次加操作都会产生一个新的对象。当你针对String类的加的操作开始变得多起来的时候,不但程序占用内存会增加得非常明显,程序运行时间也会大大增加。这个时候需要考虑StringBuffer类的append方法。笑着不是一个极端主义者,所以,笑着还是倾向,不要只要对字符串采用加的操作就用append方法。而是应该根据具体情况,自己衡量一下。具体的测试,自己写个for循环1w次,很容易测试出来的。



3. 关于import*

尽量不要采用import*的写法,而是应该把要import的类具体写出来。这里的原因,一个是因为import*的写法会影响程序的阅读,导致维护者不是很清楚你具体用到了哪些类。但是更主要的是,如果你import*,那么在你打包生成jar,war等等文件的时候,你的*代表的所有类都会被打包进去。一方面导致了你发布内容的大小大幅度增加,另外,很可能会泄漏了一些你并不想要泄露出去的内容。这才是问题的关键,安全第一。



4. 合理使用异常处理,不要过度使用。

Java得异常处理是个不错的东西。可以节省我们很多工作量。但是,有异常处理的的代码段比没有异常处理的代码段运行的时间要增加不少。所以不要把什么都交给异常处理。我们应该做出适当的判断,最后的最后,处理不了的东西才应该交给异常处理,这也符合业务处理的逻辑。

比如,存在FileNotFoundException,但是,

try {

} catch ( FileNotFoundException ) {

}

就不如

if ( f.exists() ) {

} else {

}



5. 尽量不要简单的捕捉Exception异常。

因为在Java里面旧的异常会被新的异常所淹没,而使得我们仅仅根据新的异常信息很难判断出问题究竟出在什么地方。而简单的捕捉Exception异常,会使得这种可能性大大增加。另外,简单的捕捉Exception异常会使得我们很难针对不同的异常采取对应的措施。所以请尽量捕捉具体的异常而不是Exception这个超级异常。可以考虑如下代码结构。

try {

} catch() {

} catch() {

} catch(Exception) {

}



关于Java里面旧的异常会被新的异常所淹没地解决办法,一般是需要自己来实现一些异常类的,因为不是这一篇文章的重点,这里不打算具体讨论。



6. 不要重复生成你的对象。Java中new一个新的对象,相对的是要花费比较多的时间的。虽然现在的CPU可能不太在乎这么点时间。但是积少成多啊。可能new一次的,就尽量不要new两次了。目前阶段能够接触到的是要在循环体外而不是循环体内new除你的对象,这很简单,也很容易注意到。但是在复杂的系统中,如何尽量减少你new一个对象的次数,是否需要使用static关键字,就并不是那么明显,那么容易被考虑到,解决掉了。而且考虑到可维护性,代码结构,等等因素,取舍角度也是不同的。至少,我们先记住这样的原则。不要重复生成你的对象。





7. 不要在你的循环体内做一些不必要的计算。比如:

for(;;al.size()){}

       不如:

        int size = al.size();

        for(;;size){}

        虽然看过文章好像说Java编译器会做优化,这两种写法是一样的。但是基本原则“不要在你的循环体内做一些不必要的计算。”我想这是不会有任何不同意见的。笑着不喜欢记那么多东西,记不住。对于编译器到底做哪些优化笑着也觉得是个没有什么承诺的事情。还是自己控制更安心一点。当然,当后一种写法严重影响了你的代码可读性的时候,可以在效率和可读性之间作一个权衡。毕竟现在的CPU还是很强悍的,循环次数不是很多的话效率的影响基本可以忽略。



8. String 的==与equal()

在对字符串的相等判断,==判断的是地址是否相同,equal()判断的是字符值是否相同。大多数时候==跟equal()的结果都是相同的。这是因为String对象是不变模式的,如果你不是明确地new一个String对象,Java对于String对象的保存默认的是会把新生成的String对象放到一个缓冲区,然后每次判断缓冲区中是否已经有了这个对象,如果有了,那么后建立的同样字符值的String对象也会指向最初建立是该字符值对象的地址。也就是说字符值相同的时候,大多数情况下地质也是相同的。==与equal()效果是相同的。但是当对象是str = new String(“abc”)生成的而不是直接str = “abc”这样赋值生成,或者经过了一些字符串连接处理,或者通过StringBuffer等对象生成,都会在内存中开辟新的地址的,这个时候==和equal()结果是不同的。



是不是稍微有些复杂?这里需要一些关于内存,堆栈,对象保存方面的理解。笑着不想纠缠于这个问题的讨论。如果不能理解,那么只要记住如果你想要判断两个字符串的字符值是否相等,没有别的要求的时候,那么请使用equal()而不是==,至于什么时候需要使用==,我想当你需要的时候,你自然就会明白了。实际上,对于字符串的判断,我们很少需要用的==的。



9. 关于str.equal(“abc”)和”abc”.equal(str)

这个好像争论也挺多的,第一种常量写在后面可能符合大多数人的习惯,也符合我们的逻辑思维。但是需要多一个str是否为null的判断。否则这里是有可能出现异常的。而后一种写法不需要多做关于是否为null这个判断。就笑着个人喜好来说,比较喜欢后一种写法。

10.                           Java是传值还是传引用?

曾经,Java程序员都是从C++转过来的,大家最爱讨论的就是这个冒似高深实际却很无聊的问题。笑着不懂什么叫做传值什么叫做传引用。笑着只想提醒大家记住下面的事实,记住就足够了。到底这种事实说明了Java是传值还是传引用,争论下去有什么意义么?

事实是,在一个方法里面,对他的参数对象本身是无法改变的。比如:

        private void changeParam1(XXXClass _pc){

    _pc = new XXXClass();// 想要改变参数对象本身。

}

上面代码的_pc = new XXXClass();操作,只是在函数体内部生效。除了函数体,你传给这个函数的对象是什么,那他还是什么。就是说你在函数内部是无法改变参数所指向的内存地址的。你是无法改变参数对象本身本身的。这里,争论的产生就是C++程序员非常喜欢的一个好象叫做Swap的函数,在Java里面无法同样实现了。

但是,Java里面是可以对参数对象的属性进行变更的。

private void changeParam2(XXXClass _pc){

    _pc.setField(fieldValue)// 想要改变参数对象的属性。

}

如上代码是可以实现你的意图的。



至于原因,需要画画内存中对象存储,对象指向才能说清楚。笑着觉得那没有研究的价值。记住结论就好了。画图好累的,笑着就偷懒不画了。

11.适当考虑Java的跨平台性,尽量使用Java提供给你的功能。

比如,换行回车到底是\r\n还是\r或者是\n,不同的系统是不一样的。所以考虑一下使用Java提供的功能吧

System类中提供public static String getProperty(String key)方法,其中key可以取如下的值。

file.separator
文件分隔符(在 UNIX 系统中是“/”)

path.separator
路径分隔符(在 UNIX 系统中是“:”)

line.separator
行分隔符(在 UNIX 系统中是“/n”)


在这里补充下:
该方法用法如下:System.out.println(System.getProperty("file.separator"));
对应key值可通过System.getProperties()来查询。
下面我给出jdk1.5中key值:
java.version Java Runtime Environment version
java.vendor Java Runtime Environment vendor
java.vendor.url Java vendor URL
java.home Java installation directory
java.vm.specification.version Java Virtual Machine specification version
java.vm.specification.vendor Java Virtual Machine specification vendor
java.vm.specification.name Java Virtual Machine specification name
java.vm.version Java Virtual Machine implementation version
java.vm.vendor Java Virtual Machine implementation vendor
java.vm.name Java Virtual Machine implementation name
java.specification.version Java Runtime Environment specification version
java.specification.vendor Java Runtime Environment specification vendor
java.specification.name Java Runtime Environment specification name
java.class.version Java class format version number
java.class.path Java class path
java.library.path List of paths to search when loading libraries
java.io.tmpdir Default temp file path
java.compiler Name of JIT compiler to use
java.ext.dirs Path of extension directory or directories
os.name Operating system name
os.arch Operating system architecture
os.version Operating system version
file.separator File separator ("/" on UNIX)
path.separator Path separator (":" on UNIX)
line.separator Line separator ("\n" on UNIX)
user.name User's account name
user.home User's home directory
user.dir User's current working directory



12.



分享到:
评论

相关推荐

    java 面试题 java 基础 java 注意事项

    在Java编程领域,面试题常常围绕基础概念、最佳实践以及注意事项。以下是一些常见的Java面试知识点的详细解释: 1. **面向对象的特征** - **抽象**:抽象是将复杂的现实问题简化为一系列概念,忽略不重要的细节,...

    JAVA开发规范,开发注意事项

    以下是一些核心的Java开发规范和需要注意的事项: 1. **命名规范**: - 类名:使用驼峰式命名,首字母大写,如`MyClassName`。 - 方法名:同样采用驼峰式命名,但首字母小写,如`myMethodName`。 - 变量名:遵循...

    Java语言基础教程.ppt

    4. 标识符的命名规则、Java关键字的含义以及保留字的注意事项。 5. 运算符的种类和用法,包括算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符和位运算符。 6. 表达式的构造和运算符优先级的掌握。 7. ...

    java基础笔记

    java基础 在命令行 控制台下的dos命令: 切换盘符 d: 进入某个目录 cd: 查看一个目录下有什么东西:dir 编译时 javac 源文件名 java 运行的时候 java 含有main方法的 类名 注意:不要写 class 公有的 public 的类 其...

    Java开发注意事项

    不过,基于标题“Java开发注意事项”及描述“Java开发注意事项,编程人员可以看看哦”,我们可以围绕Java编程的一些核心知识点和最佳实践进行详尽阐述。 ### Java开发注意事项 #### 一、命名规范 Java中的命名...

    java基础总结大全(笔记).pdf

    - 强制类型转换是将高精度到低精度,需要注意精度损失。 8. Java技术架构: - J2EE(Java 2 Enterprise Edition)适用于企业级应用,如Servlet和JSP。 - J2SE(Java 2 Standard Edition)用于桌面应用,是其他...

    java基础PDF文档

    ### Java基础知识点详解 #### 一、Java语言基础概述 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems开发并在1995年发布。它以其平台无关性、安全性、可移植性和强大的网络功能而闻名。Java语言适用...

    Java基础教程(第3版)_ppt.rar

    《Java基础教程(第3版)_ppt...这些PPT文件构成了一个全面的Java基础教程,适合初学者或需要复习Java基础知识的学习者。通过这些章节的学习,读者可以掌握Java编程的基本技能,为后续的进阶学习和实际开发打下坚实基础。

    java基础课程介绍

    Java基础课程是编程初学者踏入Java世界的敲门砖,它涵盖了语言的核心概念和技术,使得学习者能够理解并掌握编写Java程序的基本技能。本课程详细介绍了Java的安装、开发环境的配置以及基本的编程元素,旨在让学员在...

    java基础f复习

    ### Java基础复习知识点 #### 一、Java简介 1. **Java语言起源**:Java语言由Sun Microsystems公司在1991年开始研发,并于1995年正式发布。其最初的目标是为了开发一种能够用于家用电器的编程语言。随着时间的发展...

    java程序设计基础教案

    【Java程序设计基础教案】 Java是一种广泛使用的高级编程语言,尤其以其面向对象的特性而闻名。面向对象编程(OOP)是一种将现实世界中的问题抽象为类和对象的方法,使得程序设计更加模块化和易于维护。Java语言由...

    JAVA基础课程讲义

    数据类型的转换需要注意类型兼容性和可能的溢出问题。程序的控制结构包括顺序结构、选择结构(如if、switch)和循环结构(while、for)。方法是代码的复用单位,可以通过键盘输入输出实现简单的交互。本章还介绍了...

    java 基础学习PPT

    Java是一种广泛使用的编程语言,以其平台独立性、面向对象的...通过本章内容的学习,我们可以掌握Java语言的基础知识,包括其发展简史、语言特性、程序运行机制以及环境搭建步骤,这为深入学习Java编程打下坚实的基础。

    java基础整理笔记超详细

    【Java基础整理笔记超详细】 Java是一门广泛使用的高级编程语言,由Sun Microsystems(后被Oracle收购)在1995年推出。它的设计目标是跨平台、面向对象,并且具有健壮性和安全性。Java这个名字源于印度尼西亚的咖啡...

    Java基础教程

    - **Java开发工具包(JDK)**:学习Java前,首先需要安装Java开发工具包(JDK),它是编写Java应用程序的基础。JDK包含了Java运行环境(JRE)、Java虚拟机(JVM)及Java开发工具等。 - **示例程序**:通过创建一个简单的`...

    java基础知识总结(经典)

    注意:在定义 classpath 环境变量时,需要注意的情况如果没有定义环境变量 classpath,java 启动 jvm 后,会在当前目录下查找要运行的类文件;如果指定了 classpath,那么会在指定的目录下查找要运行的类文件。 ...

    java基础总结大全

    然而,值得注意的是,Java语言本身是跨平台的,但JVM并不具备跨平台的能力,因为每个操作系统需要自己的JVM实现。 Java运行环境(JRE)是执行Java程序所需的基础环境,包含了JVM以及Java的核心类库,使得用户可以...

    Java基础知识加强

    需要注意的是,增强for循环不会改变原始数组或集合的值,只是提供一个临时的副本。 可变参数是JDK 5.0的另一创新,它允许方法接收不定数量的参数,如Arrays.asList()方法。调用时,编译器会自动创建一个数组来存储...

    Java习题(一些不注意就犯的错误)

    本篇将详细探讨"Java习题(一些不注意就犯的错误)"中涉及的知识点,包括字符谜题、循环谜题、异常谜题、类谜题以及库谜题,旨在帮助你更好地理解和避免这些常见问题。 1. 字符谜题: Java中的字符处理有时会让人...

Global site tag (gtag.js) - Google Analytics