面试题:javase基础语法之运算符

目录

1、面试中 短路运算符 和 位运算

1.1、你知道 运算符 & 和 &&、| 和 || 的区别吗?

1.2、最有效效率的方法将2变成8

1.3、写个方法,传递两个非0的int数值进去,实现变量交换的方式,有几种方式?

2、java数据类型划分

2.1、说下java数据类型分类

2.2、== 和equals的区别

3.try-catch-finally 异常处理模块的返回值问题

3.1、下面代码 的try-catch-finally语句,try里面有个return, finally里面也有个return,结果会返回什么?为什么?

4、新特性考察 try-with-resource 知识点

4.1、有了解新版的JDK处理IO流吗?编写下基础代码, 从一个txt⽂文本里面,拷贝里面的内容到另外一个txt⽂本里面

5、常用字符串的考查点(重点)

5.1、String str = new String("test");创建了几个对象?

5.2、下面代码比较什么?输出结果是什么?为什么是这样的结果?

5.3.、下面代码的各个结果是什么?如果需要两个都为true,应该怎么修改?

6、常用字符串相关构建类的使用与区别

6.1.String、StringBuffer 与 StringBuilder 的区别?

7、面向对象思想OOP

7.1.面向对象的几大特征?

7.2.Overload(重载)和Override(重写)的区别?

7.3.接口是否可以继承?接口是否支持多继承?类是否支持多继承?接口里面是否可以有方法实现?

7.4.是否了解JDK8里面接口新特性?


1、面试中 短路运算符 和 位运算

1.1、你知道 运算符 & 和 &&、| 和 || 的区别吗?

& 按位与操作,只有对应的两个二进制位1时,结果才为1
1&1 = 1
1&0 = 0
0&1 = 0
0&0 = 0
| 按位或操作,有一个为1的时候结果就为1
1|1 = 1
1|0 = 1
0|1 = 1
0|0 = 0
& 和 && 都可以实现 “和” 这个功能;
区别:&两边都运算,而 && 先算左侧,若左侧为false,那么右侧就不运算,所以 && 又称之为“短路运算符”;判断语句中推荐使用 &&,效率更高;

| 和 || 都可以实现 “或” 这个功能;
区别:|| 只要满足第一个条件,后面的条件就不在判断,也被称之为“短路运算符”,而 | 要对所有的条件进行判断;

1.2、最有效效率的方法将2变成8

原理:将一个数左移n位,相当于乘以2的n次方,位运算是cpu直接支持的,所以效率高

答案:2<<3

1.3、写个方法,传递两个非0的int数值进去,实现变量交换的方式,有几种方式?

方式一:

int a = 1, b=2;
System.out.printf("a=%d, b=%d",a,b);
a = a + b;
b = a - b ;
a = a - b;
System.out.printf("a=%d, b=%d",a,b);

方式二:异或运算 (⼀一个数与另⼀一个数异或两次是其本身, ⼀一个数和⾃自身异或结果是0 )

int a = 1, b=2;
System.out.printf("a=%d, b=%d",a,b);
a = a^b; // a1 = a^b
b = b^a; // b = b^a^b
a = a^b; // a = a1^b = a^b^a
System.out.printf("\na=%d, b=%d",a,b);

解释:
a1=a^b
b=b^a1=b^a^b=a
//此时a1=a^b b=a
a=a1^b=a^b^a=b

2、java数据类型划分

2.1、说下java数据类型分类

  • 基础数据类型:byte(1byte)、short(2byte)、int(4byte)、long(8byte)

                                boolean(1byte)、char(2byte)、float(4byte)、double(8byte)

  • 引用数据类型:其他都是引用类型
  • String和Enum都是引用类型

2.2、== 和equals的区别

  • 基本数据类型比较 要用==判断是否相等
  • 引用数据类型: == 比较的是内存地址是否一样,不同对象的内存地址不一样,equals比较的是具体的内容,也可以让开发则去定义什么条件去判断两个对象是否一样,重写equals和hashcode方法。

3.try-catch-finally 异常处理模块的返回值问题

3.1、下面代码 的try-catch-finally语句,try里面有个return, finally里面也有个return,结果会返回什么?为什么?

    public static int test1() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
            return a;
        } finally {
            a = 4;
        }
        return a;
    }

    public static int test2() {
        int a = 1;
        try {
            System.out.println(a / 0);
            a = 2;
        } catch (ArithmeticException e) {
            a = 3;
            return a;
        } finally {
            a = 4;
            return a;
        }
    }

答案:test1返回:3;test2返回:4

在执行try-catch中的 return 之前一定会执行finally 中的代码(如果finally存在),若果finally 中有return 语句,就一定会执行finally 中的return 方法;所以finally中的return语句一定会被执行的;

执⾏流程:finally执行前的代码⾥面有包含return,则会先确定return返回值,然后再执行finally的代码,最后再执行return;

4、新特性考察 try-with-resource 知识点

4.1、有了解新版的JDK处理IO流吗?编写下基础代码, 从一个txt⽂文本里面,拷贝里面的内容到另外一个txt⽂本里面

