杂记

1 heap为堆 :存储对象 ;存放是无序的
    stack为栈: 存储引用对象; 先入后出

new一个类对象,创建了一个指针,给其分配了内存空间,类对象存储在堆上

通过类名声明的对象,其实是一个对象引用,存储在栈上。


2.Synchronized(object) 同步锁,可锁住对象,方法,程序块。
一个线程在操作一个对象的Synchronized方法时,其他线程可以操作这个对象的非Synchronized方法


3.sleep/wait区别
sleep(10) :占用CPU资源,10秒后自动唤醒,继续执行,不会释放进程锁,可以在任意方法中(谁call谁被sleep,线程A调用B里的sleep方法,把A自己sleep了)【sleep是Thread方法】
wait(10):释放所占资源,当10秒后,等待其他线程notify(),否则无法继续执行,释放进程锁,只能在同步方法或同步块中【wait是Object方法】


4.java只有值传递。如果传入的参数是对象,实际上传入的是对象的副本(同一个指针指向的地址块),更改传入的参数(不改地址)会更新对象值。如果更改了地址,那么更新只限于对象副本,原值不会发生更改


5.抽象类和接口的区别?
抽象类是abstract class修饰,接口是interface修饰。
抽象类可以有任意类型的属性,接口只能有静态常量修饰的属性。
抽象类可以有普通方法和抽象法方法,接口的方法都是抽象方法。
抽象类和接口都不能实例化,但是抽象类有构造方法,接口没有构造方法。
抽象类只能单根继承,接口可以多重实现。

6.同步,异步(同步等,异步并发)

7.final 修饰符:类(不能被继承);属性(常量);方法(不能被重写)

8.Serializable序列化。Java 串行化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。

1).如果某个类能够被串行化,其子类也可以被串行化。如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可串行化接口。则其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可串行化接口,则该类的父类所有的字段属性将不会串行化。

如果父类没有实现串行化接口,则其必须有默认的构造函数(即没有参数的构造函数)。否则编译的时候就会报错。在反串行化的时候,默认构造函数会被调用。但是若把父类标记为可以串行化,则在反串行化的时候,其默认构造函数不会被调用。这是为什么呢?这是因为Java 对串行化的对象进行反串行化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成

2).声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据;


9.ArrayList  ,vector

Arraylist和Vector类似,但是Arraylist不是线程安全的,而Vector线程安全(相应的带来的开销较大,效率没arraylist高)适合快速实际查找和遍历,但是不适合添加,删除数据

ArrayList :每次扩容%50+1 

Vector:扩大一倍

LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除


10.HashMap HashTable

hashmap:非线程安全(hashtable的轻量化实现),允许nullkey, nullvalue

hashtable:线程安全(同步),不允许nullkey,nullvalue

HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象。

Java中集合框架分为Collection和Map接口,Collection接口下的集合每个元素都由一个值组成,Map接口下的集合类每个元素都是由键值对组成。
Collection接口下面有List和Set接口,List接口下常见的类有ArrayList、LinkedList、Vector。它们中的元素可以重复,并且是有序的。Set接口下常见的类有HashSet、TreeSet。它们中的元素不能重复,并且是无序的。


1.hashtable : 线程安全的,同步
2.hashmap: 非线程安全的,非同步(key,value)
实际上可以理解成一个数组+桶结构
每个key有code = key.hashCode(),通过code % table.length 找到相应的数组元素
数组下挂着桶,不同的key可以有相同的hashCode。即不同的key可能存储在同一个桶内
遍历桶内数据可以查找相应key的value。
注1:可以重载put等函数,实现一个hashmap中,存在两个相同的数据。
注2:hashmap允许key为null的情况,但是只允许存在一个key为null
     value可与为null
3.hashset:不允许key为null


vector:  线程安全的,同步
arraylist:(我们常用的一个数据结构)非线程安全

11.handler looper

handler和looper可以用来处理Android的进程通信。handler先进先出,可以获取当前线程里的looper对象,looper对象用来管理消息队列。handler可以向looper的消息队列里发送或者接受消息,然后进行处理


