javaSE-数组以及经典面试题

    技术2022-07-11  118

    一维数组

    语法

    //元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; //需求:想定义一个可以存储3个整数的容器。这里的x为int[]型 int[] x = new int[3]; //打印数组中角标为0的元素的值。 System.out.println(x[1]); }

    空间知识

    当int[] arr = new int[3];时,会在堆区开辟一块连续的空间,然后栈区arr指向堆区所开辟空间的首地址,所以这就是为什么我们说arr是引用类型。 假如这时候,将arr=null,那么java的垃圾回收机制就会在不定时的时间段回收堆区所开辟的数组空间。

    java与c++空间回收的区别

    c++内存空间由开发人员手动释放,一旦忘记释放,项目时间一长性能会降低。 java则是由垃圾回收机制不定期检查并回收不需要的内存空间。 至于谁更优,笔者认为假如开发者经验足够,c++未尝不是更好的选择呢?

    经典面试题

    如下代码,试问x[1]的值为多少?

    int []x=new int[3]; int []y=x; y[1]=89;

    由下图可知,两个引用变量共用一块内存空间,所以x[1]的值为89

    当x=null时,堆区内存空间会被释放嘛?

    int []x=new int[3]; int []y=x; y[1]=89; x=null;

    不会,y仍然指向这块内存空间,所以不会被释放

    试问a=?

    int a=5; int b=a; b=8;

    a=5,栈区变量空间独立,int b=a; 只是将b的值放到a的空间

    数组声明与编译器

    如下代码,由于编译器只检查语法,所以编译阶段下述代码不会报错,只有真正运行的时候才会报错

    int []arr=new int[3]; System.out.println(arr[3])

    一维数组与选择排序

    原理图示

    public static void sort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[i]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } for(int index=0;index<arr.length;index++){ System.out.print(arr[index]+" "); } } public static void main(String[] args) { // TODO Auto-generated method stub int[] arr={2,3,4,2,7,5}; sort(arr); }

    冒泡排序

    原理:每一轮循环后,都会冒出最大值或者最小值

    public static void bubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { Swap(arr,j,j+1); } } } for (int index = 0; index < arr.length; index++) { System.out.print(arr[index] + " "); } } public static void Swap(int[] arr,int index1,int index2){ int temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; }

    优化

    因为数组排序会在堆区中出现大量的交换,消耗内存,所以希尔排序效率更高

    折半查找

    原理 :

    每次二分查找,当mid>searchValue时,max=mid-1,反之min=mid+1当min>max说明查找失败由于一次可以筛选一半的数据,相比常规遍历查找,效率更高

    传统二分查找代码

    public static int HalfSearch(int[] arr,int search_value) { int min_index=0; int max_index=arr.length-1; int mid_index=(min_index+max_index)/2; while(arr[mid_index]!=search_value){ if(arr[mid_index]>search_value) max_index=mid_index-1; else if(arr[mid_index]<search_value) min_index=mid_index+1; if(min_index>max_index) return -1; mid_index=(min_index+max_index)/2; } return mid_index; }

    使用高效率的进制二分查找法

    public static int HalfSearch2(int[] arr,int search_value) { int mid_index,min_index=0,max_index=arr.length-1; while(min_index<=max_index){ mid_index=(min_index+max_index)>>1; if(arr[mid_index]>search_value) max_index=mid_index-1; else if(arr[mid_index]<search_value) min_index=mid_index+1; else return mid_index; } return -1; }

    进制转换练习题

    传统做法

    10进制转2进制

    计算过程

    public static void toBin(int num){ StringBuffer sb = new StringBuffer(); while(num>0){ sb.append(num%2); num/=2; } System.out.println(sb.reverse()); }

    10进制转16进制

    计算过程

    public static void toHex(int num) { StringBuffer sb = new StringBuffer(); for (int count = 0; count < 8; count++) { int temp_result = num & 15; if (temp_result > 9) sb.append((char) (temp_result - 10 + 'A')); else sb.append(temp_result); num=num>>>4; } System.out.println(sb.reverse()); }

    查表法进制转换

    10进制转2、8、16进制

    public static void ToHex(int num, int change_num, int move_num) { char[] chs = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] result = new char[8]; int pos = result.length; // num!=0 使得在高位全为0的情况下直接结束,这样就可以避免没必要的查表 while (num != 0) { int temp = num & change_num; result[--pos] = chs[temp]; // 避免高位全1 导致的结束不了 num = num >>> move_num; } for (int i = pos; i < result.length; i++) { System.out.print(result[i]); } }

    二维数组

    声明方式以及注意事项

    int[] arr = new int[2]; int arr[] = new int[2]; System.out.println(arr); //输出[[i@1764 即二维[[ 地址hash值:i@1764 System.out.println(arr[1]); //输出[i@1764 即二维数组的第一个元素(是一维数组)[ 地址hash值:i@1764

    空间分配方式

    如下图

    arr[0][2]=90; //没有越界 ✔ arr[1][1]=90;//越界 ❌ arr[2][2]=90;//越界 ❌ System.out.println(arr.length);//3 这里打印的是二维数组的空间长度 System.out.println(arr[1].length);//3 这里打印的是二维数组的第二个元素的空间长度

    面试题

    int[] x,y[];//x一维,y二维。 int[] x; a. x[0] = y;//error 二维地址不能赋值给元素空间 b. y[0] = x;//yes 二维地址指向一为地址空间 c. y[0][0] = x;//error x不是元素 d. x[0][0] = y;//error y不是元素 e. y[0][0] = x[0];//yes f. x=y;//error x y都是常量 代表首地址
    Processed: 0.023, SQL: 9