史上最全的Android面试题集锦(十一)

原文连接:https://blog.csdn.net/xiangzh...java

七、 常量池

7.一、Interger中的128(-128~127)面试

当数值范围为-128~127时:若是两个new出来Integer对象,即便值相同,经过“”比较结果为false,但两个对象直接赋值,则经过“”比较结果为“true,这一点与String很是类似。数组

当数值不在-128~127时,不管经过哪一种方式,即便两个对象的值相等,经过“”比较,其结果为false;缓存

当一个Integer对象直接与一个int基本数据类型经过“”比较,其结果与第一点相同;安全

Integer对象的hash值为数值自己;网络

@Override public int hashCode() { return Integer.hashCode(value); }ide

7.二、为何是-128-127?.net

在Integer类中有一个静态内部类IntegerCache,在IntegerCache类中有一个Integer数组,用以缓存当数值范围为-128~127时的Integer对象。设计

八、泛型

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操做的数据类型被指定为一个参数。这种参数类型能够用在类、接口和方法的建立中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。代理

泛型的好处是在编译的时候检查类型安全,而且全部的强制转换都是自动和隐式的,提升代码的重用率。

它提供了编译期的类型安全,确保你只能把正确类型的对象放入 集合中,避免了在运行时出现ClassCastException。

使用Java的泛型时应注意如下几点:

  • 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
  • 同一种泛型能够对应多个版本(由于参数类型是不肯定的),不一样版本的泛型类实例是不兼容的。
  • 泛型的类型参数能够有多个。
  • 泛型的参数类型可使用extends语句,例如。习惯上称为“有界类型”。
  • 泛型的参数类型还能够是通配符类型。例如Class<?> classType =
  • Class.forName(“java.lang.String”);

8.1 T泛型和通配符泛型

  • ? 表示不肯定的java类型。
  • T 表示java类型。
  • K V 分别表明java键值中的Key Value。
  • E 表明Element。

8.2 泛型擦除

Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。

泛型是经过类型擦除来实现的,编译器在编译时擦除了全部类型相关的信息,因此在运行时不存在任何类型相关的信息。例如 List在运行时仅用一个List来表示。这样作的目的,是确保能和Java 5以前的版本开发二进制类库进行兼容。你没法在运行时访问到类型参数,由于编译器已经把泛型类型转换成了原始类型。

8.3 限定通配符

限定通配符对类型进行了限制。

一种是<? extends T>它经过确保类型必须是T的子类来设定类型的上界,

另外一种是<? super T>它经过确保类型必须是T的父类来设定类型的下界。

另外一方面<?>表 示了非限定通配符,由于<?>能够用任意类型来替代。

例如List<? extends Number>能够接受List或List。

8.4 泛型面试题

你能够把List传递给一个接受List参数的方法吗?

对任何一个不太熟悉泛型的人来讲,这个Java泛型题目看起来使人疑惑,由于乍看起来String是一种Object,因此 List应当能够用在须要List的地方,可是事实并不是如此。真这样作的话会致使编译错误。如 果你再深一步考虑,你会发现Java这样作是有意义的,由于List能够存储任何类型的对象包括String, Integer等等,而List却只能用来存储Strings。

Array中能够用泛型吗?

Array事实上并不支持泛型,这也是为何Joshua Bloch在Effective Java一书中建议使用List来代替Array,由于List能够提供编译期的类型安全保证,而Array却不能。

Java中List和原始类型List之间的区别?

原始类型和带参数类型之间的主要区别是,在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查,经过使用Object做为类型,能够告知编译器该方法能够接受任何类型的对象,好比String或Integer。这道题的考察点在于对泛型中原始类型的正确理解。它们之间的第二点区别是,你能够把任何带参数的类型传递给原始类型List,但却不能把List传递给接受 List的方法,由于会产生编译错误。

List<?> 是一个未知类型的List,而List 实际上是任意类型的List。你能够把List, List赋值给List<?>,却不能把List赋值给 List。

九、反射

9.一、概念

JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

9.二、做用

Java反射机制主要提供了如下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具备的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

十、代理

代理这个词你们确定已经很是熟悉,由于现实中接触的不少,其实现实中的东西偏偏能够很是形象和直观地反映出模式的抽象过程以及本质。如今房子不是吵得热火朝天吗?咱们就以房子为例,来拨开代理的面纱。

假设你有一套房子要卖,一种方法是你直接去网上发布出售信息,而后直接带要买房子的人来看房子、过户等一直到房子卖出去,可是可能你很忙,你没有时间去处理这些事情,因此你能够去找中介,让中介帮你处理这些琐碎事情,中介实际上就是你的代理。原本是你要作的事情,如今中介帮助你一一处理,对于买方来讲跟你直接交易跟同中介直接交易没有任何差别,买方甚至可能觉察不到你的存在,这实际上就是代理的一个最大好处。

接下来咱们再深刻考虑一下为何你不直接买房子而须要中介?其实一个问题偏偏解答了何时该用代理模式的问题。

缘由一:你可能在外地上班,买房子的人无法找到你直接交易。

对应到咱们程序设计的时候就是:客户端没法直接操做实际对象。那么为何没法直接操做?一种状况是你须要调用的对象在另一台机器上,你须要跨越网络才能访问,若是让你直接coding去调用,你须要处理网络链接、处理打包、解包等等很是复杂的步骤,因此为了简化客户端的处理,咱们使用代理模式,在客户端创建一个远程对象的代理,客户端就象调用本地对象同样调用该代理,再由代理去跟实际对象联系,对于客户端来讲可能根本没有感受到调用的东西在网络另一端,这实际上就是Web Service的工做原理。另外一种状况虽然你所要调用的对象就在本地,可是因为调用很是耗时,你怕影响你正常的操做,因此特地找个代理来处理这种耗时状况,一个最容易理解的就是Word里面装了很大一张图片,在word被打开的时候咱们确定要加载里面的内容一块儿打开,可是若是等加载完这个大图片再打开Word用户等得可能早已经跳脚了,因此咱们能够为这个图片设置一个代理,让代理慢慢打开这个图片而不影响Word原本的打开的功能。申明一下我只是猜可能Word是这么作的,具体到底怎么作的,俺也不知道。

缘由二:你不知道怎么办过户手续,或者说除了你如今会干的事情外,还须要作其余的事情才能达成目的。

对应到咱们程序设计的时候就是:除了当前类可以提供的功能外,咱们还须要补充一些其余功能。最容易想到的状况就是权限过滤,我有一个类作某项业务,可是因为安全缘由只有某些用户才能够调用这个类,此时咱们就能够作一个该类的代理类,要求全部请求必须经过该代理类,由该代理类作权限判断,若是安全则调用实际类的业务开始处理。可能有人说为何我要多加个代理类?我只须要在原来类的方法里面加上权限过滤不就完了吗?在程序设计中有一个类的单一性原则问题,这个原则很简单,就是每一个类的功能尽量单一。为何要单一,由于只有功能单一这个类被改动的可能性才会最小,就拿刚才的例子来讲,若是你将权限判断放在当前类里面,当前这个类就既要负责本身自己业务逻辑、又要负责权限判断,那么就有两个致使该类变化的缘由,如今若是权限规则一旦变化,这个类就必需得改,显然这不是一个好的设计。

好了,原理的东西已经讲得差很少了,要是再讲个没完可能你们要扔砖头了。呵呵,接下来就看看怎么来实现代理。

点击下方连接免费获取Android进阶资料:

https://shimo.im/docs/tXXKHgd...

相关文章
相关标签/搜索