2019最全的java面试题

所需积分/C币:50 2019-04-20 16:53:06 2.17MB PDF

2019年最全面试题。145页,63542字。 涵盖java所有要点,外加框架和算法要点
)实现的是编译时的多态性(也称为前绑定),而方法重写( )实现的 是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态 需要做两件事:方法重写(子类继承父类并重写父类中已有的或抽象的方法):对象 造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的 不同而衣现出不同的行为)。 、访问修饰符 以及不写(默认)时的区 别? 答:区别如下 作用域当前类同包子类其他 类的成员不写访问修饰时默认为默认对」同一个包中的其他类相当于公开 ,对于不是同一个包中的其他类相当于私有()。受护( )对 子类相当于公开,对不是同一包中的没有父子关系的类相当于私有 是最基本的数据类型吗 答:不是。中的基本数据类型只有个: ;除了基本类型( )和枚举类型( ),剩下 的都是引用类型( 是否正确 答不正确。是双精度数,将双精度型( )赋值给浮点型()属于下转型 ,也称为窄化)会造成精度损失,因此需要强制类型转换 或者写成 有错吗 有错吗 答:对于 由于是类型,因此运算结果也是型 需要强制转换类型才能赋值给型。而 可以正确编译,因为 相当于 其中有隐含的强制类型转换。 有没有 答: 是中的保留字,在目前版本的中没有使用。(根据 (之父)编写的《 》一书的附录中给出了一个 关键字列表,其中有和 但是这两个是目前无法使用的关键字,因此有些地方 将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉语言的程序员都 知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字) 和 有什么区别 答:是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对 象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,为每一个基本 数据类型都引入了对应的包装类型( ),的包装类就是 从 开始引入了自动装箱拆箱机制,使得二者可以相互转换 为每个原始类型提供了包装类型 原始类型 包装类型: 将自动装箱成 类型 两个引用没有引用同一对象 自动拆箱成类型再和比较 补充:最近还遇到一个面试题,也是和自动装箱和拆箱相关的,代码如下所示 如果不明就里很容易认为两个输出要么都是要么都是。首先需要注意的是 四个变量都是 对象,所以下面的运算比较的不是值而是引用。装箱的 本质是什么呢?当我们给一个 对象赋一个值的时候,会调用 类的静态方 法 ,如果看看 的源代码就知道发生了什么。 是 的内部类,其代码如下所小 简单的说,如果字面量的值在到之间,那么不会新的 对象,而 是直接引用常量池中的 对象,所以上面的面试题中 的结果是,而 的结果是。越是貌似简单的面试题其中的玄机就越多,需要面试者有相当深厚的功力。 和的区别? 答:运算符有两种用法:按位与:逻辑与。运算符是短路与运算。逻辑与跟 短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是整个表达 式的值才是 之所以称为短路运算是因为,如果左边的表达式的值是,右边 的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用而不是,例如在 验证用户登录时判定用户名不是而且不是空字符串,应当写为 && username. equals("),者的顺序不能交换,更不能用运算符,因为第一个条件如果 不成立,根本不能进行字符串的比较,否则会产生 异常。注 意:逻辑或运算符()和短路或运算符()的差别也是如此。 、解释内存中的栈()、堆和静态存储区的用法 答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现 场保存都使用内存中的栈空间;而通过关键字和构造器创建的对象放在堆空间;程序 中的字面量()如直接书写的、"helo和常量都是放在静态存储区中。栈空间操 作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可 以被当成堆空间来使用。 String str new String("hello"); 上面的话句中放在栈上,用创建出来的字符串对象放在堆上,而"hell"这个字 面量放在静态存储区 补充:较新版本的中使用了一项叫“逃逸分析“的技术,可以将一些局部对象放在 栈上以提升对象的操作性能 等于多少 等于多少 答 的返回值是 的返回值是。四舍五入的 原理是在参数上加然后进行下取整。 是否能作用在 上,是否能作用在 上,是否 能作用在 上 答:早期的中 )中 可以是 从 版开始 中引入了枚举类型(),也可以是枚举,从 版开始,还 可以是字符串()。长整型()是不可以的。 用最有效率的方法计算乘以 答 (左移位相当于乘以的次方,右移位相当于除以的次方)。 补充:我们为编写的类重写 方法时,可能会看到如下所示的代码,其实我 们不太理解为什么要使用这样的乘法运算来产生哈希码(散列码),而且为什么这个数是个 素数,为什么通常选择这个数?前两个问题的答案你可以自己百度一下,选择是因 为可以用移位和减法运算来代替乘法,从而得到更好的性能。说到这里你可能已经想到了 左移位相当于乘以的次方()再减去自身就相 当于乘以。现在的都能自动完成这个优化 、数组有没有 方法 有没有 方法? 答:数组没有 方法,有 的属性。 有 方 获得宇符串的长度是通过 属性得到的,这“点容易和混淆。 在 中,如何跳出当前的多重嵌套循环? 答:在最外层循环前加·个标记如,然后用 可以跳出多重循环。(中 支持带标签的 语句,作用有点类似于和中的语句,但是就 像要避免使用样,应该遊免使用带标签的和 ,因为它不会让你的程 序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道吏好) 构造器( )是否可被重写( 答:构造器不能被继承,因此不能被重写,但可以被重载。 两个对象值相同 但却可有不同的 ,这句话对不对? 答:不对,如果两个对象和满足 ,它们的哈希码( 应当相同。 对于 方法和 方法是这样规定的:如果两个对象相同 方法返回),那么它们的 值一定要相同:如果两个对象的 相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上 述原则就会发现在使用容器时,相同的对象可以出现在集合中,同时增加新元素的效率 会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下 降 补充:关于 和 方法,很多程序都知道,但很多人也就是仅仅 知道而已,在 的大作《 》(很多软件公司,《 《编程思想》以及《重构:改善既有代码质量》是程序员必看书籍,如果你还没 看过,那就赶紧去亚马逊买本吧)中是这样介绍 方法的:首先 方法必须满 足自反性( 必须返回)、对称性( 返回时, 也必 须返回)、传递性( 都返回时 也必须返回 )和一致性(当和引用的对象信息没有被修改时,多次调用 应该得到同 样的返回值),而且对于任何非值的引用, 必须返回实现高质 量的 方法的诀窍包括:使用操作符检查“参数是否为这个对象的引用”;使用 操作符检查“参数是否为正确的类型”;对于类中的关键属性,检查参数传入对 象的属性是否与之相匹配;编写完 方法后,问自己它是否满足对称性、传递性、 一致性;重写 时总是要重写 不要将 方法参数中的 对象替换为其他的类型,在重写时不要心掉 注解。 是否可以继承 类 答 类是类,不可以被继承。 补充:继承本身就是一个错误的行为,对类型最好的重用方式是关联 )而不是继承()。 当一个对象被当作参数传递到一个方法后,此方法可改变这个 对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引 用传递 答:是值传递 编程语言只有值传递参数。当·个对象实例作为·个参数被传递 到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对 象的引用是水远不会改变的。和中可以通过传引用或传输出参数来改变传入的参数 的值 补充:中没有传引用实在是非常的不方便,这一点在 中仍然没有得到改进, 正是如此在编写的代码中才会出现大量的 类(将需要通过方法调用修改的引 用置于一个 类中,再将 对象传入方法),这样的做法只会让代码变得臃 肿,尤其是让从和转型为程序员的开发者无法容忍 和 的区别 平台提供了两种类型的字符串 和 ,它们 可以储存和操作字符串。其中 是只读字符串,也就意味着 引用的字符串内容 是不能被改变的。而 和 类表示的字符串对象可以直接进行修改 是 中引入的,它和 的方法完全相同,区别在于它是在单 线程环境下使用的,因为它的所有方面都没有被 修饰,因此它的效率也比 略高。 补充:有个面试题问:有没有哪种情况用做字符串连接比调用 对象的 方法性能更好?如果连接后得到的字符串在静态存储区中是早 己存在的,那么用做字符串连接是优于 的 方法的。 补充:下面也是一个面试题,问程序的输出,看看自己能不能说出正确答案,

...展开详情
img
随教教主
  • GitHub

    绑定GitHub第三方账户获取

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