javaandroid的面试题都是亲身经历的文档格式.docx
《javaandroid的面试题都是亲身经历的文档格式.docx》由会员分享,可在线阅读,更多相关《javaandroid的面试题都是亲身经历的文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
指示信息--表示请求已接收,继续处理
2xx:
成功--表示请求已被成功接收、理解、接受
3xx:
重定向--要完成请求必须进行更进一步的操作
4xx:
客户端错误--请求有语法错误或请求无法实现
5xx:
服务器端错误--服务器未能实现合法的请求
Intent的基本用法
Intent主要用来在各个界面之间实现跳转及数据传递等意图,也可用来访问android系统提供一些功能。
Intentintent=newIntent();
intent.setClass(this,OtherActivity.class);
this.startActivity(this);
还可以用来得到界面之间的返回值,然后从中取出Boundle对象。
进行数据的处理等。
SurfaceView编写简单的开发框架
publicclassGameSurfaceViewextendsSurfaceView
implementsSurfaceHolder.Callback
{
publicGameSurfaceView(Contextcontext)
{
super(context);
//实例化SurfaceHolder
SurfaceHolder
mSurfaceHolder=this.getHolder();
//添加回调
mSurfaceHolder.addCallback(this);
this.setFocusable(true);
}
//在surface的大小发生改变时激发
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight)
{
}
//在surface创建时激发
publicvoidsurfaceCreated(SurfaceHolderholder)
//在surface销毁时激发
publicvoidsurfaceDestroyed(SurfaceHolderholder)
}
把apk文件安装到手机上
adbinstallc:
\abc.apk
Handler机制的简单原理
因为androidUI界面不是线程安全的,不允许子线程更新主UI线程,为了达到主界面的更新操作,此时便有了Handler对象,handler对象首先在主界面中进行声明,并覆盖其中的handlMessage(msg)方法。
该方法用来接收子线程传递来的Message对象。
子线程启动后,首先创建Message对象。
然后将待发送的数据放入Message对象中,并使用handler的sendMessage(msg)来发送msg对象,发送成功够,handleMessage(msg)拿到msg对象,并用这个msg对象里面的数据来在主线程中更新手机界面。
创建数据库的过程,使用SQLiteOpenHelper实现。
privatestaticclassDBOpenHelperextendsSQLiteOpenHelper{
publicDBOpenHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){
super(context,name,factory,version);
}
privatestaticfinalStringDB_CREATE="
createtable"
+DB_TABLE+"
("
+KEY_ID+"
integerprimarykeyautoincrement,"
+KEY_NAME+"
textnotnull,"
+KEY_AGE+"
integer,"
+KEY_HEIGHT+"
float);
"
;
@Override
publicvoidonCreate(SQLiteDatabase_db){
db.execSQL(DB_CREATE);
调用getReadableDatabase()或getWriteableDatabase()方法,你可以得到SQLiteDatabase实例,具体调用那个方法,取决于你是否需要改变数据库的内容:
db.execSQL("
CREATETABLEmytable(_idINTEGERPRIMARYKEY
AUTOINCREMENT,titleTEXT,valueREAL);
);
INSERTINTOwidgets(name,inventory)"
+"
VALUES('
Sprocket'
5)"
ContentValuescv=newContentValues();
cv.put(Constants.TITLE,"
exampletitle"
cv.put(Constants.VALUE,SensorManager.GRAVITY_DEATH_STAR_I);
db.insert("
mytable"
getNullColumnHack(),cv);
Cursorc=db.rawQuery(
SELECTnameFROMsqlite_masterWHEREtype='
table'
ANDname='
mytable'
null);
不管你如何执行查询,都会返回一个Cursor,这是Android的SQLite数据库游标,使用游标,你可以:
通过使用getCount()方法得到结果集中有多少记录;
通过moveToFirst(),moveToNext(),和isAfterLast()方法遍历所有记录;
通过getColumnNames()得到字段名;
通过getColumnIndex()转换成字段号;
通过getString(),getInt()等方法得到给定字段当前记录的值;
通过requery()方法重新执行查询得到游标;
通过close()方法释放游标资源;
例如,下面代码遍历mytable表
Cursorresult=db.rawQuery("
SELECTID,name,inventoryFROMmytable"
result.moveToFirst();
while(!
result.isAfterLast()){
intid=result.getInt(0);
Stringname=result.getString
(1);
intinventory=result.getInt
(2);
result.moveToNext();
}
result.close();
什么是流?
字节流与字符流的区别?
流是个抽象的概念,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件、内存或网络等等。
相反地,需要写出数据到某个数据源目的地的时候,也会开启一个数据流,这个数据源目的地也可以是文件、内存或网络等等。
这个时候,你就可以想象数据好像在其中流动一样。
FileInputStream
FileOutputStream(f,true)
ObjectInputStream序列化
BufferedReaderreadline缓冲区
ByteArrayInputStreamtoByteArray()
BufferedInputStream字节流和字符流之间的桥梁
InputStreamReader和InputStreamWriter
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
String,StringBuffer与StringBuilder的区别?
?
String字符串常量
StringBuffer字符串变量(线程安全)
StringBuilder字符串变量(非线程安全)
String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String。
而如果是使用StringBuffer类则结果就不一样了,每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。
StringBuffer上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。
每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。
append方法始终将这些字符添加到缓冲区的末端;
而insert方法则在指定的点添加字符。
在大部分情况下StringBuilder>
StringBuffer
Java中线程实现的两种方法?
线程的基本状态以及他们之间的关系?
方法一:
继承自Thread类方法二:
实现Runnable接口
状态:
就绪,运行,synchronize阻塞,wait和sleep挂起,结束。
wait必须在synchronized内部调用。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
两个Activity之间怎么传递数据?
通过intentputExtra
方法基本数据类型都传递
Bundlebundle=new
Bundle();
bumdle.putShort(key,value);
intent.putExtras(bundle);
获取到激活他的
getIntent();
Intentintent=getIntent();
Bundlebundle=intent.getExtras();
intent.getStringExtra("
key"
"
value"
android中Invalidate和postInvalidate的区别
Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:
AndroidUI操作并不是线程安全的,并且这些操作必须在UI线程中调用。
Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。
1,利用invalidate()刷新界面
实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;
而在线程中通过sendMessage发送界面更新消息。
2,使用postInvalidate()刷新界面
使用postInvalidate则比较简单,不需要handler,直接在线程中调用postInvalidate即可。
MVC的理解
M:
Model模型
V:
View视图
C:
Controller控制器
Menu
MenuItemdeleteMenu=menu.add(1,2,3,”删除联系人”);
1表示序号2表示编号3表示排序
冒泡排序
publicclassMp{
publicstaticvoidmain(String[]args){
int[]age=newint[]{3,0,87,98,45,2345,6};
for(intj=0;
j<
age.length;
j++){
for(inti=0;
i<
age.length-1;
i++){
if(age[i]>
age[i+1]){
mid=age[i+1];
age[i+1]=age[i];
age[i]=mid;
System.out.println(age[i]);
JAVA多线程编程。
用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。
publicclassDxc{
publicstaticvoidmain(String[]args){
System.out.println("
计算开始了"
Xnum=newX();
num.x=5;
ThreadjiaThread=newJia(num);
jiaThread.setPriority(Thread.MAX_PRIORITY);
jiaThread.start();
加法执行完了"
ThreadjianThread=newJian(num);
jianThread.start();
System.out.println("
减法执行完了"
classX{
intx;
classJiaextendsThread{
Xnum=newX();
publicJia(Xnumber){
super();
this.num=number;
publicvoidrun(){
for(inti=1;
10;
i=i+2){
num.x++;
try{
Thread.sleep(1000);
System.out.println("
x++"
+num.x);
}catch(Exceptione){
e.printStackTrace();
}
classJianextendsThread{
publicJian(Xnumber){
this.num=number;
num.x--;
try{
Thread.sleep(1000);
System.out.println("
x--"
}catch(Exceptione){
e.printStackTrace();
}
}
JDBC的连接
Class.forName("
com.mysql.jdbc.Driver"
Stringurl="
jdbc:
mysql:
//localhost:
3306/数据库"
Connectionconn=DriverManager.getConnection(url,"
用户名"
密码"
if(conn==null)System.out.println("
连接失败"
elseSystem.out.println("
连接成功"
游标
一个游标(cursor)可以被看作指向结果集(asetofrows)中一行的指针(pointer)。
游标每个时间点只能指向一行,但是可以根据需要指向结果集中其他的行。
gc()与finalize的区别
其工作原理:
一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
所以如果用finalize()就能在垃圾回收时刻做一些重要的清理工作。
而System.gc()则是启动一个垃圾回收器,在释放new分配内存空间之前,将会通过finalize()释放用其他方法分配的内存空间(如本地方法调用C中用new分配的内存空间)。
静态
中国十六亿人有一个共同的属性,那就是中国人,然后有一天,胡锦涛把国籍改成了美国,然后十六亿人的国籍都跟着改变了。
多态
父类的引用指向子类的对象
编译的时候看引用执行的时候看对象。
封装
考虑到代码的安全性,类成员变量不应被直接被访问,应该声明成private;
小王在atm机取钱、火车拉货
public和private,protected作用域范围
public公共的。
权限最大,外界可以引用
private私有的。
只能被本类自己调用,类外都不可以调用,子类也不可以
protected受保护的。
只能被子类(子类可以在其他包下面)或者同一个包下的其他类引用。
其他的都不可以
抽象类的概念
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。
并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:
如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。
正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
ArrayList,Vector,HashTable,Hashmap区别
ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而ArrayList和HashMap并不是线程安全的。
因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于ArrayList和HashMap
Collection是List和Set两个接口的基接口
List在Collection之上增加了"
有序"
Set在Collection之上增加了"
唯一"
而ArrayList是实现List的类...所以他是有序的.
它里边存放的元素在排列上存在一定的先后顺序
而且ArrayList是采用数组存放元素另一种ListLinkedList采用的则是链表
编程:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
publicstaticStringmSubString(Stringstr,intbyteCount){
for(inti=0;
byteCount;
if((str.charAt(i)+"
).getBytes().length>
1)
byteCount--;
returnstr.substring(0,byteCount);
Android的存储方式有哪些
Android提供了5种方式存储数据:
(1)使用SharedPreferences存储数据;
它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。
只能在同一个包内使用,不能在不同的包之间使用。
(2)文件存储数据;
文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite数据库存储数据;
SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
(4)使用ContentProvider存储数据;
主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此ContentProvider的各种数据类型。
(5)网络存储数据;
通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
android和i