关于android:史上最全的Android面试题集锦十一

53次阅读

共计 3563 个字符,预计需要花费 9 分钟才能阅读完成。

原文链接:https://blog.csdn.net/xiangzh…

7、常量池

7.1、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); }

7.2、为什么是 -128-127?

在 Integer 类中有一个动态外部类 IntegerCache,在 IntegerCache 类中有一个 Integer 数组,用以缓存当数值范畴为 -128~127 时的 Integer 对象。

8、泛型

泛型是 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、反射

9.1、概念

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

9.2、作用

Java 反射机制次要提供了以下性能:在运行时判断任意一个对象所属的类;在运行时结构任意一个类的对象;在运行时判断任意一个类所具备的成员变量和办法;在运行时调用任意一个对象的办法;生成动静代理。

10、代理

代理这个词大家必定曾经十分相熟,因为事实中接触的很多,其实事实中的货色恰好能够十分形象和直观地反映出模式的形象过程以及实质。当初房子不是吵得热气腾腾吗?咱们就以房子为例,来拨开代理的面纱。

假如你有一套房子要卖,一种办法是你间接去网上公布发售信息,而后间接带要买房子的人来看房子、过户等始终到房子卖出去,然而可能你很忙,你没有工夫去解决这些事件,所以你能够去找中介,让中介帮你解决这些琐碎事件,中介实际上就是你的代理。原本是你要做的事件,当初中介帮忙你一一解决,对于买方来说跟你间接交易跟同中介间接交易没有任何差别,买方甚至可能发觉不到你的存在,这实际上就是代理的一个最大益处。

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

起因一:你可能在当地下班,买房子的人没法找到你间接交易。

对应到咱们程序设计的时候就是:客户端无奈间接操作理论对象。那么为什么无奈间接操作?一种状况是你须要调用的对象在另外一台机器上,你须要逾越网络能力拜访,如果让你间接 coding 去调用,你须要解决网络连接、解决打包、解包等等非常复杂的步骤,所以为了简化客户端的解决,咱们应用代理模式,在客户端建设一个近程对象的代理,客户端就象调用本地对象一样调用该代理,再由代理去跟理论对象分割,对于客户端来说可能基本没有感觉到调用的货色在网络另外一端,这实际上就是 Web Service 的工作原理。另一种状况尽管你所要调用的对象就在本地,然而因为调用十分耗时,你怕影响你失常的操作,所以特意找个代理来解决这种耗时状况,一个最容易了解的就是 Word 外面装了很大一张图片,在 word 被关上的时候咱们必定要加载外面的内容一起关上,然而如果等加载完这个大图片再关上 Word 用户等得可能早曾经跳脚了,所以咱们能够为这个图片设置一个代理,让代理缓缓关上这个图片而不影响 Word 原本的关上的性能。申明一下我只是猜可能 Word 是这么做的,具体到底怎么做的,俺也不晓得。

起因二:你不晓得怎么办过户手续,或者说除了你当初会干的事件外,还须要做其余的事件能力达成目标。

对应到咱们程序设计的时候就是:除了以后类可能提供的性能外,咱们还须要补充一些其余性能。最容易想到的状况就是权限过滤,我有一个类做某项业务,然而因为平安起因只有某些用户才能够调用这个类,此时咱们就能够做一个该类的代理类,要求所有申请必须通过该代理类,由该代理类做权限判断,如果平安则调用理论类的业务开始解决。可能有人说为什么我要多加个代理类?我只须要在原来类的办法外面加上权限过滤不就完了吗?在程序设计中有一个类的单一性准则问题,这个准则很简略,就是每个类的性能尽可能繁多。为什么要繁多,因为只有性能繁多这个类被改变的可能性才会最小,就拿方才的例子来说,如果你将权限判断放在以后类外面,以后这个类就既要负责本人自身业务逻辑、又要负责权限判断,那么就有两个导致该类变动的起因,当初如果权限规定一旦变动,这个类就必须得改,显然这不是一个好的设计。

好了,原理的货色曾经讲得差不多了,要是再讲个没完可能大家要扔砖头了。呵呵,接下来就看看怎么来实现代理。

点击下方链接收费获取 Android 进阶材料:

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

正文完
 0