面试题
1.值传递和引用传递的区别
基本数据类型参数传递时,传递的是值的副本,改变值的副本,不会影响原来的变量
引用数据类型参数传递时,传递的是地址的副本,副本也是指向同一个变量,会影响原来的变量
String类型属于特殊的引用数据类型,作为参数传递,原来的值不会改变
2.== 与 equals的区别
== 比较基本数据类型比较的是值,比较引用数据类型,比较的是地址
equals 只能比较引用数据类型,比较的是地址
扩展
2.1String类型
String类如果直接使用 = 号赋值,将先从常量池中查找有没有同内容的变量
如果有,则直接使用已存在的内容的地址
如果没有,将此内容存在常量池中,完成赋值
这样做是为了节省内存空间
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
}
2.2 整形包装类
整形包装类和char包装类直接使用 = 号赋值,如果数值相同
取值范围在byte取值范围以内,使用 == 比较结果为 true
超过byte取值范围,使用 == 比较结果为 flase
因为JDK的开发人员为了节省内存空间,将byte取值范围内的数值存放在一个缓存数组中
如果在byte取值范围,那么将从数组中取出对应的值
如果不在byte取值范围内,直接new一个新的对象
public static void main(String[] args) {
Integer i1 = 25;
Integer i2 = 25;
System.out.println(i1 == i2); // true
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i3 == i4); // false
Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6); // true
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8); // false
Byte b1 = 20;
Byte b2 = 20;
System.out.println(b1 == b2); // true
Short s1 = 120;
Short s2 = 120;
System.out.println(s1 == s2); // true
Short s3 = 200;
Short s4 = 200;
System.out.println(s3 == s4); // false
Long l1 = 20L;
Long l2 = 20L;
System.out.println(l1 == l2); // true
Long l3 = 300L;
Long l4 = 300L;
System.out.println(l3 == l4); // false
Character ch1 = 20;
Character ch2 = 20;
System.out.println(ch1 == ch2); //true
Character ch3 = 200;
Character ch4 = 200;
System.out.println(ch3 == ch4); //false
}
2.3重写equals方法
String类对equals方法进行了重写,改为比较内容,我们也可以对equals方法进行重写,改为比较两个对象的内容是否相同
public boolean equals(Object obj) {
// 第一步 先比较地址 如果地址相同 则直接return true 不需要继续比较 了
if(this == obj) {
return true;
}
// 代码执行到这里 表示 地址不同 那么我们应该比较内容 名字和身份证号
// 因为obj是父类对象 而父类对象不能直接获取name属性的值 所以需要强制向下转换,才能使用getIdCare()方法和getName()方法
Person p1 = (Person) obj;
if(this.getName().equals(p1.getName()) && this.getIdCard().equals(p1.getIdCard())) {
return true;
}
// 如果代码能够执行到这里 表示 上述条件不成立
return false;
}
冒泡排序
数组中,两两相邻比较,遇到条件成立的就交换位置
经分析:
比较的轮数是数组长度 -1 ,外层循环控制比较的轮数
每一轮比较的次数:最多的一次是数组长度 -1 ,依次递减,内层循环控制比较的次数
外层循环次数:N - 1
内层循环次数:N - 1 - i
public static void main(String[] args) {
int [] nums = {20,1,55,784,10,233,65};
for(int i = 0;i < nums.length - 1;i++) {
for(int j = 0;j < nums.length - 1 - i;j++) {
if(nums[j] < nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(nums));
}
4. String、StringBuffer、StringBulider三者的区别
String类是一个不可变对象 因为String类底层维护的是一个final修饰的char数组,任何对原字符串进行的增删改操作 都将产生一个新的字符串
StringBuffer和StringBuilder是可变对象
StringBuffer是线程安全的 JDK1.0
StringBuilder线程不安全 JDK1.5
5.try...catch...finally
try-catch块中存在return语句,是否还执行finally块?如果执行,如下代码,说出执行顺序
public static void main(String[] args) {
System.out.println(m1()); //11
}
public static int m1() {
int num = 10;
try {
num ++;
return num;
} catch (Exception e) {
e.printStackTrace();
}finally {
num ++;
}
return num;
}
面试题:byte的取值范围和原理
取值范围:-128~127
因为一个byte占8位,每一位可以存储一个0或者1,计算机以首位(最高位)为符号位,0表示正数,1表示负数,所以byte最大的数值为0111 1111转换为十进制为127,最小值为1000 0000转换为十进制为-128
6.js中!=,,!,===的用法和区别(面试题)
<script type="text/javascript">
var num = 1;
var str = '1';
var test = 1;
document.write(test == num); //true 相同类型 相同值
document.write(test === num);//true 相同类型 相同值
document.write(test !== num);//false test与num类型相同,其值也相同, 非运算肯定是false
document.write(num == str); //true 把str转换为数字,检查其是否相等。
document.write(num != str); //false == 的 非运算
document.write(num === str); //false 类型不同,直接返回false
document.write(num !== str); //true num 与 str类型不同 意味着其两者不等 非运算自然是true
//== 和 != 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 。
//而=== 和 !== 只有在相同类型下,才会比较其值,类型不同,直接返回false
</script>