救救孩子吧,快看个面试题吧!

码个蛋(codeegg) 第 830 次推文

码妞看世界

1.简述下OkHttp和Retrofit的使用和联系

OkHttp是一个关于网络请求的第三方类库,其中封装了网络请求的get、post等操作的底层实现,是Android端目前最为火热的网络请求框架之一。

get同步请求:首先使用new创建OkHttpClient对象。然后调用OkHttpClient对象的newCall方法生成一个Call对象,该方法接收一个Request对象,Request对象存储的就是我们的请求URL和请求参数。最后执行Call对象的execute方法,得到Response对象,这个Response对象就是返回的结果。

get异步请求:首先使用new创建OkHttpClient对象。然后调用OkHttpClient对象的newCall方法生成一个Call对象,该方法接收一个Request对象,Request对象存储的是我们的请求URL和请求参数。最后执行Call对象的enqueue方法,该方法接收一个Callback回调对象,在回调对象的onResponse方法中拿到Response对象,这就是返回的结果。总结:get的同步方法和异步方法的差别在于同步方法需要手动开启一个线程执行,而异步方法不需要(其实是使用了内部的线程)。

post同步请求: post方法的同步请求和get方法的同步请求几乎是一样的 post方法的同步请求和get方法的同步请求的区别在于,post方法生成Request对象时多执行了post(RequestBody)方法, 而RequestBody对象的子类是FormBody类,所以可以使用FormBody对象创建键值对参数。

post异步请求: 异步请求post方法的异步请求和get方法的异步请求也是非常相似的,区别也是同步请求的区别。

Retrofit是一个RESTful的HTTP网络请求框架,它是基于OkHttp的。它是通过注解配置网络参数的,支持多种数据的解析和序列化。1)添加网络请求的接口 2)创建Retrofit对象 3)创建网络请求接口实例 4)发送网络请求

总结: Retrofit的一个RESTful风格的网络请求框架,其下一层的实现也是OkHttp,所以其原理和OkHttp的一样的,只是在OkHttp的上面封装了一层,使请求接口和数据解析更加简洁明了。

2. 阐述静态变量和实例变量的区别

静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;

实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。

3. java中==和equals和hashcode的区别

  1. 在java中"=="是用来比较变量值是否相等。如果是基本类型,直接比较值。如果是对象类型,比较的是两个对象的引用,也就是地址。对象是放在堆中的,栈中存放的是对象的引用。"==" 是对栈中的值进行比较的。

  2. Object里有一个方法“equals”,这个方法是用来比较两个对象是否相等的。在Object类中有这样的代码:

public boolean equals(Object o) {
    return this == o;
}
  1. 在Object里提供了hashcode这个方法。要说hashcode就得说java集合。java有的集合是不能重复的,所以需要用equeals判断集合中元素是否是同一个。但是如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。可以说hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。

  2. "=="与"equals"关系:如果类没有重写equals,那么对于该类的对象来说“==”和“equals”没有区别。都是比较对象的内存地址。 但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。(特别注意String类)

总结:
  1. 如果两个对象相同,那么它们的hashCode值一定要相同;

  2. 如果两个对象的hashCode相同,它们并不一定相同 ,上面说的对象相同指的是用eqauls方法比较。反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。 如果重写这两个方法最好遵循以上原则。所以比较两者还要看具体是如何重写的。

4.Wait()与Sleep()方法的区别

  1. 每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度);

  2. sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;

  3. sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;

5. 简述Android虚拟机和JAVA虚拟机的区别

Android虚拟机:即DVM(Dalvik Virtual Machine),为啥不叫AVM? JAVA虚拟机:即JVM(Java Virtual Machine)。 Dalvik 是 Google 公司自己设计用于 Android 平台的 Java虚拟机,每一个Android 应用程序都拥有一个独立的Dalvik 虚拟机实例,应用程序都在它自己的进程中运行。而每一个 Dalvik 都是在Linux 中的一个进程。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。 dvm和jvm区别: 1.执行的字节码不一样 dvm执行的是.dex 文件,而jvm 执行的是.class。 .jar文件里面包含多个.class文件,每个.class文件里面包含了该类的头信息(如编译版本)、常量池、类信息、域、方法、属性等等,当JVM加载该.jar文件的时候,会加载里面的所有的.class文件,这样会很慢。 Android 工程编译后的所有.class字节码会被dex工具抽取到一个.dex文件中。 .class文件存在很多的冗余信息,dex工具会去除冗余信息减少了整体文件尺寸,并把所有的.class文件整合到.dex文件中。减少了I/O 操作,提高了类的查找速度。

jvm: java->class->jar
dvm: java->class->dex

2.基于的架构不一样 Dalvik 基于寄存器,寄存器是CPU上面的一块存储空间;而 JVM 基于栈,栈是内存上面的一段连续的存储空间。寄存器存取速度比栈快的多,dvm可以根据硬件实现最大的优化,比较适合移动设备。

3.Dalvik 和 Java 运行环境不同 Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。Dalvik虚拟机有自己的 bytecode,并非使用 Java bytecode。 JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境。我们用Java编写的软件可以运行在任何的操作系统上,这个特性称为Java语言的跨平台性。该特性是由JVM实现的,我们编写的程序运行在JVM上,而JVM运行在操作系统上。 

 JVM本身不具备跨平台功能的,每个操作系统都有不同版本的虚拟机

4.Dalvik 和 Java 的SDK不同

其他: Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。 Android有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。

往期文章:

今日问题:

每天一道题,强健Android人。

专属升级社区:《这件事情,我终于想明白了》 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值