2018年Android面试题含答案适合中高级大自然的流风

1、java中==和equals和hashCode的区别

基本数据类型的==比较的值相等.类的==比较的内存的地址,即是否是同一个对象,在不覆盖equals的情况下,同比较内存地址,原实现也为==,如String等重写了equals方法.hashCode也是Object类的一个方法。返回一个离散的int型整数。在集合类操作中使用,为了提高查询速度。(HashMap,HashSet等比较是否为同一个)

如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。

如果两个对象不equals,他们的hashcode有可能相等。

如果两个对象hashcode相等,他们不一定equals。

如果两个对象hashcode不相等,他们一定不equals。

2、int与integer的区别

int基本类型integer对象int的封装类

3、String、StringBuffer、StringBuilder区别

String:字符串常量不适用于经常要改变值得情况,每次改变相当于生成一个新的对象StringBuffer:字符串变量(线程安全)StringBuilder:字符串变量(线程不安全)确保单线程下可用,效率略高于StringBuffer

4、什么是内部类?内部类的作用

内部类可直接访问外部类的属性Java中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法,不依赖外围类)

5、进程和线程的区别

进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。一个进程内可拥有多个线程,进程可开启进程,也可开启线程。一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。

6、final,finally,finalize的区别

final:修饰类、成员变量和成员方法,类不可被继承,成员变量不可变,成员方法不可重写finally:与try...catch...共同使用,确保无论是否出现异常都能被调用到finalize:类的方法,垃圾回收之前会调用此方法,子类可以重写finalize()方法实现对资源的回收

7、Serializable和Parcelable的区别

8、静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?

可继承不可重写而是被隐藏如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成。

9、成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

ava中内部类主要分为成员内部类、局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法,不依赖外围类)

使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。因为Java不支持多继承,支持实现多个接口。但有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

10、string转换成integer的方式及原理

StringintegerIntrger.parseInt(string);

IntegerstringInteger.toString();

11、哪些情况下的对象会被垃圾回收机制处理掉?

1.所有实例都没有活动线程访问。

2.没有被其他任何实例访问的循环引用实例。

3.Java中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。

要判断怎样的对象是没用的对象。这里有2种方法:

1.采用标记计数的方法:

给内存中的对象给打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减一,当这个计数为0的时候,这个对象就可以被回收了。当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。所以就有了第二种方法:

2.采用根搜索算法:

从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的

12、静态代理和动态代理的区别,什么场景使用?

静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。

14、Java中实现多态的机制是什么?

答:方法的重写Overriding和重载Overloading是Java多态性的不同表现

重写Overriding是父类与子类之间多态性的一种表现

重载Overloading是一个类中多态性的一种表现.

16、说说你对Java反射的理解

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。从对象出发,通过反射(Class类)可以取得取得类的完整信息(类名Class类型,所在包、具有的所有方法Method[]类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所有属性Field[]、某个属性的完整信息、构造器Constructors),调用类的属性或方法自己的总结:在运行过程中获得类、对象、方法的所有信息。

17、说说你对Java注解的理解

元注解

元注解的作用就是负责注解其他注解。java5.0的时候,定义了4个标准的meta-annotation类型,它们用来提供对其他注解的类型作说明。

1.@Target

2.@Retention

3.@Documented

4.@Inherited

18、Java中String的了解

在源码中string是用final进行修饰,它是不可更改,不可继承的常量。

19、String为什么要设计成不可变的?

1、字符串池的需求

字符串池是方法区(MethodArea)中的一块特殊的存储区域。当一个字符串已经被创建并且该字符串在池中,该字符串的引用会立即返回给变量,而不是重新创建一个字符串再将引用返回给变量。如果字符串不是不可变的,那么改变一个引用(如:string2)的字符串将会导致另一个引用(如:string1)出现脏数据。

2、允许字符串缓存哈希码

在java中常常会用到字符串的哈希码,例如:HashMap。String的不变性保证哈希码始终一,因此,他可以不用担心变化的出现。这种方法意味着不必每次使用时都重新计算一次哈希码——这样,效率会高很多。

3、安全

String广泛的用于java类中的参数,如:网络连接(Networkconnetion),打开文件(openingfiles)等等。如果String不是不可变的,网络连接、文件将会被改变——这将会导致一系列的安全威胁。操作的方法本以为连接上了一台机器,但实际上却不是。由于反射中的参数都是字符串,同样,也会引起一系列的安全问题。

20、Object类的equal和hashCode方法重写,为什么?

首先equals与hashcode间的关系是这样的:

1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)

由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的

21、List,Set,Map的区别

Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。Set接口主要实现了两个实现类:HashSet:HashSet类按照哈希算法来存取集合中的对象,存取速度比较快

TreeSet:TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。

List的特征是其元素以线性方式存储,集合中可以存放重复对象。

ArrayList():代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。

LinkedList():在实现中采用链表数据结构。插入和删除速度快,访问速度慢。

Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。Map没有继承于Collection接口从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子loadfactor,以调整容器的性能。

LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。

TreeMap:基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。

WeakHashMao:弱键(weakkey)Map,Map中使用的对象也被允许释放:这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。

26、ArrayMap和HashMap的对比

1、存储方式不同

HashMap内部有一个HashMapEntry[]对象,每一个键值对都存储在这个对象里,当使用put方法添加键值对时,就会new一个HashMapEntry对象,

2、添加数据时扩容时的处理不一样,进行了new操作,重新创建对象,开销很大。ArrayMap用的是copy数据,所以效率相对要高。

3、ArrayMap提供了数组收缩的功能,在clear或remove后,会重新收缩数组,是否空间

4、ArrayMap采用二分法查找;

29、HashMap和HashTable的区别

1HashMap不是线程安全的,效率高一点、方法不是Synchronize的要提供外同步,有containsvalue和containsKey方法。

hashtable是,线程安全,不允许有null的键和值,效率稍低,方法是是Synchronize的。有contains方法方法。Hashtable继承于Dictionary类

30、HashMap与HashSet的区别

hashMap:HashMap实现了Map接口,HashMap储存键值对,使用put()方法将元素放入map中,HashMap中使用键对象来计算hashcode值,HashMap比较快,因为是使用唯一的键来获取对象。

HashSet实现了Set接口,HashSet仅仅存储对象,使用add()方法将元素放入set中,HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false。HashSet较HashMap来说比较慢。

31、HashSet与HashMap怎么判断集合元素重复?

HashSet不能添加重复的元素,当调用add(Object)方法时候,

首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。

33、ArrayList和LinkedList的区别,以及应用场景

ArrayList是基于数组实现的,ArrayList线程不安全。

LinkedList是基于双链表实现的:

使用场景:

(1)如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于LinkedList对象;

(2)如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList对象要远优于ArrayList对象;

34、数组和链表的区别

数组:是将元素在内存中连续存储的;它的优点:因为数据是连续存储的,内存地址连续,所以在查找数据的时候效率比较高;它的缺点:在存储之前,我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据两比较大的时候,有可能会出现越界的情况,数据比较小的时候,又有可能会浪费掉内存空间。在改变数据个数时,增加、插入、删除数据效率比较低。

链表:是动态申请内存空间,不需要像数组需要提前申请好内存的大小,链表只需在用的时候申请就可以,根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。还有就是链表中数据在内存中可以在任意的位置,通过应用来关联数据(就是通过存在元素的指针来联系)

35、开启线程的三种方式?

ava有三种创建线程的方式,分别是继承Thread类、实现Runable接口和使用线程池

36、线程和进程的区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

38、run()和start()方法区别

这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

39、如何控制某个方法允许并发访问线程的个数?

semaphore.acquire()请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放了信号量)

semaphore.release()释放一个信号量,此时信号量个数+1