JDK7之后的写法,JDK9⼜行了改良,但是变化不大,下面的写法即可;
需要关闭的资源只要实现了java.lang.AutoCloseable,就可以⾃自动被关闭;
try()里面可以定义多个资源,它们的关闭顺序是最后在try()定义的资源先关闭

        try (
            FileInputStream fis = new FileInputStream("D:/test.txt");
            BufferedInputStream bis = new BufferedInputStream(fis);
            FileOutputStream fos = new FileOutputStream("D:/copy.txt");
            BufferedOutputStream bos = new BufferedOutputStream(fos);
        ) {
            int size;
            byte[] buf = new byte[1024];
            while ((size = bis.read(buf)) != -1) {
                bos.write(buf, 0, size);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

5、常用字符串的考查点(重点)

5.1、String str = new String("test");创建了几个对象?

创建一个对象:常量池存在,则直接new一个对象;

创建两个对象:常量池不存在,则常量池创建一个对象,也在堆里面创建一个对象;

5.2、下面代码比较什么?输出结果是什么?为什么是这样的结果?

String str1= new String("test");
String str2= "test";
String str3= "test";
System.out.println(str1 == str2);//false
System.out.println(str2 == str3);// true

答案:
比较引用的内存地址是否一样
第一个是false;因为new 创建新的对象会开辟新的空间,所以地址不一样;
第二个是true:都是从常量池里面获取,“test”存在于常量池中;

5.3.、下面代码的各个结果是什么?如果需要两个都为true,应该怎么修改?

String s1 = "test";
String s2 = s1 + ".net"; //变量量 + 常量量 = 来⾃自堆
String s3 = "test" + ".net"; //常量量 + 常量量 = 来⾃自常亮池
System.out.println(s2 == "test.net");
System.out.println(s3 == "test.net");

答案:
第一条语句打印为false,s2 = s1 + ".net", 变量+常量相当于在堆构建了一个新的string对象,并将对象引用赋予s2,常量池中的地址不一样,但是值一样。

第二条语句打印为true,javac编译可以对“字符串常量”直接相加的表达式进行优化,不用等到运行期再去进行加法运算处理,而是直接将其编译为一个这些常量相连的结果。

如果需要第一个输出也为true,只需要把变量改为常量即可:final String s1 = "test";不管是new String("xxx")和直接常量赋值,都会在字符串常量池创建,只是new String("xxx")方式会在堆中创建一个对象去只想常量池的对象,普通的常量复制是直接赋值给变量。

6、常用字符串相关构建类的使用与区别

6.1.String、StringBuffer 与 StringBuilder 的区别?

答:三者都是final,不允许被继承,在本质都是char[]字符数组实现;String、StringBuffer与StringBuilder 中,String是不可变对象,另外两个是可变的;意思就是String做字符串拼接会创建多个对象,而另外两个则不会。

区别:

StringBuilder:效率更快,因为它不加锁,不具备多线程安全;

StringBuffer:操作的方法都加了synchronize,效率相对更低,是线程安全的;

使用场景:

操作少量的数据用String,但是常改变内容且操作数据多情况下最好不要用String,因为每次生成中间对象性能会降低;

单线程下操作字符串可选择线程不安全的StringBuilder,效率更高;多线程则选择StringBuffer;

7、面向对象思想OOP

7.1.面向对象的几大特征?

封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口即方法在java中通过关键字private,protected和public实现封装;封装把对象的所有组成部分组合在一起,封装定义程序如何引⽤用对象的数据,封装实际上使用方法将类的数据隐藏起来,控制用户对类的修改和访问数据的程度。 适当的封装可以让代码更容易理解和维护,也加强了了代码的安全性。

继承:子类继承父类的特征和行为,使得子类对象具有父类的方法和属性,父类也叫基类,具有公共的方法和属性。

多态:同一个行为具有多个不同表现形式的能力,重写和重载就是多态的表现;优点:减少耦合、灵活可拓展,一般是继承类或者重写方式实现。

7.2.Overload(重载)和Override(重写)的区别?

重载(Overload):标识同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同,参数个数或类型不同;

重写(Override):标识子类中的方法可以与父类中的某个方法的名称和参数完全相同;

7.3.接口是否可以继承?接口是否支持多继承?类是否支持多继承?接口里面是否可以有方法实现?

  • 接口里可以有静态方法和方法体
  • 接口中所有的方法必须是抽象方法(JDK8以后就不是了)
  • 接口不是被类继承,而是被类实现
  • 接口支持多继承,类不支持多继承

一个类智能继承一个类,但是能实现多个接口,接口能继承另一个接口,接口的继承使用extends关键字,和类继承一样。

7.4.是否了解JDK8里面接口新特性?

  • interface 中可以有static 方法,但必须要有方法实现体,该方法只属于该接口,接口名直接调用该方法;
  • 接口中新增default 关键字修饰的方法,default 方法只能定义在接口中,在子类或子接口中被重写default 定义的方法必须有方法体;
  • 负借口的default 方法如果在子接口或子类被重写,那么子接口实现对象、子类对象,调用该方法,以重写为准;
  • 本类、接口如果没有重写父类(即接口)的default 方法,则在调用 default 方法时,使用父类(接口)定义的default方法逻辑;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值