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

你可能不知道的Java基础知识(一)

阅读更多

鄙人在校大学生一枚,学习Java两年有余,深感Java之简单易用和博大精深。遂利用闲暇之余整理下自己认为很容易被忽视的Java基础知识和使用习惯,希望对大家有用。


1、JavaScript和Java的关系

很多初学者认为JavaScript是Java的简易版本(鄙人初学也这么认为,汗一个!),其实两者除了语法有点相似以外没有任何关系。 JavaScript是Netscape发明的,是一种在网页中使用的脚本语言,在网页应用中抢了Java Applet的饭碗,所以两者似乎还有些"恩怨",不过鄙人对于JavaScript还是无比崇敬的,它那灵活的用法、面向对象的彻底一直令我陶醉。。。扯远了,咱们回到Java。


2、Java是解释型的,运行速度会受影响

我承认,Java比起C++/C可能会慢一点(只是一点点),但是附带而来的是,java虚拟机可以检测指令序列的行为,以增强其安全性,从而使 Java更加安全;可以独立于本地系统,从而实现一处编译,处处运行。另外Java虚拟机使用了JIT(即时编译),可以对使用最频繁的字节码序列直接翻译成机器码,其运行速度与C++相差无几。再加上如今计算机的运算速度,谁会在乎那一点点的速度损失呢。微软大牛的C#同样采用了这种模式,充分体现了其价值!

3、Java Applet这么好的东西为什么没有得到很多应用呢

这一点哥以前也很纳闷,Applet这么好的东西一定会大红大紫啊,还轮到什么Flash、JavaScript说话的份!但事实是现在大对数的网页直接使用Flash或Javascript,而不会选用Applet,原因是不同版本的浏览器运行着不同版本的Java,而且有些已经过时了,这些糟糕的情况导致难以利用Java的最新版本开发Applet(估计用户人数最多的IE肯定不希望Applet火起来,所以。。。),而且Applet只能在有限的区域内控制外观,虽然强大,但不够通用。所以Applet采用了低调姿态,并淡化了客户端的应用,但却成为了服务器端应用的首选平台!


4、关于Windows系统环境变变量的设置

我习惯于先建立JAVA_HOME,然后再利用JAVA_HOME建立PATH和CLASSPATH,初学者可能会问为什么要建立 JAVA_HOME,其实没有理由很简单,省劲!当你的JDK安装的目录很深的时候避免了重复输入大段路径,不过这种"字符重用"在CTRL C+V下已经没有了意义。;另外,想Tomcat等软件会检测你的JAVA_HOME变量,如果现在设置好,以后就不会再麻烦了(偶同学就曾因为这个再加上从不看错误提示,折腾了大半天)。

另外还有一点,我习惯把java的Path变量放在最前面,个人认为这也是一个好习惯,因为有些Java程序在安装时会附带一个JRE,而且常常把它也放在环境变量中,如果一不小心放在了你所设置的JDK路径之前,那就有可能会出现版本不一致问题,你运行的Java命令可能不是你所设置的那个,从而有可能出现莫名其妙的问题。当我们把自己的JDK路径放在最前面,一切都解决了。


5、Java包命名规格

当你引用别人的包,比如org.apache.struts、org.apache.log4j等时,有没有对包的命名方式感到奇怪。其实,以前的 SUN公司为了保证包的唯一性,建议将公司的域名(这个保证了无重复)以倒序的形式作为包名,并且对于不同的项目使用不同的包名。于是就有了 org.apache.struts,这下你明白了吧,至于我们这些自由开发者,那就用自己喜欢的ID打头吧。


6、函数参数的命名

在编写函数时,常常要传一些参数,怎样命名这些参数才能更具易读性呢?这个没有固定的建议,不同的公司有不同的标准,有些人在参数前面加a

例如:

public Student(String aName , int aAge)

{

name=aName;

age=aAge;

}

意思显而易见,比较清楚。有些C++程序员则习惯用下划线前缀,如_name。我比较喜欢的方法是函数内部用this

public Student(String name , int age)

{

this.name=name;

this.age=age;

}

当然也无所谓孰好孰坏,用着习惯就好,但是使用没有意义的参数名可读性就很差了!


7、使用String效率低

的确,修改String字符串是需要创建很多额外的String对象,效率的确不高,但是String字符串也有个优点:编译器可以让字符串共享,复制一个字符串变量,源字符串和复制的字符串共享相同的字符。例如:String s1="hello"; String s2="hello"; s1==s2为true!Java的设计者认为共享带来的高效率远远胜于提取、拼接字符串所带来的低效率。其实看一下自己的程序就会知道,很少需要修改一个字符串,一般用到的是对字符串进行比较,当然有一种情况例外,那就是需要将较短的字符串汇集成大字符串,然后一起输出,一般用在键盘输入、文件读取等方面,这时候就得用StringBuilder和StringBuffer了。这两者的API是相同的,区别在于StringBuilder不支持同步,适用于单线程,速度快,StringBuffer支持多线程,但速度较慢。

据我使用的体会,使用频率方面,String>StringBuilder>StringBuffer。通常情况下字符串常量或者很少变化的字符串变量用String,如用户名、住址等,单线程下字符串的拼接用StringBuilder,多线程下就用StringBuffer喽,不过你会发现很少遇到多个线程操作一个字符串的情况,所以一般建议使用StringBuilder。


8、使用浮点运算要慎重!

在计算机中无法精确地表示10的负次方值,比如0.1,就像十进制中无法精确表示1/3一样,所以当判断浮点数是否相等时要特别注意!

比如:for(double i = 0;i != 10;i += 0.1){}

这是个死循环,因为0.1无法精确的用二进制表示,i将从9.999 999 999 999 98跳到10.099 999 999 999 98。


9、Java中没有goto?

Java设计者保留了goto关键字,但是却没有使用它,因为goto语句被公认的"臭名昭著",但是有些时候goto还是比较有用的,Java设计者也这么认为,于是增加了带标签的break。

 

class Test 
{
	public static void main(String[] args) 
	{
		int i = 0;
		label:
		{
			for (;i<=100 ; i++ )
			{
				if(i == 10) 
					break label;

			}
		}
		System.out.println("i="+i);
	}
}
 

运行后输出 i=10

运行带标签的break语句,将无条件跳转到标签语句块的末尾。这跟goto语句没什么两样!但是还是建议大家尽量不要使用这个功能,甚至尽量不要使用break和continue语句!


好了,今天就写到这里,有空再见!

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics