经典问题
1、类与结构体的区别
(1)类型不同:结构是值类型,类是引用类型。值类型存储数据的值,引用类型存储引用。
(2)存储不同:结构使用栈存储,类使用堆存储。栈空间小,数据访问效率相对高。堆空间大,数据访问效率相对较低。
(3)作用不同:类是现实事物的抽象,结构体包含具体类别数据的一种包装。结构体不具备类的继承多态特性。
2、拆装箱不好的地方
(1)值类型和引用类型之间的转换。
(2)频繁消耗CPU的资源,降低代码的执行速率。
(3)合理的使用类型转换和泛型类与泛型方法,防止隐式的装箱和拆箱操作。
3、方法里面的传参是什么类型
(1)值参数类型 (不加任何修饰符,是默认的类型)
(2)引用型参数 (以ref 修饰符声明)
(3)输出型参数 (以out 修饰符声明)
(4)数组型参数 (以params 修饰符声明)
4、链表和数组的区别
(2)数组的优点:随机访问性强,查找速度快
(3)数组的缺点:插入和删除效率低,可能浪费内存,连续内存空间。数组大小固定,不能动态拓展
(4)链表的优点:插入删除速度快:内存利用率高,不浪费内存,大小没有固定,拓展很灵活。
(5)链表的缺点:不能随机查找,必须从第一个开始遍历,查找效率低
5、二分法从数组查一个东西
常见遍历查询:遍历数组,查找的值和数组中的值相等,返回查找值在数组中的下表位置,否则返回-1(角标从0开始计数)。
答:(1)数组数据必须从小到大有序排序
(2)当所要查询的值大于中间值,说明要查找的值可能存在于arr[mid+1]到arr[end]之间,所以start = mid+1
(3)当所要查询的值小于中间值,说明要查找的值可能存在于arr[start]到arr[mid-1]之间,所以end = mid-1
1 public int binarySearch(int key,int[] a){ 2 3 int start = 0; 4 5 int end = a.length-1; 6 7 while (start<=end){ 8 9 int mid = (start+end)/2; 10 11 if(key<a[mid]) { 12 13 end = mid-1; 14 15 } else if(key>a[mid]) { 16 17 start = mid+1; 18 19 } else { 20 21 return mid; 22 23 } 24 25 } 26 27 return -1; 28 29 }
6、一个数组不用循环怎么累加
答:递归方式
1 // 数组下标索引,从0开始 2 3 private static int count = 0; 4 5 // 递归的退出条件是下标索引=数组长度-1,此时返回数组值 6 7 public static int add(int[] toAdds, int count) { 8 9 if (count < toAdds.length - 1) { 10 11 return toAdds[count] + add(toAdds, count++); 12 13 } 14 15 return toAdds[count]; 16 17 }
7、JS实现浅拷贝
1 var obj={ 2 name:'zs', 3 age:18, 4 friends:['Kate','Bob','Mike'], 5 hobby:{ 6 hobby1:'codes', 7 hobby2:'piano' 8 } 9 } 10 11 function copy(obj1){ 12 var obj2={}; 13 for(var key in obj1){ 14 obj2[key]=obj1[key] 15 } 16 return obj2; 17 } 18 var result=copy(obj); 19 console.log(result.friends); 20 obj.friends.push('Cherry'); 21 console.log(result.friends);//["Kate", "Bob", "Mike", "Cherry"] 22 obj.name='Rose'; 23 console.log(result.name);//zs 24 var obj3=Object.assign(obj); 25 console.log(obj3.friends)//["Kate", "Bob", "Mike"]
深拷贝:JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象
8、深拷贝和浅拷贝区别
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用