2020-11-17

21 篇文章 0 订阅

11/16
今天的10道面试题
1.访问修饰符
public private protected default

2.java为什么不支持多继承
多继承会让程序更加复杂
A foo()
/ \
/ \
foo() B C foo()
\ /
\ /
D foo()

3.String 和 StringBuffer、StringBuiler

①可变性:String不可变,后两者可变。原理:String底层使用了final关键字保存。
②线程安全性:String安全,后两者中StringBuffer有同步锁,所以线程安全,但是StringBuilder没有同步锁,所以线程不安全
③性能:每次对String类型进行改变的时候,都会产生新的String对象,然后将这个指针指向新的String对象;StringBuffer只会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象的引用。相同情况下使用StringBuilder会比StringBuffer获得10%-15%的性能提升,但是却要冒多线程不安全的风险

对字符串进行拼接操作,也就是做"+"运算的时候,分2中情况:
i.表达式右边是纯字符串常量,那么存放在常量池里面。
ii.表达式右边如果存在字符串引用,也就是字符串对象的句柄,那么就存放在堆里面

4.String类不可变的原因
String可变就相当于废了缓存池,会影响速度。并且有StringBuffer和StringBuilder,不需要可变。

5.浅拷贝和深拷贝的原因
1.浅拷贝:对基本数据类型进行值传递,而对引用数据类型进行传递般的拷贝
2.深拷贝:对基本数据类型进行值传递,而对引用数据类型进行创建新的对象并且复制这个内容。

6.自动拆箱和自动装箱
装箱:将基本类型用他们对应的引用类型包装起来
拆箱:将包装类型转换为基本数据类型

7.值传递和引用传递
值传递是将值的副本传递给调用的函数,调用的函数可以改变副本的值,但是并不会影响main函数的原值
引用传递,传递的是对象的引用,同一个引用指向相同的实体,所以改变引用指向实体的值,可以影响main函数中实体的值

8.接口和抽象类的区别是什么
1.所有的方法在接口中都不能实现(java8中开始接口方法可以有默认实现),抽象类中可以有非抽象的方法(不可实现)和非抽象的方法(必须实现)
2.接口中的实例变量默认是final类型的,而抽象类则不一定
3.一个类可以实现多个接口,但是一个类最多继承一个抽象类
4.一个类实现接口的话要实现接口中的所有方法,而抽象类实现抽象方法就可以了
5.抽象方法中可以有public、protected和default这些修饰符,接口方法默认修饰符是public。你不可以使用其他的修饰符

9.成员变量与局部变量的区别有哪些
1.成员变量是属于类的,而局部变量是属于方法内部的,局部变量不能被访问控制符以及static修饰,但是成员变量和局部变量都可以被final修饰
2.在变量在内存的存储方式来看,成员变量是对象中的一部分,而对象存在于堆内存中,局部变量存在于栈内存中
3.从变量在内存生存时间来看,成员变量是对象中的一部分,它随着对象的创建而产生,随着对象的死亡而消失;局部变量是方法的一部分,随着方法的调用而产生,随着方法结束而消失
4.成员变量如果没有被赋予初值,则会自动以类型的默认值进行复制,但是局部变量必须要赋予初值

10java中的异常
Trowable中有Error和Exception两大类
其中Error有虚拟机错误(VirtulMachineError)和AWTError,然后Exception异常有IOException和RuntimeException
在以下的几种情况下,finally语句块不会被执行:
在finally语句块之中存在异常
在前面的代码中调用了system.exit()
程序所在的线程已经死亡
CPU关闭了

以上就是今天的10道面试题
然后今天的算法,主要是继续刷dfs(二维平面的题目解决,和DP动态规划的初入门)
经典题目有:
【LeetCode】
200. 岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1

示例 2:

输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3

解决代码如下:

class Solution {
    public int numIslands(char[][] grid) {
        int m=grid.length;//m行
        int n=grid[0].length;//n列
        if(m==0){
            return 0;
        }
        int[][] direction={{-1,0},{0,-1},{1,0},{0,1}};
        boolean[][] flag=new boolean[m][n];
        int count=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(!flag[i][j]&&grid[i][j]=='1'){
                    count++;
                    dfs(m,n,flag,direction,grid,i,j);
                }
            }
        }
        return count;
    }
    public void dfs(int m,int n,boolean[][] flag,int[][] direction,char[][] grid,int i,int j){
        flag[i][j]=true;
        for(int k=0;k<4;k++){
            int newX=i+direction[k][0];
            int newY=j+direction[k][1];
            if(inArea(newX,newY,m,n)&&!flag[newX][newY]&&grid[newX][newY]=='1'){
                dfs(m,n,flag,direction,grid,newX,newY);
            }
        }

    }
    public boolean inArea(int x,int y,int m,int n){
        return x>=0&&x<m&&y>=0&&y<n;
    }
}

思想是创建状态数组来判断。
今天相对来说比较摸鱼,还看了计算机网络的数据链路层一部分内容,复习了一下,算是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值