![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
小小面试题
面试题积累
独饮敌敌畏丶
做自己该做的事,并接收它的事与愿违!
展开
-
C 和 Java 中字符串和字符数组的对比
1.实现原理在 C 语言中,字符串和字符数组本质上都是一块连续的内存空间,需要转义0(\0)结束符;在 Java 中,字符串和字符数组有本质区别,字符串是 String 对象,而字符数组是数组对象,均不需要结束符。如果是数组对象,对象内存区域中有一个字段表示数组的长度,而 String 相当于字符数组的包装类。比如String的源码就类似于这样java.lang.Stringpublic final class String { private final char value[];原创 2021-04-06 18:48:30 · 533 阅读 · 0 评论 -
WindowManager是什么?和WMS的关系?
WindowManager就是用来管理Window的,实现类为WindowManagerImpl,实际工作会委托给WindowManagerGlobal类中完成。而具体的Window操作,WM会通过Binder告诉WMS,WMS做最后的真正操作Window的工作,会为这个Window分配Surface,并绘制到屏幕上。...原创 2021-04-03 10:18:32 · 249 阅读 · 0 评论 -
Window是什么
窗口。你可以理解为手机上的整个画面,所有的视图都是通过Window呈现的,比如Activity、dialog都是附加在Window上的。Window类的唯一实现是PhoneWindow,这个名字就更加好记了吧,手机窗口呗。那Window到底在哪里呢?我们看到的View是Window吗?是也不是。如果说的只是Window概念的话,那可以说是的,View就是Window的存在形式,Window管理着View。如果说是Window类的话,那确实不是View,唯一实现类PhoneWindow管理着当前界面上的原创 2021-04-03 10:17:21 · 404 阅读 · 0 评论 -
为什么Java提供了Serializable的序列化方式,而不是直接使用json或者xml?
我觉得是历史遗留问题。有的人可能会想到各种理由,比如可以标记哪些类可以被序列化。又或者可以通过UID来标示反序列化为同一个对象。等等。但是我觉得最大的问题还是历史遗留问题,在以前,json还没有成为大家认同的数据结构,所以Java就设计出了Serializable的序列化方式来解决对象持久化和对象传输的问题。然后Java中各种API就会依赖于这种序列化方式,这么些年过去了,Java体系的庞大也造成难以改变这个问题,牵一发而动全身。为什么我这么说呢?主要有两点依据:曾经Oracle Java平台组的原创 2021-04-03 10:15:16 · 407 阅读 · 2 评论 -
Parcelable一定比Serializable快吗?
正常情况下,对象在内存中进行传输确实是Parcelable比较快,但是Serializable是有缓存的概念的,有人做了一个比较有趣的实验:当序列化一个超级大的对象图表(表示通过一个对象,拥有通过某路径能访问到其他很多的对象),并且每个对象有10个以上属性时,并且Serializable实现了writeObject()以及readObject(),在平均每台安卓设备上,Serializable序列化速度大于Parcelable 3.6倍,反序列化速度大于1.6倍。具体原因就是因为Serilazable的原创 2021-04-03 10:04:24 · 175 阅读 · 0 评论 -
Serializable、Parcelable、Json等序列化方式我们该怎么选择?
先说说序列化的用处,主要用在三个方面:1、内存数据传输内存传输方面,主要用Parcelable。一是因为Parcelable在内存传输的效率比Serializable高。二是因为在Android中很多传输数据的方法中,自带了对于Serializable、Parcelable类型的传输方法。比如:Bundle.putParcelable,Intent putExtra(String name, Parcelable value)等等吧,基本上对象传输的方法都支持了,所以这也是Parcelabl原创 2021-04-03 10:02:57 · 566 阅读 · 0 评论 -
在java有Serializable的前提下,Android为什么设计出了Parcelable?
java中的序列化方式Serializable效率比较低,主要有以下原因:Serializable在序列化过程中会创建大量的临时变量,这样就会造成大量的GC(垃圾回收)。Serializable使用了大量反射,而反射操作耗时。Serializable使用了大量的IO操作,也影响了耗时。所以Android就像重新设计了IPC方式Binder一样,重新设计了一种序列化方式,结合Binder的方式,对上述三点进行了优化,一定程度上提高了序列化和反序列化的效率。...原创 2021-03-28 16:52:47 · 112 阅读 · 0 评论 -
怎么提升反射效率
1、缓存重复用到的对象利用缓存,其实我不说大家也都知道,在平时项目中用到多次的对象也会进行缓存,谁也不会多次去创建。但是,这一点在反射中尤为重要,比如Class.forName方法,我们做个测试:long startTime = System.currentTimeMillis();Class clz = Class.forName("com.example.studynote.reflection.User");User user;int i = 0;while (i < 100000原创 2021-03-28 10:40:45 · 1254 阅读 · 0 评论 -
反射原理
在底层,是怎么获取到类的相关信息的呢?首先回顾下JVM加载Java文件的过程:编译阶段,.java文件会被编译成.class文件,.class文件是一种二进制文件,内容是JVM能够识别的机器码。.class文件里面依次存储着类文件的各种信息,比如:版本号、类的名字、字段的描述和描述符、方法名称和描述、是不是public、类索引、字段表集合,方法集合等等数据。然后,JVM中的类加载器会读取字节码文件,取出二进制数据,加载到内存中,并且解析.class文件的信息。类加载器会获取类的二进原创 2021-03-28 10:45:27 · 108 阅读 · 0 评论 -
反射获取static静态变量
说完了final,再说说static,怎么修改static修饰的变量呢?我们知道,静态变量是在类的实例化之前就进行了初始化(类的初始化阶段),所以静态变量是跟着类本身走的,跟具体的对象无关,所以我们获取变量就不需要传入对象,直接传入null即可:public class User { public static String name;}field2 = clz.getDeclaredField("name");field2.setAccessible(true);//获取静态变量Obje原创 2021-03-28 10:35:10 · 5792 阅读 · 1 评论 -
反射可以修改final类型成员变量吗?
反射可以修改final类型成员变量吗?final我们应该都知道,修饰变量的时候代表是一个常量,不可修改。那利用反射能不能达到修改的效果呢?我们先试着修改一个用final修饰的String变量。public class User { private final String name = "Bob"; private final Student student = new Student(); public String getName() { return n原创 2021-03-24 23:37:14 · 4139 阅读 · 8 评论