40、在Java中wait和seelp方法的不同;

41、谈谈wait/notify关键字的理解

等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。

调用任意对象的wait()方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。

唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

调用任意对象的notify()方法则导致因调用该对象的wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。

42、什么导致线程阻塞?线程如何关闭?

阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。

一种是调用它里面的stop()方法

另一种就是你自己设置一个停止线程的标记(推荐这种)

43、如何保证线程安全?

1.synchronized;

2.Object方法中的wait,notify;

3.ThreadLocal机制来实现的。

44、如何实现线程同步?

1、synchronized关键字修改的方法。2、synchronized关键字修饰的语句块3、使用特殊域变量(volatile)实现线程同步

45、线程间操作List

Listlist=Collections.synchronizedList(newArrayList());

46、谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解

java的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的

49、synchronized和volatile关键字的区别

1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的

3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性

4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

51、ReentrantLock、synchronized和volatile比较

53、死锁的四个必要条件?

死锁产生的原因

1.系统资源的竞争

系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。

2.进程运行推进顺序不合适

请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。

循环等待条件:若干进程间形成首尾相接循环等待资源的关系

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

死锁的避免与预防:

死锁避免的基本思想:

系统对进程发出每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何让这四个必要条件不成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

死锁避免和死锁预防的区别:

死锁预防是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而死锁避免则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。

56、什么是线程池,如何使用

57、Java中堆和栈有什么不同?

58、有三个线程T1,T2,T3,怎么确保它们按顺序执行?

在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。

线程间通信

我们知道线程是CPU调度的最小单位。在Android中主线程是不能够做耗时操作的,子线程是不能够更新UI的。而线程间通信的方式有很多,比如广播,Eventbus,接口回掉,在Android中主要是使用handler。handler通过调用sendmessage方法,将保存消息的Message发送到Messagequeue中,而looper对象不断的调用loop方法,从messageueue中取出message,交给handler处理,从而完成线程间通信。

线程池

Android中常见的线程池有四种,FixedThreadPool、CachedThreadPool、ScheduledThreadPool、SingleThreadExecutor。

FixedThreadPool线程池是通过Executors的newFixedThreadPool方法来创建。它的特点是该线程池中的线程数量是固定的。即使线程处于闲置的状态,它们也不会被回收,除非线程池被关闭。当所有的线程都处于活跃状态的时候,新任务就处于队列中等待线程来处理。注意,FixedThreadPool只有核心线程,没有非核心线程。

ScheduledThreadPool线程池是通过Executors的newScheduledThreadPool进行创建的,它的核心线程是固定的,但是非核心线程数是不固定的,并且当非核心线程一处于空闲状态,就立即被回收。这种线程适合执行定时任务和具有固定周期的重复任务。

SingleThreadExecutor线程池是通过Executors的newSingleThreadExecutor方法来创建的,这类线程池中只有一个核心线程,也没有非核心线程,这就确保了所有任务能够在同一个线程并且按照顺序来执行,这样就不需要考虑线程同步的问题。

AsyncTask的工作原理

AsyncTask是Android本身提供的一种轻量级的异步任务类。它可以在线程池中执行后台任务,然后把执行的进度和最终的结果传递给主线程更新UI。实际上,AsyncTask内部是封装了Thread和Handler。虽然AsyncTask很方便的执行后台任务,以及在主线程上更新UI,但是,AsyncTask并不合适进行特别耗时的后台操作,对于特别耗时的任务,个人还是建议使用线程池。

AsyncTask提供有4个核心方法:

1、onPreExecute():该方法在主线程中执行,在执行异步任务之前会被调用,一般用于一些准备工作。

2、doInBackground(String...params):这个方法是在线程池中执行,此方法用于执行异步任务。在这个方法中可以通过publishProgress方法来更新任务的进度,publishProgress方法会调用onProgressUpdate方法,另外,任务的结果返回给onPostExecute方法。

