Welcome to Ray's Blog

Stay Hungry Stay Foolish - Steve Jobs

0%

常用知识点〇


Java 基础

1. 接口的意义

规范,扩展,回调;

2. Java 的三大特性

封装,多态,继承;

3. 抽象类的意义

  • 为其子类提供一个公共的类型;
  • 封装子类中重复的内容;
  • 定义抽象方法,让子类去做自定义的方法实现;

4. 内部类的作用

  • 内部类可以使用限定修饰符(private、protected、public),从而实现类的隐藏功能。通常外部类是只能使用 public 限定符;
  • 内部类拥有外围类的所有元素访问权限,在 android 中,这里需要注意内部类对 Activity 的强引用而导致的内存泄露问题;
  • 可以实现多重继承(extends)和实现(implements);
  • 可以避免修改接口而实现同一个类中在继承一个类和实现一个接口中出现俩种同名方法的调用问题;(经过测试发现,该问题貌似并没什么大问题。因为在接口中的方法并没有具体实现的,可以选择在继承的方法中实现想要实现的方法体,如果要使用继承父类的同名方法,只需要使用 super.ff()即可。极端情况,我就需要单独实现,那么则可以选择内部类的方式。)

5. 抽象类与接口的区别

  • 语法层面上的区别
  1. 抽象类可以提供成员方法的实现细节,而接口中只能存在 public abstract 修饰的方法,而且接口中所有的方法不管是否加 public abstract 修饰,都是默认 public abstract 修饰;
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 pubilc static final 类型的;
  3. 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口;
  5. 抽象类可以有构造器,而接口不能有构造器;
  6. 抽象类可以有 main 方法并且可以运行它,而接口没有,也不能运行 main 方法;
  7. 抽象类可以添加非抽象新方法,而接口不能随便添加新的方法。
  • 设计层面上的区别
  1. 抽象类是对一种事物的抽象,即对物抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性和行为,但是接口却是对类局部(行为)进行抽象。
  2. 设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。

6. Java 的集合的继承关系

  • Collection
  • |–List
  • | > |–LinkedList
  • | > |–ArrayList
  • | > |–Vector
  • | > > > |–Stack
  • |–Set
  • Map
  • |–HashTable
  • |–HashMap
  • |–WeakHashMap

HashTables 与 HashMap 的区别:

  • HashMap 是 HashTable 的轻量级实现(非线程安全的实现),同时都是实现了 Map 接口。
  • 主要区别在于 HashMap 允许将 null 作为一个 entry 的 key 或者 value,而 HashTable 不允许。
  • HashMap 把 HashTable 的 contains 方法去掉了,改成 containsValue 和 containsKey 方法。
  • HashTable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map Interface 的一个实现。
  • 最大的不同是,HashTable 方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 HashTable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步(Collections.synchronizedMap);

7. java 中的==和 equals 和 HashCode 的区别

  • == : 比较基本类型的数值或者复杂类型的内存地址
  • equals : 比较复杂类型的内容
  • hashCode : hash 计算后的值

8. Java 基本数据类型占用内存大小

类型 位数 字节数
byte 8 1
short 16 2
char 16 2
int 32 4
float 32 4
long 64 8
double 64 8

9. String/StringBuffer/StringBuilder 区别:

  • String :字符串常量;
  • StringBuffer :字符串变量(线程安全)
  • StringBuilder : 字符串变量(非线程安全)
  • 简单说:String 类型是不可变的对象,每次对 String 类型进行改变时候,都等同于生成了一个新的 String 对象。StringBuffer 和 StringBuilder 则是对自身的操作,区别则是线程时候安全。

10. 多态

  • 多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
  • 多态的好处:可替换性、可扩充性、接口性、灵活性、简化性。

11. 线程中 sleep 和 wait 的区别

  • sleep()是线程 Thread 的方法:调用该方法后,不释放对象锁。设置时间到后重新启动线程,或者 interrupt 启动线程;
  • wait()是 Object 类的方法:调用该方法后,释放对象锁,重新启动这需要调用 notify()或者 notifyAll()方法。

Android

1. 如何导入外部数据库

  1. [Android]如何导入已有的外部数据库

2. 打开一个 Activity 到 View 显示的流程:

  1. 在 Activity 中调用 attach(),创建了一个 window 对象;
  2. 创建的 window 是其子类 PhoneWindow 的实例,在 attach()中创建 PhoneWindow 实例对象
  3. 在 Activity 中调用 setContentView(R.layout.XXX),其实实际上是调用了 getWindow().setContentView()方法,即调用 PhoneWindow 的 setContentView()方法;
  4. 创建 ParentView:作为 ViewGroup 的子类,实际是创建的 DecorView extends Framelayout;
  5. 将指定的 R.layout.xxx 进行填充到 ParentView 中;
  6. 调用 ViewGourp 的 removeALLview(),将原本的 View 移除,然后调用 addView()添加 View;

3. 低版本 SDK 实现高版本 api

  1. 在高版本 api 的方法前面加一个@TargetApi(Build.VERSION.SKDCODE)
  2. 在代码上用版本判断来控制不同版本的不同执行代码;
1
2
3
4
5
6
7
8
9
@TargetApi(11)
public void text(){
if(Build.VERSION.SDK_INT >= 11){
// 使用api11 新加 api的方法
}
else {
// 低版本的处理方法
}
}

4. Activity 的 LaunchMode 引用场景

  • standard : 普通模式创建一个 Activity,也是默认模式;
  • singleTop : 栈顶不是该类型的 Activity,创建一个新的 Activity,否则直接进入栈顶的 Activity,并且调用 onNewIntent()方法。
  • singleTask : 整个回退栈中没有该类型的 Activity, 则创建新的 Activity,否则进入已存在的 Activity 中,并且调用 onNewIntent(),同时会清除掉在栈中位于打开 Activity 的上的其他 Activity 实例。
  • singeleInstance : 回退栈中,只有这一个 Activity,没有其他的 Activity。
  • singleTop:模式适用于接收通知启动的内容显示页面。eg.接收到多条通知,只通过一个 Activity 打开通知内容;
  • singleTask:适合做程序的入口点。eg.浏览器的主界面,不管从多少个应用启动浏览器,只会启动主界面一次,其余情况会走 onNewIntent,并且会清空主界面上的其他界面。
  • singleInstance:eg.闹钟界面等类似不需要在返回过程中进入到功能界面内部的情况。