1.静态块 main() 构造块 构造方法的执行顺序
首先看一道题
public
class
B
{
public
static
B t1 =
new
B();
public
static
B t2 =
new
B();
{
System.out.println(
"构造块"
);
}
static
{
System.out.println(
"静态块"
);
}
public
static
void
main(String[] args)
{
B t =
new
B();
}
}
这段代码打印的结果是:
构造块 构造块 静态块 构造块
分析:JVM加载类的时候,会先执行静态的代码块,静态的对象创建,当静态对象的创建和静态块同时出现时,会按照语句的先后顺序执行,这里先执行 t1 t2的构造,会调用2次构造块代码,然后执行静态块。当类加载完成后,执行main方法中的代码。
总结:静态块只会执行一次,构造块在对象每次创建的时候都会执行。
静态块>main>构造块>构造方法
2.异常的继承关系图
3.下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试。
java.exejavadoc.exejdb.exejavaprof.exe
java,exe是java虚拟机javadoc.exe用来制作java文档jdb.exe是java的调试器javaprof,exe是剖析工具4.Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()
".*?(?=\\()"什么是正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
Patter p="ab*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。
编程中如何区分两种模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
量词:{m,n}:m到n个
*:任意多个
+:一个到多个
?:0或一个
参考:http://www.cnblogs.com/xudong-bupt/p/3586889.html4.类集合之间的继承实现关系图
5.有关Activity生命周期描述正确的是
设置Activity的android:screenOrientation="portrait"属性时,切换屏幕横纵方向时不会重新调用各个生命周期,只会执行onConfigurationChanged方法未设置Activity的android:configChanges属性,切换屏幕横纵方向时会重新调用onCreate()方法当再次启动某个launchMode设置为singletask的Activity,它的onNewIntent()方法会被触发用户正在操作某个Activity,这时如果其他应用程序需要内存,系统会将用户当前操作的Activity强制关闭
A 设置Activity的android:screenOrientation="portrait"属性时,无法切换横竖屏,因此不但不会重新调用各个生命周期方法,而且onConfigurationChanged()方法也不会执行。B 未设置Activity的android:configChanges属性,API上这样说"the activity will be restarted if any of these configuration changes happen in the system.";如何配置有改变,就会重启activityC launchMode为singleTask的时候,通过Intent启到一个Activity, 如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法D 用户正在操作某个Activity,这时如果其他应用程序需要内存。 此时的Activity是Foreground process,应该按照Empty process,Background process,Service process,Visible process顺序kill,最后才是前台进程。6.以下哪几种方式可用来实现线程间通知和唤醒:( ) 正确答案: A C 你的答案: A D (错误) Object.wait/notify/notifyAll ReentrantLock.wait/notify/notifyAll Condition.await/signal/signalAll Thread.wait/notify/notifyAll 解答:A. wait/notify/notifyAll是Object类的方法,而不是Thread类的。Thread类对线程执行控制的的方法是sleep。7. 遇到下列哪种情况时需要把进程移到前台?进程正在运行一个与用户交互的Activity ,它的onResume()方法被调用进程有一正在运行的BroadcastReceiver,它的onReceive()方法正在执行进程有一个Service,并且在Service的某个回调函数(onCreate()、onStart()、或onDestroy())内有正在执行的代码所有选项均正确进程有一个Service,该Service对应的Activity正在与用户交互
8.使用SimpleAdapter作为 ListView的适配器,行布局中支持下列哪些组件?正确答案: A C D
TextViewProgressBarCompoundButtonImageView根据SimpleAdapter的源码可以知道,使用SimpleAdapter作为适配器是,会按照如下顺序判断View:
1
、该view是否实现checkable接口
2
、该view是否是TextView
3
、该view是否是ImageView
9.下列哪个说法是正确的:public abstract class CompoundButton extends Button implements Checkable
正确答案: D 你的答案: A (错误)
ConcurrentHashMap使用synchronized关键字保证线程安全HashMap实现了Collection接口Arrays.asList方法返回java.uti.ArrayList对象ConcurrentHashMap使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全。SimpleDateFormat对象是线程不安全的
10.JAVA中,下列语句哪一个正确()正确答案: C 你的答案: B C (错误)
class中的constructor不可省略constructor必须与class同名,但方法不能与class同名constructor在一个对象被new时执行一个class只能定义一个constructor
public class Main {
public Main(){
}
public void Main(){
}
public static void main(String[] args) {
}
}
10.
package
Wangyi;
class
Base
{
public
void
method()
{
System.out.println(
"Base"
);
}
}
class
Son
extends
Base
{
public
void
method()
{
System.out.println(
"Son"
);
}
public
void
methodB()
{
System.out.println(
"SonB"
);
}
}
public
class
Test01
{
public
static
void
main(String[] args)
{
Base base =
new
Son();
base.method();
base.methodB();
}
}
正确答案: D 你的答案: B (错误)
Base SonB
Son SonB
Base Son SonB
编译不通过
list是一个ArrayList的对象,哪个选项的代码填到//todo delete处,可以在Iterator遍历的过程中正确并安全的删除一个list中保存的对象?()
1
2
3
4
5
6
7
8
9
10
11
|
Iterator it = list.iterator();
int
index =
0
;
while
(it.hasNext())
{
Object obj = it.next();
if
(needDelete(obj))
//needDelete返回boolean,决定是否要删除
{
//todo delete
}
index ++;
}
|
list是一个ArrayList的对象,哪个选项的代码填到//todo delete处,可以在Iterator遍历的过程中正确并安全的删除一个list中保存的对象?()
1
2
3
4
5
6
7
8
9
10
11
|
Iterator it = list.iterator();
int
index =
0
;
while
(it.hasNext())
{
Object obj = it.next();
if
(needDelete(obj))
//needDelete返回boolean,决定是否要删除
{
//todo delete
}
index ++;
}
12.程序运行结果:
public
void
test()
{
Byte a =
127
;
Byte b =
127
;
add(++a);
System.out.print(a +
" "
);
add(b);
System.out.print(b +
""
);
}
public
void
add(Byte b)
{
b = b++;
}
-128 127.
解析:add()方法不是引用传递,因此只需要计算++a,因为Byte的值范围是在-128~+127之间,当127+1之后就相当于 0111 1111 加1变成
1000 0000 这个补码的二进制是 -128 。
13.有如下一段代码,请选择其运行结果()
|
14.重写equals方法为什么要重写hashcode方法?
答:因为equals默认判断的是对象的地址,当然系统已经将某些个复合类型的equals方法重写了。我们自己重写的话
必须重写hashcode,因为equals说明了这两个对象的hashcode也必须相等。所以必须重写。