3、onProgressUpdate(Object...values):该方法在主线程中执行,主要用于任务进度更新的时候,该方法会被调用。

4、onPostExecute(LongaLong):在主线程中执行,在异步任务执行完毕之后,该方法会被调用,该方法的参数及为后台的返回结果。

除了这几个方法之外还有一些不太常用的方法,如onCancelled(),在异步任务取消的情况下,该方法会被调用。

Binder的工作机制

直观来说,Binder是Android中的一个类,它实现了IBinder接口,从IPC的角度来说,Binder是Android中的一种跨进程通信的一种方式,同时还可以理解为是一种虚拟的物理设备,它的设备驱动是/dev/binder/。从Framework角度来说,Binder是ServiceManager的桥梁。从应用层来说,Binder是客户端和服务端进行通信的媒介。

我们先来了解一下这个类中每个方法的含义:

DESCRIPTOR:Binder的唯一标识,一般用于当前Binder的类名表示。

asInterface(android.os.IBinderobj):用于将服务端的Binder对象转换成客户端所需的AIDL接口类型的对象,这种转化过程是区分进程的,如果客户端和服务端位于同一个进程,那么这个方法返回的是服务端的stub对象本身,否则返回的是系统封装后的Stub.proxy对象。

asBinder():用于返回当前Binder对象。

onTransact:该方法运行在服务端的Binder线程池中,当客户端发起跨进程通信请求的时候,远程请求通过系统底层封装后交给该方法处理。注意这个方法publicbooleanonTransact(intcode,android.os.Parceldata,android.os.Parcelreply,intflags),服务端通过code可以确定客户端所请求的目标方法是什么,接着从data中取出目标方法所需的参数,然后执行目标方法。当目标方法执行完毕后,就像reply中写入返回值。这个方法的执行过程就是这样的。如果这个方法返回false,客户端是会请求失败的,所以我们可以在这个方法中做一些安全验证。

Binder的工作机制但是要注意一些问题:1、当客户端发起请求时,由于当前线程会被挂起,直到服务端返回数据,如果这个远程方法很耗时的话,那么是不能够在UI线程,也就是主线程中发起这个远程请求的。

2、由于Service的Binder方法运行在线程池中,所以Binder方法不管是耗时还是不耗时都应该采用同步的方式,因为它已经运行在一个线程中了。

view的事件分发和view的工作原理

Android自定义view,我们都知道实现有三部曲,onMeasure(),onLayout(),onDraw()。View的绘制流程是从viewRoot的perfromTraversal方法开始的。它经过measure,layout,draw方法才能够将view绘制出来。其中measure是测量宽高的,layout是确定view在父容器上的摆布位置的,draw是将view绘制到屏幕上的。

Measure:

view的测量是需要MeasureSpc(测量规格),它代表一个32位int值,高2位代表SpecMode(测量模式),低(30)位的代表SpecSize(某种测量模式下的规格大小)。而一组SpecMode和SpeSize可以打包为一个MeasureSpec,反之,MeasureSpec可以解包得到SpecMode和SpeSize的值。SpecMode有三类:

unSpecified:父容器不对view有任何限制,要多大有多大。一般系统用这个多。

Exactly:父容器已经检测出view所需要的精确大小,这个时候,view的大小就是SpecSize所指定的值,它对应者layout布局中的math_parent或者是具体的数值

At_most:父容器指定了一个可用大小的SpecSize,view的大小不能够大于这个值,它对应这布局中的wrao_content.

对于普通的view,它的MeasureSpec是由父容器的MeasureSpec和自身的layoutParam共同决定的,一旦MeasureSpec确定后,onMeasure就可以确定view的宽高了。

View的measure过程:

前面说的是view的测量过程,而viewGroup的measure过程:

