Java后端开发面经1

面经来源于github上的

Java-Interview

在学习时,用自己的语言解释

1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。

深入说明:无,有过编程经验的人都比较了解

2.Java有没有goto?

没有,但是 goto 是 java 中的保留字。

深入说明:无

3.说说&和&&的区别(好问题)

&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的为true时,结果才为true,否则结果为false。

&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长

&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位。

深入说明:

这里弹出一道面试算法题,对于理解这个知识点有帮助

子集(可以先去尝试做一下)

里面的一种解法,用到了位与运算符的方法,代码简洁

其中:

  • t是一个空的列表,用于存储当前子集的元素。
  • ans是一个空的列表,用于存储所有可能的子集。

(1 << n) 表示进制向左移动多少位。

例如:0001 向左移动一位 0010,如果不明白。简单说明就是2^n,

当n=0时,1<

(mask & (1 << i)

这个的作用在于进行位于运算,把匹配的数字存入数组

假设n=3,输入的数为[2,3,5];

  1. 当mask=0时,直接跳出,这个时候输出的是"[]",也就是空集
  2. 当mask=1时,为001,(1<

...简单来说,就是位于运算后,哪个位置有1,就在数组里面存进去

这个方法比较难想,但是做过之后就想得到了

class Solution {
    List t = new ArrayList();
    List> ans = new ArrayList>();

    public List> subsets(int[] nums) {
        int n = nums.length;
        for (int mask = 0; mask < (1 << n); ++mask) {
            t.clear();
            for (int i = 0; i < n; ++i) {
                if ((mask & (1 << i)) != 0) {
                    t.add(nums[i]);
                }
            }
            ans.add(new ArrayList(t));
        }
        return ans;
    }
}

4.在JAVA中如何跳出当前的多重嵌套循环?

深入说明:面经上面比较复杂,简单说就是在循环中加break;拿来跳出循环。

5.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

switch 可以作用在byte上,因为byte,short,char都可以转变为int,

不能作用在long上,因为不支持

可以作用在String上,因为java7后开始,switch就支持String

深入说明:无

6.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

深入说明:无。这个看一下就知道了

7.char型变量中能不能存贮一个中文汉字?为什么?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

深入说明:无。这个看一下就知道了

8.用最有效率的方法算出2乘以8等于几?

2 << 3。因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。

深入说明:无。这个看一下就知道了

9.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

final StringBuffer a=new StringBuffer("immutable");

执行如下语句将报告编译期错误:

a=new StringBuffer("");

但是,执行如下语句则可以通过编译:

a.append(" broken!");

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final StringBuffer param){}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append("a");

深入说明:简单来说,就是看地址和地址里面存的数值。

使用final后,地址是不变的,但是地址里面存数值还可以改变。

你可能感兴趣的:(java面经基础,java,面试,经验分享)