一、概述:收集那些神坑好玩的JAVA面试题

二、题目:

001:下面代码片段输出是什么:

1
2
3
4
5
6
public static void main(String[] args) {
String s = " Hello "; //两边各有一个空格
s+=" World "; //两边各有一个空格
s.trim(); //考虑:s=s.trim();
System.out.println(s);
}

答案:

1
" Hello  World "

考点:

  • 1、字符串对象是不可变的。
  • 2、内存的分配情况,垃圾回收。

002:下面代码片段输出是什么:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class OverloadVsOverride {

public boolean equals(OverloadVsOverride other){ //这是重载
System.out.println("equals");
return true;
}

public static void main(String[] args) {
Object o1 = new OverloadVsOverride();
Object o2 = new OverloadVsOverride();

OverloadVsOverride o3 = new OverloadVsOverride();
OverloadVsOverride o4 = new OverloadVsOverride();
if (o1.equals(o2)) { //调用Object方法的equals方法,比地址:false
System.out.println("o1 equals o2");
}
if (o3.equals(o4)) {
System.out.println("o3 equals o4");
}
}

}

答案:

1
2
equals
o3 equals o4

考点:

  • override & overload(重载和重写)
  • 重载方法在编译时起作用(例如,静态绑定),重写方法在运行时起作用(例如,动态绑定)。

一、概述:看JAVA编程思想反射一章总结的Demo。展示静态代码块,父类,子类,构造函数的初始化过程。

二、代码:

1
2
3
4
5
6
7
8
9
//父类
public class OtherFather {
static{
System.out.println("4-->OtherFather 初始化了");
}
public OtherFather() {
System.out.println("6-->OtherFather构造函数");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//子类
public class Other extends OtherFather{

static final int AGE = 24;

static {
System.out.println("5-->Other被初始化了");
}

Other(){
System.out.println("7-->Other构造函数");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//测试函数
public class This {
static Other other;//引用
static{
System.out.println("1-->This被初始化了");//1
}
This(){
System.out.println("3-->This的构造函数");//3
}
public static void main(String[] args) {
System.out.println("2-->main被执行了");//2
This ths = new This();

other = new Other();//用到某个类的时候才去加载某个类
}
}
1
2
3
4
5
6
7
1-->This 被初始化了
2-->main被执行了
3-->This的构造函数
4-->OtherFather 初始化了
5-->Other被初始化了
6-->OtherFather构造函数
7-->Other构造函数

三、总结:

  • 类加载时,先加载静态成员变量,静态代码块
  • 注意子类与父类的加载顺序为:
    • 父类的静态代码块->子类的静态代码块->父类的构造函数->子类的构造函数
  • 用到类时才加载类,才对类进行初始化

一、概述:数据库是android常用的缓存地方之一,因此学习好数据库还是很重要的。

二、基础操作

1、继承SQLiteOpenHelper+重写抽象方法+重写构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class DBHelper extends SQLiteOpenHelper {  

private static final String dbName = "count"; //数据库名称

private static final int version = 1; //数据库版本

public DBHelper(Context context) { //必须重写次构造函数
super(context, dbName, null, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
//第一次执行时调用此函数,建表
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//更新数据库时调用此函数,修改增加字段等
}
}

2、新建一个操作数据库的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class DBOperator{

private SQLiteDatabase db;//数据库实例
private DBHelper dbHelper;//数据库帮助类实例

//构造函数初始化以上实例
public DBOperator(Context context){
dbHelper = new DBHelper(context);
db = dbHelper.getWritableDatabase();
}

//关闭数据库
public void close(){
db.close();
dbHelper.close();
}

//插入
//db.execSQL( "insert into user(name, age) values('duwei', 23)" );

//使用ContentValues插入数据:ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于:
//contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象
//插入成功就返回记录的id否则返回-1;
//ContentValues initialValues = new ContentValues();
//initialValues.put(name,"duwei");
//initialValues.put(age,23);
//db.insert(database_name,null,initialValues);

//查询
//Cursor cursor = db.rawQuery("select * from user", null);
//while (cursor.moveToNext()) {
//int userid = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始
//String name = cursor.getString(1);//获取第二列的值
//int age = cursor.getInt(2);//获取第三列的值
//}
//cursor.close(); //记得关闭游标
}

数据库优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
if(db.isOpen()){
db.beginTransaction(); //开启事务
try{
for(Collection c:colls){
insert(db, c);
}
db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚
}catch(Exception e){

}finally{
db.endTransaction(); //处理完成
}
}

概述:TCP的三次握手以及四次挥手总结(图片来源网络)

三次握手

  • A发出连接请求:SYN = 1 seq = x SYN-SENT状态
  • B同意建立连接:SYN = 1;ACK = 1 seq = y SYN-RCVD状态
  • A向B给出确认: ACK = 1 seq = x+1 ESTABLISHED
  • B: ESTABLISHED

四次挥手

  • A请求释放连接:FIN = 1 FIN-WAIT-1
  • B发出确认报文:ACK = 1 CLOSE-WAIT
  • A收到确认报文: FIN-WAIT-2

  • B请求释放连接:FIN = 1 LAST-ACK

  • A发出确认报文:ACK = 1 TIME-WAIT