对于viewGroup来说,除了完成自己的measure过程以外,还要遍历去调用子类的measure方法,各个子元素在递归执行这个过程,viewGroup是一个抽象的类,没有提供有onMeasure方法,但是提供了一个measureChildren的方法。measureChild方法的思想就是取出子元素的layoutParams,然后通过getChildMeasureSpec来常见子元素的MeasureSpec,然后子元素在电泳measure方法进行测量。由于viewGroup子类有不同的布局方式,导致他们的测量细节不一样,所以viewGroup不能象view一样调用onMeasure方法进行测量。

注意:在activity的生命周期中是没有办法正确的获取view的宽高的,原因就是view没有测量完。

onLayout

普通的view的话,可以通过setFrame方法来的到view四个顶点的位置,也就确定了view在父容器的位置,接着就调用onLayout方法,该方法是父容器确定子元素的位置。

onDraw

该方法就是将view绘制到屏幕上。分以下几步

Android中性能优化

由于手机硬件的限制,内存和CPU都无法像pc一样具有超大的内存,Android手机上,过多的使用内存,会容易导致oom,过多的使用CPU资源,会导致手机卡顿,甚至导致anr。我主要是从一下几部分进行优化:

布局优化,绘制优化,内存泄漏优化,响应速度优化,listview优化,bitmap优化,线程优化

布局优化:工具hierarchyviewer,解决方式:

1、删除无用的空间和层级。

2、选择性能较低的viewgroup,如Relativelayout,如果可以选择Relativelayout也可以使用LinearLayout,就优先使用LinearLayout,因为相对来说Relativelayout功能较为复杂,会占用更多的CPU资源。

3、使用标签重用布局,减少层级,进行预加载,使用的时候才加载。

绘制优化

绘制优化指view在ondraw方法中避免大量的耗时操作,由于ondraw方法可能会被频繁的调用。

1、ondraw方法中不要创建新的局部变量,ondraw方法被频繁的调用,很容易引起GC。

2、ondraw方法不要做耗时操作。

内存优化:参考内存泄漏。

响应优化:主线程不能做耗时操作,触摸事件5s,广播10s,service20s。

listview优化:

1、getview方法中避免耗时操作。

2、view的复用和viewholder的使用。

3、滑动不适合开启异步加载。

4、分页处理数据。

5、图片使用三级缓存。

Bitmap优化:

1、等比例压缩图片。

2、不用的图片,及时recycler掉

线程优化

线程优化的思想是使用线程池来管理和复用线程,避免程序中有大量的Thread,同时可以控制线程的并发数,避免相互抢占资源而导致线程阻塞。

其他优化

1、少用枚举,枚举占用空间大。

2、使用Android特有的数据结构,如SparseArray来代替hashMap。

3、适当的使用软引用和弱引用。

加密算法(base64、MD5、对称加密和非对称加密)和使用场景。

什么是Rsa加密?

RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。

RSA算法原理如下:

1.随机选择两个大质数p和q,p不等于q,计算N=pq;

2.选择一个大于1小于N的自然数e,e必须与(p-1)(q-1)互素。

3.用公式计算出d:d×e=1(mod(p-1)(q-1))。

4.销毁p和q。

最终得到的N和e就是“公钥”,d就是“私钥”,发送方使用N去加密数据,接收方只有使用d才能解开数据内容。

RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥,但RSA仍然不失为一种高强度的算法。

使用场景:项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密。

什么是MD5加密?

MD5英文全称“Message-DigestAlgorithm5”,翻译过来是“消息摘要算法5”,由MD2、MD3、MD4演变过来的,是一种单向加密算法,是不可逆的一种的加密方式。

MD5加密有哪些特点?

压缩性:任意长度的数据,算出的MD5值长度都是固定的。

容易计算:从原数据计算出MD5值很容易。

抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5应用场景:

一致性验证

数字签名

安全访问认证

什么是aes加密?

