Android基础知识总结(一)
1.面向对象(OOP):针对业务处理过程的实体及其属性和行为进行抽象封装以获得高效清晰的逻辑单元划分。
三大特性:①封装(隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变量隔离便于使用,提高代码的服用小和安全性);②继承(提高代码的复用性,继承是多态的前提);③多态(父类或接口定义的引用变量可以指向子类或具体实现类的形象,提高了程序的拓展性)。
五大原则:单一职责、开放封闭、里氏替换、依赖倒置、接口分离。
2.数据类型:byte 1个字符,short 、char2 个字符,int 、float 4个字符,long 、double 8个字符。
volatile是一个类型修饰符(type specifier)volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。(from百度)
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
在JDK1.7之前,switch语句仅支持byte、short、char、int,在JDK1.7之后,枚举、字符串类型都可以,通过String.hashcode转成int进行判断。
String不可变原因:字符串常量池的需要;运行String对象缓存HashCode,提高效率;多线程安全。
String 转integer的方法和原理
①Integer.parseInt(String str)调用Integer内部的;
②Integer.parseInt(String s, int radix)parseInt内部首先判断字符串是否包含符号(-或者+),则对相应的negative和limit进行赋值,然后再循环字符串,对单个char进行数值计算
③Character.digit(char ch, int radix) 返回指定基数中字符表示的数值。函数肯定进入到0-9字符的判断(相对于string转换到int),否则会抛出异常,数字就是如上面进行拼接然后生成的int类型数值。
限定参数类型的上界:参数类型必须是T或T的子类型
<? super T> 限定参数类型的下界:参数类型必须是T或T的超类型
3.equal和==的区别:equal 比较对象,==比较原生类型
equal:存储空间的值是否相同,字符串内容比较,值是否相同
==:是否为同一内存空间,内存空间是否相同,引用是否相同
如果一个类重写了equals()方法,则一定也要重写hashCode()方法,原因是:虽然equals()方法重写可以保证正确判断两个对象在逻辑是否相同,但是hashCode()方法映射的物理地址是不相同的,依然会将逻辑上相同的两个元素存入集合,但是第二个对象的内容会是Null.
参考文章:关于java中Object类中的equals()和hashCode()方法的使用个人总结 - 张森(ZhangSen) - 博客园
4.字符串运行速度:StringBuilder > StringBuffer (线程安全)> String ,String为常量,其它为变量,所以运行慢。
StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串。
StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高
5.Queue 队列:先进先出,Stack 栈:后进先出。Collect -->List/Set/Map
6.ListView机制:用到的适配器有ArrayAdapter、SimpleAdapter、BaseAdapter
BaseAdapter 重写的方法getCount()、getItem()、getItemId()、getView(),每绘制一次就调用一次getView(),在getView()中将事先定好的layout布局确定显示的效果并返回一个view对象作为一个item 显示出来,getItem()、getItemId()在调用LIstView响应方法时调用。
7.Fragment生命周期
参考文章:Fragment各种情况的生命周期 - 猫吻鱼的博客 - CSDN博客
onAttach(): 完成Fragment和Activity的绑定,参数中的Activity即为要绑定的Activity,可以进行赋值等操作。
onCreate() : 完成Fragment的初始化
onCreateView() : 加载Fragment布局,绑定布局文件
onActivityCreated() : 表名与Fragment绑定的Activity已经执行完成了onCreate,可以与Activity进行交互操作。
onStart() : Fragment变为可见状态
onResume() : Fragment变为可交互状态
onPause(): Fragment变为不可交互状态(不代表不可见)
onSaveInstanceState():保存当前Fragment的状态。记录一些数据,比如EditText键入的文本,即使Fragment被回收又重新创建,一样能恢复EditText之前键入的文本。
onStop(): Fragment变为不可见状态
onDestroyView() : 销毁Fragment的有关视图,但并未和Activity解绑,可以通过onCreateView()重新创建视图。Fragment销毁时或者ViewPager+Fragment情况下会调用
onDestroy() : 销毁Fragment时调用
onDetach() : 解除和Activity的绑定。Fragmen销毁最后一步。
8.四大引用类型
强引用: 是指创建一个对象并把这个对象赋给一个引用变量。 强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
软引用(SoftReference):如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。
弱引用(WeakReference):弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
虚引用(PhantomReference):虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。
9.线程是进程的子集,一个进程可有多个线程。
线程间通讯方式:①共享变量;②管道;③handler;④runOnUiThread(Runnable);⑤view.post(Runnable)。
进程间通讯方式:①管道;②FIFO;③消息队列;④信号量;⑤共享内存区;⑥套接字socket信号。
Activity间的通信方式:①Intent;②借助类的静态变量;③借助全局变量/Application;④借助外部工具(SharedPreference、SQLite、File、剪贴板);⑤借助Service。
10.PackageManagerService APP安装有关的service,WindowManagerService APP调用窗口相关的service,ActivityManagerService 系统的引导服务,支持应用进程的启动、切换、调度、四大组件的启动和管理。
自定义系统服务:在ServiceManager注册,在Framework/base增加JNI,C++ 文件,在build 配置mk文件,全部编译,才可调用。
上一篇:Android面试总结
下一篇:Android基础知识总结(二)