主要是一些原来不懂但是本次上机涉及到的内容...
一、空数组与数组为null的区别
1、空数组:
int[] array = new int[0];
array.length == 0;
空数组是一个真正的数组,只不过长度为0,它是一个真正的对象。
2、数组是null
null数组是一个空引用,只定义了一个数组,但是没有实例化,并不是一个对象
int[] array = null;
二、可变参数
适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。
注意:可变参数必须位于最后一项。
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
下面是一个例子,该方法的参数可以是一个或者多个String
public static String strscat(String... args) { String x = new String(); for(String s: args) { x = x + s; } return x; }
三、Java对象实例是作为引用存在的
四、浅拷贝vs深拷贝
浅拷贝是指在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝,没有对引用指向的对象进行拷贝。
而深拷贝是指在拷贝对象时,同时会对引用指向的对象进行拷贝。
区别就在于是否对 对象中的引用变量所指向的对象进行拷贝。
具体样例请参考这篇博客:https://www.cnblogs.com/dolphin0520/p/3700693.html
五、String类的==和equals()方法
首先应该明确String对象的两种生成方式:
1、作为基本类型使用 String str1 = “aaa”;这时会在String缓冲池中寻找与str1内容相同的String对象,如果有,直接将该对象的引用赋值给str1,没有则new一个对象,相当于第二种生成对象的方式;
2、用new来创建一个新对象,这时会分配一个新的内存堆:String str2 = new String(“abcdefg”);
String有两种比较方式:==和equals():
“==”比较的是针对两个String类型的变量的引用,也就是说如果两个String类型的对象指向同一个内存堆,则返回true,在上面的例子中,如果String缓冲池中已经有内容为“aaa”的对象(假设名称为str3),则str1 == str3 返回true
用Object对象的equals()方法String对象继承自Object,并且对equals方法进行了重写,用此方法进行比较时,其实是对String对象封装的字符串内容进行比较,相同返回true。 也就是说,不考虑内存堆的情况,仅考虑对象的内容。
下面举几个例子:
①
String str1 = new String("aaa"); String str2 = "aaa";//在缓冲池中找到'aaa",因此str2与str1指向同一个内存堆 str1 == str2;//true str1.equals(str2);//true
②
String str1 = "aaa";//缓冲池中找不到"aaa",则new一个对象,相当于第一个例子中的操作 String str2 = "aaa";//缓冲池中找到"aaa",str2与str1指向同一个内存堆 str1 == str2;//true str1.equals(str2);//true
③
String str1 = new String("aaa"); String str2 = new String("aaa"); str1 == str2;//false,两个都是new出来的对象,指向不同的内存堆 str1.equals(str2);//true,内容相同
④
String str1 = "a" + "b" + "c";//缓冲池中找不到"abc",则new一个对象,相当于第一个例子中的操作 String str2 = "abc";//缓冲池中找到"abc",str2与str1指向同一个内存堆 str1 == str2;//true str1.equals(str2);//true
⑤
String str = "ab"; String str1 = "abc"; String str2 = s + "c"; str1 == str2;//false,因为str是变量,那么str无论是和常量还是和其他变量相+,在源码里面得到的新串,都是new出来的一个新的String,这个String是放在堆里面的。既然是new 出来的,那自然不是同一个对象。 str1.equals(str2);//true
其实单独拎出来的话,每一个点都能写一篇详细的博客,不过,懒癌晚期没救了QAQ