安卓的杂项

Java泛型

就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

特性:泛型只在编译阶段有效

泛型的使用:泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法

public void showKeyValue1(Generic<?> obj){
    Log.d("泛型测试","key value is " + obj.getKey());
}

泛型通配符:类型通配符一般是使用?代替具体的类型实参。再直白点的意思就是,此处的?和Number、String、Integer一样都是一种实际的类型,可以把?看成所有类型的父类。是一种真实的类型。

此处’?’是类型实参,而不是类型形参 !

Java反射

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

得到Class的三种方式
//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object类型的对象,
//而我不知道你具体是什么类,用这种方法
   Person p1 = new Person();
   Class c1 = p1.getClass();
         
 //2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
 //  这说明任何一个类都有一个隐含的静态成员变量 class
   Class c2 = Person.class;
         
 //3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
 //   但可能抛出 ClassNotFoundException 异常
   Class c3 = Class.forName("com.pojo.Person");

需要注意的是:**一个类在 JVM 中只会有一个 Class 实例,**即我们对上面获取的 c1,c2,c3进行 equals 比较,发现都是true

通过 Class 类获取成员变量、成员方法、接口、超类、构造方法等

查阅 API 可以看到 Class 有很多方法:

getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

优点:

(1)能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。

(2)与Java动态编译相结合,可以实现无比强大的功能

缺点:

(1)使用反射的性能较低

(2)使用反射相对来说不安全

(3)破坏了类的封装性,可以通过反射获取这个类的私有方法和属性

反射基本原理

整体流程

调用反射的总体流程如下:

  • 准备阶段:编译期装载所有的类,将每个类的元信息保存至Class类对象中,每一个类对应一个Class对象
  • 获取Class对象:调用x.class/x.getClass()/Class.forName() 获取x的Class对象clz(这些方法的底层都是native方法,是在JVM底层编写好的,涉及到了JVM底层,就先不进行探究了)
  • 进行实际反射操作:通过clz对象获取Field/Method/Constructor对象进行进一步操作

List、Set、Map区别

结构特点

  1. List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;
  2. List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。

实现类

  1. List接口有三个实现类: 1.1 LinkedList 基于链表实现,链表内存是散列的,增删快,查找慢; 1.2 ArrayList 基于数组实现,非线程安全,效率高,增删慢,查找快; 1.3 Vector 基于数组实现,线程安全,效率低,增删慢,查找慢;

  2. Map接口有四个实现类: 2.1 HashMap 基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null 键; 2.2 HashTable 线程安全,低效,不支持 null 值和 null 键; 2.3 LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序; 2.4 SortMap 接口 TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序

  3. Set接口有两个实现类: 3.1 HashSet 底层是由 Hash Map 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hash Code()方法; 3.2 LinkedHashSet 继承于 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap

区别

  1. List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
  2. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
  3. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 Tree Set 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator< Type >接口来自定义排序方式。

Android和Java虚拟机的理解

区别

JVM:.java -> javac -> .class -> jar -> .jar

架构:堆和栈的架构

DVM:.java -> javac -> .class -> dx.bat -> .dex

架构:寄存器(cpu上的一块高速缓存)

Linux系统进程间通讯有哪些方式

管道

消息队列

信号量

信号

共享内存

Socket

Java到C如何调用

JNI

C语言指针理解

存储变量的地址

volatile的作用

volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块和volatile变量,相比较于synchronized,volatile更轻量级,因为它不会引起线程上下文的切换和调度。

Handler机制

  • andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
  • Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
  • Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
  • Message Queue(消息队列):用来存放线程放入的消息。
  • 线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

Broadcast、Content Provider 和 AIDL的区别和联系

这3种都可以实现跨进程的通信,那么从效率,适用范围,安全性等方面来比较的话他们3者之间有什么区别?

Broadcast:用于发送和接收广播!实现信息的发送和接收!
AIDL:用于不同程序间服务的相互调用!实现了一个程序为另一个程序服务的功能!
Content Provider:用于将程序的数据库人为地暴露出来!实现一个程序可以对另个程序的数据库进行相对用的操作!

Broadcast,既然是广播,那么它的优点是:注册了这个广播接收器的应用都能够收到广播,范围广。
缺点是:速度慢点,而且必须在一定时间内把事情处理完(onReceive执行必须在几秒之内),否则的话系统给出ANR。
AIDL,是进程间通信用的,类似一种协议吧。优点是:速度快(系统底层直接是共享内存),性能稳,效率高,一般进程间通信就用它。
Content Provider,因为只是把自己的数据库暴露出去,其他程序都可以来获取数据,数据本身不是实时的,不像前两者,只是起个数据供应作用。一般是某个成熟的应用来暴露自己的数据用的。 你要是为了进程间通信,还是别用这个了,这个又不是实时数据。

进程优先级

  • 前台进程
  • 可视进程
  • 服务进程
  • 后台进程
  • 空进程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值