12 Android view的刷新

1.不使用多线程和双缓冲

直接显示地调用activity的invalidate()方法,系统会自动调用view的onDraw()方法

2.使用多线程,不使用双缓冲

新开的线程,使用handler,通过Activity发一个更新Ui的消息,然后在handlermessage中处理此消息,从而更新UI

3.使用双线程和双缓冲

使用surfaceview。定义并实现surfaceholder.callbac接口。每当需要更新UI时,锁定画布(lockcanvas),更新完画布后,使用unlockcanvasandpost解锁


13 mvc开发模式

model view controller


14 android 五种数据存储方式

sharedpreference ;文件 ;sqlite ;网络;contentprovider


15 ALDL: android interface definition language


16 XML解析主要有三种方式,SAX、DOM、PULL .SAx:针对性能敏感的手机或者数据库 ,一般使用DOM(全部加载至内存)


17 IPC 内部进程通信机制。使用与activity和service之间进行通信。服务端实现pc接口,客户端调用ipc接口实现本地代理

message(handler)方式是线程安全的,使用ALDL方式需要注意线程安全


18 一个activity有四种启动模式:standed,signleTop,singleTask,singleInstance
    Standed:标准模式,一调用startActivity()方法就会产生一个新的实例。
    SingleTop:如果已经有一个实例位于activity栈顶,就不产生新的实例,而只是调用activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
    singleTask:会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
    SingleInstance:这个和singleTask基本一样,只有一个区别:在这个模式下的activity实例所处的task中,只能有这个activity实例,不能有其他实例

19 Application类作用:

个人理解为main,一个应用的所有activity都是运行在其上的,在application上设置全局变量可供所有activity使用

20 .onsaveinstancestate和onrestoreinstancestate

这两个并不是activity的生命周期方法,一般情况下不会被触发,只有遇到意外情况由系统销毁activity时才会被触发(用户按home键了,内存不足)。这两个方法只适用于临时保存数据,如果需要持久化保存数据则在onpause里进行。如果用户主动点击返回键,不会触发onsaveinstancestate(屏幕方向发生改变时,可以重写这两个函数与来保存数据)


21 android service生命周期

:1)与采用Context.startService()方法启动服务有关的生命周期方法


onCreate() -> onStart() -> onDestroy()

onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次。
onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。


2)与采用Context.bindService()方法启动服务有关的生命周期方法
onCreate() -> onBind() -> onUnbind() -> onDestroy()

onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。
如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下:
onCreate() ->onStart() ->onBind() ->onUnbind()[重载后的方法需返回true] ->onRebind()

使用方法:1.继承service

2.xml配置application中添加

3.startservice或者bindservice

startservice 独善其身

bindservice与调用者绑定在一起,调用者退出之前先终止


22 Android broadcast 生命周期

1)Broadcast receiver生命周期中仅有一个回调方法: 

void onReceive(Context curContext, Intent broadcastMsg) 
当接收器接收到一条broadcast消息,Android就会调用onReceiver(),并传递给它一个Intent对象,这个对象携带着那条broadcast消息。我们认为仅当执行这个方式时,Broadcast receiver是活动的;这个方法返回时,它就终止了。这就是Broadcast receiver的生命周期。

2)由于Broadcast receiver的生命周期很短,一个带有活动的Broadcast receiver的进程是受保护的,以避免被干掉;但是别忘了有一点,Android会在任意时刻干掉那些携带不再活动的组件的进程,所以很可能会造成这个问题。
3)解决上述问题的方案采用一个Service来完成这项工作,Android会认为那个进程中(Service所在的进程)仍然有在活动的组件。 

broadcast注册类型

1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。用代码来注册广播

2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。(androidmanifest.xml)



23 sim卡的ef文件有什么作用

sim是用来与手机进行通讯,其也有自己的文件规范,ef文件时用来存储和手机通讯的‘


24 嵌入式操作系统有哪些内存管理方式

段式,页式,段页式

