一、基本概念篇
1、以下程序错误的是()
short s=1; s=s+1; //s+1为int型,不能直接赋值给short
注意类型转换:低级可直接转高级变量,即自动类型转换;高级转低级需强制转换(可能导致溢出或精度下降)
2、什么时候使用assert
3、判断一个数是不是2的次方。
private boolean judge(int a){
if(((a-1)&a)==0 ** a!=0)
return true;
else
return false;
}
4、Java对象序列化
必须让对象实现Serializable接口。序列号对象的时候,先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这时,用writeObject()方法吧对象写入OutputStream。
读取的时候,需要把InputStream嵌到ObjectInputStream中,再调用readObject()方法。
参考:http://blog.csdn.net/mr_it/article/details/1441056
5、下列程序输出什么
public static void main(String args[]){
for(int a = 0; a < 5; a++)
int k = 1;
System.out.println("hello");
}
编译错误:for循环可以不使用"{}"。但仅限于执行语句(其中不包括变量声明语句)。同理,if,while语句也一样。
6、下列输出:
Value obj1 = new Value(1);
Object obj2 = new Value(1);
Value obj3 = new Value(1);
System.out.println(obj1.equals(obj2));
System.out.println(obj1.equals(obj3));
class Value{
private int i;
public Value(int i){
this.i = i;
}
public boolean equals(Value v){
System.out.println("equals is called");
if(v== this)
return true;
if(v instanceof Value){
Value tmp = (Value)v;
return i==tmp.i;
}
return false;
}
}
分别输出 false,true。
第一个调用的是Object类的equals方法。
7、继承extends也会调用父类的构造方法:
package com.tsc.utl;
class X{
private Y y = new Y(); //主动调用类Y,初始化Y,输出Y
X(){
System.out.println("X"); //初始化X,输出X
}
}
class Y{
Y(){
System.out.println("Y"); //初始化Y,输出Y
}
}
public class Z extends X{ //继承X,先调用X的构造方法
Y u = new Y(); //创建Y的实例,初始化Y类,输出Y
Z(){
System.out.println("Z");
}
public static void main(String args[]){
new Z();
}
}
输出顺序为YXYZ。
8、String 的substring(int start, int end)方法:前包括,后不包括。
String s = “abcdef”.substring(2,4); // 结果为:s=“cd”
9、 对于 String s = new String(“abc”);或者StringBuffer sb = new StringBuffer(“abc”);这样的语句,创建了两个对象,“abc”本身是String pool中的一个对象,还有一个String或者StringBuffer这样的对象(在运行new String()的时候,把String pool中的对象放到heap中,且将这个对象的引用交给s)
10、执行数据库查询时,如果要查询的数据有很多(1000万条),怎样提高查询效率?
(1)数据库设计方面:建立索引;分区(mysql,比如按时间分区);尽量使用固定长度的字段;限制字段长度;
(2)在数据库I/O方面:增加缓冲区;如果涉及表的级联,不同的表存储在不同的磁盘上,以增加I/O速度。
(3)SQL语句方面:优化SQL语句,减少比较次数;限制返回的条目数(Mysql中使用 limit)
(4)Java方面:如果是反复使用的查询,使用PreparedStatement减少查询次数。