一、Java篇
1.java中的8种基本数据类型
四种整数类型:byte 8位 short 16位 int 32位 long 64位
两种浮点型: float 32位 23位有效尾数 double 64位 52位有效尾数
一种字符类型 char 16位 是整数类型
一种布尔类型 true/false
2.== 和 equals有什么区别
==在比较基本数据类型时是比较的两者的值,在比较引用数据类型时是比较的两者的地址
equals比较引用数据类型在不重写的情况下是比较的地址,重写equals方法根据逻辑去判断
3.List和Set的区别
List是单列集合,是按add的顺序存储,元素可以有索引,元素可重复
Set是双列集合,是无序存储,以键值对的形式存储,其中key不能重复,只能通过迭代器获取元素
4.位运算符
与& 或| 非! 异或^(同为假 异为真)
5.网络协议
1.应用层
应用层决定了向用户提供应用服务时通信的活动。
TCP/IP 协议族内预存了各类通用的应用服务。例如:HTTP、SSH、FTP 等。
2.传输层
应用层的下一层就是传输层,提供处于网络连接中的两台计算机之间的数据传输
常见的传输层协议有 TCP、UDP 等。
3.网络层
网络层又称网络互连层。
网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方的计算机,并把数据包传送给对方。
网络层的作用就是在众多选项内选择一条合适的传输路径。
4.链路层
链路层又称数据链路层,网络接口层
用来处理连接网络的硬件部分,控制操作系统、硬件的设备驱动。
我们能够看到的交换机、网线、光纤等也属于物理层
TCP(有链接的协议)与UDP(无连接的协议)
三次握手:
第一次握手:A端向B端发送数据包,B确认A的发送功能正常,B确认自己的接收功能正常
第二次握手:B向A发送数据,A确认自己的发送功能和接收功能正常,A确认B的发送功能和接收功能正常
第三次握手:A向B发送数据,B确认自己的发送功能和接收功能正常,B确认A的发送功能和接收功能正常
经过三次握手双方都知道对方的接收和发送功能都正常,少一次双方都不明确,多一次就是浪费
四次挥手:
TCP和UDP的区别
6.HashMap和HashTable的区别
hashMap线程不安全,hashTable线程安全
7.设计模式
设计模式:是软件架构、实现思路,一方面便于后期扩展,二方面便于研发。
设计模式的六大原则:
1.单一原则 一个类只负责一项职责
2.里斯替换原则 子类可以扩展父类的功能,但不能改变父类原有的功能
3.依赖倒置原则 面向接口编程
4.接口隔离原则 一个类依赖一个接口,里面的抽象方法都要用到,否则重新创建一个
5.迪米特法则 一个对象应该保持对另外一个对象最少的了解
6.开闭原则 对扩展开放,对修改关闭
单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
8.排序
选择排序
冒泡排序
9.Glide的源码
Glide.with().load().into();
.with()有很多重载的方法;这个方法比较简单就是获取RequestManager对象,然后根据with()传入的参数不同,Activity Fragment Application绑定不同的生命周期。
.load();就是先调用了fromString()方法,再调用load()方法,然后把传入的图片URL地址传进去。而fromString()方法也极为简单,就是调用了loadGeneric()方法,并且指定参数为String.class,因为load()方法传入的是一个字符串参数。loadGeneric()方法是要返回一个DrawableTypeRequest对象的DrawableTypeRequest的父类是DrawableRequestBuilder,DrawableRequestBuilder中有很多个方法,这些方法其实就是Glide绝大多数的API了,比如说placeholder()方法、error()方法、diskCacheStrategy()方法、override()方法等。也就是说,最终load()方法返回的其实就是得到DrawableTypeRequest对象。
.into();进行数据初始化,然后使用httpconnect进行网络请求,然后判断是gif动画还是Drawable静态图片,最后将图片资源取出来赋值给imageview
Glide使用了Lrucache算法的三级缓存
10.Eventbus的源码
Eventbus.getDefault(),创造了一个Eventbus的单利,
register()通过注册的类,找到所有订阅的方法保存在一个list中,然后将订阅者和订阅方法封装成一个Subscription对象,并将订阅者作为key,订阅者所有event事件作为value存入到一个map集合中,register()和unregister()其实就是操作这个map。
post()根据事件获取订阅者然后通过反射执行订阅者的订阅方法。