高级加密标准(英语:AdvancedEncryptionStandard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

HashMap的实现原理:

HashMap是基于哈希表的map接口的非同步实现,它允许使用null值作为key和value。在Java编程语言中最基本的结构就是两种,一种是数组,另一种是模拟指针(引用)。所有的数据结构都可以用这两个基本的结构来构造,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构。即数组和链表的结合体。

HashMap底层就是一个数据结构,数组中的每一项又是一个链表。

冲突:

HashMap中调用Hashcode()方法计算Hashclde值,由于Java中两个不同的对象可能有一样的Hashcode。就导致了冲突的产生。

解决:

HashMap在put时候,底层源码可以看出,当程序试图将一个key-value对象放入到HashMap中,首先根据该key的hashCode()返回值决定该Entry的存储位置,如果两个Entry的key的hashCode()方法返回值相同,那他们的存储位置相同,如果这两个Entry的key通过equals比较返回true,新添加的Entry的value将会覆盖原来的Entry的value,但是key不会被覆盖,反之,如果返回false,新添加的Entry将与集合中原有的Entry形成Entry链,新添加的位于头部,旧的位于尾部

THE END
1.磨剪刀是向前推,还是往后拉?如果磨错了,越磨越钝!专家:不敢说不敢说 餐厅爆炸掀翻汽车?系剧组拍摄 华为Mate70真机图曝光 前十个月人民币存款增加17.22万亿元 香港男子围观路人斗殴被打致死 男子骑行4400公里追回妻子 习近平对珠海驾车冲撞行人案件重要指示 0 Play 00:00 % buffered00:00 00:00Enter fullscreen...https://m.163.com/v/video/VNFN2M704.html
1.剪刀手艺展现揭秘一条条精致边缘的秘诀剪刀技巧分享篇为了打造出2021年夏天流行发型中的那些精致边缘,我们首先需要了解不同的剪刀类型。常见的有平底剪、斜底剪、圆柱形刮板等,这些都有其特定的使用场景。在选择合适的工具时,应根据自己的需求和技术水平来确定。 技巧学习:掌握基本动作 学会正确地使用这些工具对于打造优质边缘至关重要。要开始之前,最好先练习一些基本动作...https://www.mdswt.cn/liu-xing-qu-shi/351475.html
2.剪刀锋利揭秘理发过程中的技艺与细节在理发开始之前,师傅通常会先询问顾客的需求和偏好,然后根据顾客的头发长度、面型以及个人风格来制定理发方案。接着,师傅会清洗并消毒剪刀和其他工具,以确保每次理发都保持卫生安全。 头皮处理与分区 理髮師會首先進行頭皮清潔,以去除頭髮上的污垢與油脂。此後,他們會根據顧客的頭髮長度與質地來分區,將整個頭部分成不同...https://www.wyppo.cn/shi-shang-ye-jie/462887.html
3.幼儿园小班美术教案《花儿朵朵开》(精选18篇)1、剪纸组合图(大树——对折剪、小草——二方连续、小鸟——三角折剪方法)。 2、五角折剪步骤图、五角花朵一张、不同线条造型图2张、大正方形纸一张。 3、PPT——累加花朵。 4、第一次操作——彩纸、剪刀;第二次操作——大小不一的彩纸、剪刀、固体胶。 https://www.fwsir.com/jiaoan/html/jiaoan_20210826094058_1285107.html
4.小学劳技课教案(精选20篇)2.教师检查准备的材料。材料:四张红色软纸,一把剪刀,一段细铁丝。 3.启发学生说出扎纸花的六个步骤,教师示范,学生操作。(注意渗透安全教育) (1)对折。把四张软纸理齐,对折一次。 (2)来回折。从对折的地方开始,启发学生像折扇子一样,等宽来回折。 https://www.jy135.com/jiaoan/920134.html
5.剪纸教案范文集锦5篇1.乐意参加剪纸活动,会正确使用剪刀。 2.学习剪直线、弧线、波浪线、锯齿线等线条。 3.学习沿轮廓线剪图形。 二、活动安排 在小班上学期,剪纸活动关键在于培养幼儿兴趣,教师在教学过程中需加强示范及个别指导。 一、剪纸目标 1.尝试徒手剪半圆形,初步掌握对边折剪的技能。 https://www.ruiwen.com/jiaoan/4735124.html
6.培智学校义务教育课程标准(2016年版)3. 认读生活中常用汉字10 ~ 50个(例如:姓名、校名等)。 4. *掌握正确的握笔姿势。 5. 认识汉字...评价结果可以采用多种方式呈现,如:折线图(侧面图)、评语、观察描述、案例分析、成长档案等。 (六)...5. 认识计算器,掌握使用计算器进行加减运算的操作步骤。 6. 能用计算器进行100以内的加减计算。 三...https://yun.nxeduyun.com/index.php?r=space/school/theme/content/view&id=794545
7.他笑了作文600字15篇[必备]在本节课中,我先以图导入,让幼儿在图中寻找春天,对春天有个基本的认识,接着让幼儿学习一首关于春天的儿歌,加深幼儿对春天的理解,最后带幼儿走出教室,把图中及儿歌中的春天与生活结合起来,让幼儿更直观的认识、理解春天。拓展内容让幼儿观察课堂中没有讲到和观察到的春天的特点,让幼儿全面理解春天。 https://www.qunzou.com/zuowen/liubaizi/1824964.html
8.幼儿园手工活动教案(精选28篇)长短不同的彩色纸条若干,编织地毯的步骤图,水彩笔,剪刀,胶棒。 4、“幼儿学习材料”一—《能干的我》。 活动过程: 一、播放课件,引导幼儿欣赏各种各样的编织地毯,引发幼儿学习兴趣。提问:你看到的地毯是怎样的?你喜欢哪种款式? 简单介绍地毯的作用、种类、功能,引发幼儿学习的兴趣。 https://www.wenshubang.com/jiaoan/2862924.html
9.正确使用剪刀剪纸步骤手工剪纸图片大全简单正确使用剪刀剪纸步骤福字手工剪纸步骤图解5 2021新年灯笼的剪纸方法 剪纸昆虫图案步骤 7 首先准备好剪纸材料一张长方形的纸一把剪刀一支笔如图所示. 剪纸教程简单好看的心连心剪纸 纸手工乐园--动物.剪纸 窗花剪纸教程3用剪刀沿着画出来的图形剪. 用一把剪刀传承和坚守着剪纸艺术 剪窗花步骤图最简单分享漂亮的五瓣...https://www.puchedu.cn/jianzhi/23bc5d0d0d2c0def.html
10.TensorFlow强化学习:1~5强化学习智能体从环境中收集信息并创建状态表示; 然后执行一个导致新状态和报酬的动作(即来自环境的可量化反馈,告诉我们该动作是好是坏)。 这种现象一直持续到智能体能够将表现提高到超过特定阈值(即最大化奖励的期望值)为止。 在每个步骤中,可以随机选择这些动作,将其固定或使用神经网络进行监督。 使用深度神经网络...https://blog.csdn.net/wizardforcel/article/details/130216879
11.中班数学教案(精选24篇)②其余的乘客都是鼓励奖,等火车到站以后,你们可以到我这里来领奖,但是有个要求:要在车票上画出六个圆点。 四、开火车 请每一节车厢里的乘客们按车票上的1、2、3、4、5、6的顺序下车排成3列队伍,检查小朋友站立顺序是否正确,然后出活动室,结束活动。 https://m.oh100.com/kaoshi/jiaoan/639113.html
12.《界面设计》复习资料38.在没有接触Sketch之前,大部分企业的产品开发流程是怎样的? 答,都是由交互设计师通过Axure完成线框图绘制,再交由视觉设计师使用Photoshop输出视觉设计稿,最后交付前端工程师对照多份文稿来还原。【注释】:第一章1.2 第2-3页 Sketch简介 39.在Sketch 中画一个椭圆的具体步骤。 答:首先新建一个文件,然后通过工具...https://www.wjx.cn/xz/260641939.aspx
13.幼儿园中班剪纸教程(1) 师:谁愿意上来把凉帽的折法告诉小朋友? (理解凉帽的折法, 并正确示范:角对角, 对对齐, 用点力, 压压平, 见图1~图3) (2) 师:谁来画一画小剪刀的路线? (了解趣味剪纸的剪法) (3) 师:哪个孩子愿意上来剪一剪? (介绍成功的剪纸方法:小剪刀剪个弧形变帽檐。小剪刀走山路, 留个空做帽檐。走走...https://www.360wenmi.com/f/filet490d22y.html
14.小猫钓鱼教案15篇教学步骤: 一.引起学习动机: 出示小猫头饰,问幼儿:“小猫最爱吃的食物是什么? “有一只小猫想到河边...4.在益智区,幼儿对钓鱼游戏的兴趣特别浓厚,每个幼儿都钓得很好,美工区的幼儿在使用剪刀方面,掌握很好...讨论图一:1、这天的天气怎么样? 2、这是个什么地方? 引导幼儿简单描述天气和场地,尝试用词 “晴朗...https://www.9136.com/jiaoyufanwen/jiaoan/233381.html
15.幼儿园教案大全(15篇)师:今天“会跳的小狗”让我们知道了我们生活中离不开有弹性的物品,为了谢谢他们让我们一起来制作一个“会跳的小人”送给他们好吗? 出示示意图 老师带来了制作“会跳的小人”的示意图,请小朋友看看,你们能看明白吗?谁能告诉我第一幅图示是什么意思?第二幅呢? https://m.yuwenmi.com/jiaoan/youeryuan/2823162.html
16.幼儿折纸设计教案(通用22篇)要求:边角对齐;折痕压平;使用剪刀时注意安全; 2、性练习:为大象创设一个美好的家园 3、欣赏评价:谁折的大象最美?(尽量指出孩子折得好的地方)通过适当的评价,让幼儿对自己更有信心,对折纸更有兴趣。 四、小结 今天,我们不仅帮大象找到了朋友,还给它建立了美好的家,大象可高兴了。所以,我们平常要爱护小动物,平时...https://www.cnfla.com/zhezhi/688988.html
17.(教科版2017)科学六年级上册教案同一个微小的物体在肉眼、放大镜和显微镜下观察到的图像大小及视野是不同的。 科学探究目标 1.能正确使用显微镜观察微小的物体。 2.能够利用放大镜、显微镜等工具自主地观察身边的微小物体,并能用示意图和文字将自己的发现记录和描述出来。 3.知道人类的很多发明可以在自然界中找到原型,能说出工程师利用科学原理发明...http://www.360doc.com/content/23/0830/20/1094511780_1094511780.shtml
18.幼儿园一日活动安全8篇(全文)4.教会幼儿正确使用剪刀和刀,平时不拿刀、剪刀或其他锐器物当玩玩具。5.组织幼儿外出散步或参观游览时,更教育他们不随便离开队伍,有事离开时必须告诉老师,要随时检查幼儿人数以免走失发生意外。 6.上下楼梯时要教育幼儿往一边走,一个跟着一个走,不推挤以免发生摔伤。 https://www.99xueshu.com/w/file9tn6jlod.html
19.小学六年级科学说课稿(精选15篇)在这个过程中教师要演示酒精灯的使用方法,酒精灯学生生活中不常见,又是小学阶段一个重要的实验操作,同时考虑实验的安全性,为了更有效率的进行实验所以由教师演示规范,再让学生通过小组通过合作实验进行学习。他们会发现盐能溶解于水,又能从水中提取出来,这样的变化过程是可逆的;继而进一步思考最终发现:生活中还有很多...https://m.yjbys.com/shuokegao/xiaoxue/1949331.html