页式存储管理中的逻辑地址有页号和业内地址两部分组成,但作业仍然使用连续的逻辑地址,可把它看作是一维的(线性的)地址结构。用户没有分页的概念,操作系统把作业信息装入主存时才按照块长进行分页。
    段式存储管理中的逻辑地址有段号和段内地址两部分组成。他支持用户的分段,每段内的逻辑地址是连续的,而段与段之间的逻辑地址是不连续的。因此段式存储管理中的逻辑地址实际上是采用了二维的地址结构。

虚拟内存管理体制(MMU)提供地址映射和寻址功能,完成虚拟地址到物理地址的转换。既可以运行比物理内存大的程序,增加运行速度,又节省了物理内存。不同地进程有自己的进程空间,增加了程序的安全性与稳定性

实时嵌入式操作系统,不使用虚拟内存管理体制,因为虚拟内存管理可能导致I/o堵塞,而且基于成本考虑,很多嵌入式系统不带MMU。并且实时嵌入式系统需要考虑内存管理,因为所有的程序共享内存,开发者不进行小心仔细地内存管理,很可能导致系统或者其他程序的异常。

25 对于内存在整个嵌入式运行过程中,以3中方式存在:

1)、 在bootstraping 阶段,内存以临时内存分配的形式出现,当完成系统启动后,这些内存会回收供以后系统使用。

2)、 在正常运行阶段,内存以两种方式存在:

( 1) 系统为代码数据分配的永久内存,这些内存在系统运行过程中是不会改变的,有的硬件的I/O等外设也把相应的地址映射到固定的内存空间。
( 2) 动态内存分配空间:这些内存不会固定分配,而是根据系统需要而动态分配的,如果利用非虚拟内存管理机制,一般需要改造动态内存分配机制以提高性能


26 一条最长的短信:中文70 英文160字节


27android中的动画有哪几类,它们的特点和区别是什么

两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;
另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。


28 Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider
 在这些组件之间的通讯中,主要是由Intent协助完成的。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。


29 SELECT SCOPE_IDENTITY()----- 返回上面操作的数据表最后row的IDENTITY 列的值

SELECT @@IDENTITY----- 返回上面操作最后一个数据表的最后row的IDENTITY 列的值(如果是多个数据表,能看出明显区别)

个人理解就是插入数据成功后,返回的自增列的行号,如果原来是100列,插入成功后返回101.如果失败,返回null,,但返回的数据不会回滚为100


30 res/raw :这里的文件是原封不动的存储到设备上不会转换为二进制的格式


31 linearlayout ;framelayout;relativelayout;tablelayout;AbsoluteLayout


32 当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行的回调函数是startActivityResult()


33 string stringBuffer stringBuilder

(1)string 不可变的对象,每次进行赋值操作时,实际上是生成一个新的string对象,然后将指针给了新的string对象。内存消耗较大,效率较低

(2)stringBuffer:线程安全的,效率较高,stringBuffer实际上是更新了原先指针所指向的内容,并没有新建stringBuffer对象

(3)stringBuilder:非线程安全的,如果单线程内执行可以,且效率高于stringBuffer


34 重载:相同的方法名,参数有异

 重写:子类,父类方法同名,重新实现


35 Intent定义:Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端。
显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。
说明:Android系统使用IntentFilter 来寻找与隐式Intent相关的对象。


36 如何优化ListView
1、如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。
2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果
3、如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。

37 Adnroid用的是SQLite数据库。它和其他网络数据库类似,也是通过SQL对数据进行管理。SQLite的操作非常简单,包括数据类型在建表时也可以不指定。
使用ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应用的数据。它的底层是用SQLite 数据库实现的,所以其对数据做的各种操作都是以Sql实现,只是在上层提供的是Uri。

38 通过Intent传递一些二进制数据的方法有哪些?
1)使用Serializable接口实现序列化,这是Java常用的方法。
2)实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。


Uri :content:// + 主机名(mediaContentProvider...)+ 路径(文件存放路径 相对路径)

39 win8 编程时 string str = "\\3";运行时会报“十六进制位数不足” 应该写成 str= "\\03";

android /ios没有此问题

//大师推荐一定要学习java.lang java.util


你可能感兴趣的:(杂记)