【java基础】面试常问题(JAVA数据类型)、(运算符语句)、(数组)

本文深入解析Java数据类型、运算符、语句及数组操作,涵盖基本数据类型内存占用、跨平台性理解、位运算优化、异常处理区别、数组操作技巧等关键知识点。

java数据类型

1、基本数据类型定义的变量所占内存字节数的问题

答:java数据类型分为基本数据类型和引用类型,其中基本数据类型包括数值型,字符型(char),布尔型(boolean),数值型包括整数类型(byte,short,int,long),浮点类型(float,double);引用类型包括类,接口,数组
Boolean – false true/false
char \u0000’ 2byte ‘\u0000’~’\uffff’
short 0 1byte -127~128
short 0 2byte -32768~32768
int 0 4byte -2^31 ~ 2 ^31-1
long 0L 8byte -2^63 ~ 2 ^63-1
float 0f 4byte
double 0d 8byte
java中的Boolean变量取值只能是true和false。整数和true或者false不能等价即不能和其他类型进行转换。在java当中char类型占两个字节,是因为java采用的不是ASCLL码系统级编码,而是采用Unicode字符编码。
java中不能使用未初始化的局部变量。

2、谈谈对java跨平台性的理解

答:所有的.java源文件经过编译形成一个字节码文件,而后在计算机上执行,但是解释程序的计算机不是一台真正意义上的计算机,而是一台由软件和硬件模拟出来的计算机——java虚拟机。java中的所有程序都是在JVM上运行的。JVM读取并处理经过编译的与平台无关的字节码文件。java解释器负责将java虚拟机的代码在特定的平台上运行。

运算符语句

主要有:

  • 算术运算符:+ - * / % ++ –
  • 赋值运算符:=复合符号运算符(+= -= *= /=)、
  • 逻辑运算符:&& || !
  • 按位运算符:| & ^ ~ >> >>> <<
  • 关系运算符:> < >= <= != ==
    优先级:
  • [] . () 方法调用,属性获取
  • ! ~ ++ – 一元运算符
  • / % * 乘除取模
  • -. + 加减
  • << >> >>> 位运算符
  • < > <= >=instanceof 大于小于
  • == != 等于不等于
  • & 按位与
  • ^ 按位异或
  • | 按位或
  • && 短路与
  • || 短路或
  • ? 条件运算符
  • = += -= *= /=…… 混合赋值运算符
1、如何更快实现2的3次方

答:采取位运算符,因为CPU计算本质是通过二进制,位运算符的作用在于对整数数值的二进制表示进行运算,所以最快。
2>>2

2、二分(折半)查找的优化问题

答:涉及运算符的优化/2变为>>1
int mid=left+(right-left+1)/2

3、java异常中try块中return;语句和System.exit(0);语句之间是有区别的。

答:return语句用来从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续执行。如果在main()方法中执行return语句,则使程序执行返回到java运行系统,因为java运行系统调用了main()方法。要想从程序的任意地方直接一步到位的退出程序,而不是返回到调用该方法的语句处,可以使用System.exit(0)方法
java中语句三种结构:顺序分支循环

4、选择题:short a=0;a+=1;a=a+1;哪个会发生编译报错

答:a=a+1会报错,因为a定义成short类型,而1是int类型,a与1做运算最终结果是int,无法直接将一个int型数据赋值给short型。
而a+=1,是先判断1是否在short类型数据的范围内,如果没有超出范围则直接赋值给a

数组

1、字符串替换问题

将字符串中每一个‘a’字符替换3个‘#’字符。要求:时间复杂度O(n)。备注:数组操作

public static String replace(String str){
        if(str==null){
            return null;
        }
        StringBuffer str1=new StringBuffer(str);
        StringBuffer newstr=new StringBuffer();
        for(int i=0;i<str1.length();i++){
            if(str1.charAt(i)=='a'){
                newstr.append('#');
            }else {
                newstr.append(str1.charAt(i));
            }
        }
        return  newstr.toString();

    }
2、二分(折半)查找代码实现问题
  public static int Brinary(int []arr,int i){
        if(arr==null){`在这里插入代码片`
            return -1;
        }
        int left=0,right=arr.length-1;
        int mid=0;
        while (left<=right){
             mid=left+((right-left+1)>>1);
            if(arr[mid]>i){
                right=mid-1;
            }else if(arr[mid]<i){
                left=mid;
            }else
              break;
        }
        return mid;
    }

注意>>运算符处需要加大括号

3、整型数组中,通过代码实现奇数在前偶数在后的问题。要求:时间复杂度O(n),空间复杂度O(1)
public static void paixu(int []arr){
        int left=0;
        int right=arr.length-1;
        while (left<right){
            if(arr[left]%2==0){
                int temp=arr[left];
                arr[left]=arr[right];
                arr[right]=temp;
                right--;
            }else{
                left++;
            }
        }
        System.out.println(arr.toString());
    }

既然空间复杂度不变,就不能用最容易思考的方法复制一个数组,多定义一个right用它来换空间。

4、二维数组中查找值问题。注意:二维数组从上到下依次递增有序,从左到右依次递增有序。考虑算法效率。

这个题是牛客网的第一道题,在一开始做的时候也有点蒙。但是仔细观察发现这样的二维数组是有规律的:对角线左上半部分是小于对角线上的值,对角线下半部分的值大于对角线线上的值;所以只要控制i,j就可以进行查找

 public static Boolean find(int[][]arr,int target){
        int i=arr.length-1;
        int j=0;
        while (i>=0&&j<arr.length){
            if(target==arr[i][j]){
                return true;
            }else if(target>arr[i][j]){
                j++;
            }else if(target<arr[i][j]){
                i--;
            }
        }
        return false;
    }

注意二维数组行和列的表达

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值