该文为原创,转载请标明出处:http://blog.csdn.net/dhtx_wzgl/article/details/51427315
前言
用了这么久的java,却从未深入的学习过基础原理。以前总觉得会用就行,经过不断开发和学习发现,如果没有深入理解原理,也就很难真正精通一门技术。今年来到实验室后,开始深入的学习了自己掌握的一些技术和工具的原理,在此决定一一记录在博客里,算是对学习的一个总结吧。今天,首先总结java语言的基础,下面通过对比来阐述一些java基础原理。
一、变量与包装类的区别
变量是利用声明的方式将内存的某个内存块保留下来以供程序使用。包装类是直接将简单类型的变量封装成一个类,所以也可以叫封装类,目前共有八种,分别为Boolean、Character、Integer、Long、Float、Double、Byte、Short,分别对应boolean、char、int、long、float、double、byte、short。
变量和包装类虽然有着对应关系,但是两者之间还是有区别的。列如 int i = 6;Integer j = 6; 这里i与j显然是相等的,但是i是一个变量,而j却是一个对象,它拥有很多方法,例如j.toString()、j.equals()等,可以看出这里只是i和j对象的内容相等。变量和包装类最本质的区别就是,变量是在jvm的栈内存中分配的,只存在栈内存中,而包装类由于是一个类,所以它的引用变量j存在于栈内存中,而对象6存在堆内存中。
二、a=a+1与a+=1的区别
一般情况下a=a+1与a+=1都默认是等价的,即a+=1可以转换为a=a+1,但是其实这两者之间不是完全等价的,例如 short a=10;a+=1等价于a=(short)a+1,而a=a+1等价于a=(int)a+1,所以这里a+=1可以得到结果值11,而a=a+1会在IDE里直接报错,无法编译。
三、equals与==的区别
equals与==首先在直观上就可以看出两者之间的区别,equals是对象的一个方法,而==是一个运算符。其中==既可以用来比较类型相同的两个基本变量的值又可以比较类型相同两个的包装类的值,还可以比较类型相同的基本变量和对应的包装类的值以及两个字符串的值,例如:对于int a = 1; int b=1 ; Integer c =1; Integer d =1;String s0 = new String("s");String s1= "s"; String s2 = "s" 这些变量下面的输出语句都可以顺利通过编译并输出结果值。
System.out.println(a==b);
System.out.println(a==c);
System.out.println(c==d);
System.out.println(s1==s2);
而equals用于比较相同类型的两个包装类的值、类型相同的包装类与基本类型的值和两个字符串的值,以下三个输出语句均可正常编译并输出结果值。
System.out.println(c.equals(a));
System.out.println(c.equals(d));
System.out.println(s1.equals(s2));
==和equals在比较两个类(String是一个类)的值时,实际比较的内容是不一样的,其中==比较的是引用变量,即栈内存中存放的对象的地址,而equals比较的是对象内容,即堆内存中对象的值,例如下面两个输出方法,方法1输出false、方法2输出true。
System.out.println(s1==s0);//输出方法1
System.out.println(s1.equals(s0));//输出方法2
四、包装类(也适用String类)直接赋值与new赋值的区别
对一个包装类的两种赋值方式,都赋一个相同的值,表面上看是相等的,但是实际上是有差别的,对于下面的例子:
Integer i = 5;
Integer k = 5;
Integer j = new Integer(5);
System.out.println(i==k);//输出方法1
System.out.println(i.equals(k));//输出方法2
System.out.println(i==j);//输出方法3
System.out.println(i.equals(j));//输出方法4
方法1到4分别输出true、true、false、true,由此可以看出两种赋方式是有差别的,原因是类的对象内容都是保存在堆内存中的,采用直接赋值的方法赋相同的值时,即将堆内存中的同一内容的地址赋给了两个引用变量如i和k,即i和k指向的是堆内存中的同一内容,而采用new赋值时,每new一次,就会在堆内存中开辟一个新的空间来存放内容,所以i和j的内容虽然是一样的,但是放在了不同的空间中,而==比较的是引用变量的值,即比较的是对象内容的地址,所以输出方法3是false。
五、&&与&、||与|的区别
“&&”与”&“都是与操作,“||”和“|“都是或操作,但是它们之间是有区别的。其中”&&“为短路与,如果使用它,第一个条件为false,则后面的条件将不会再判断;”&“为非短路与,如果使用它,不管第一个条件是真是假,后面的条件都会判断。“||”为短路或,如果使用它,如果第一个条件为true,则后面的条件就不需要再判断;“|”为非短路或,如果使用它,不管第一个条件是真是假,后面的条件都会判断。基于上述与或的特征,就可以明白为什么代码中看到的基本是“&&”和“||”逻辑操作符而非“&”和“|”逻辑操作符了。
六、continue、break、return的区别
continue(继续),顾名思义,它不是跳出循环,而是结束本次过程,接下来继续循环操作;break(中止),是直接结束当前的循环,从当前的循环的上一层继续执行;return(返回),表示中止当前函数的运行,即包含当前循环的方法彻底结束,不管外面还有没有其它的循环,也不管后面还有没有未执行的语句。
七、for each与for循环的区别
for循环是java中常用的一个循环语句,相较与while和do···while,它明确了循环次数,for each是jdk5新增的一个特性,它在操作数组和List集合是比for循环更加的方便和简洁。
八、“”与null的区别
“”和null都被称为空,但是两者之间有着明显的区别,“”是一个对象,是有内存空间的,而null不是对象,或者是一个未被实例化的对象,是没有内存空间的。而且在判断值时,null用==,而“”用equals。
九、单引号与双引号的区别
java中单引号中的值为char类型,而双引号中的值为String类型,例如‘a'代表字符a,"a"代表字符串a,下面两个输出语句的结果分别为98(因为字符a对应ASCII吗为97)和a1,另外’a,b‘在IDE中会报错无法编译,而”a,b"可以编译通过,这些都可以验证用单引号引起来的值是字符,而双引号内的是字符串。
System.out.println('a'+1);//输出方法1
System.out.println("a"+1);//输出方法2