您的位置:首页 > 职场人生

java面试题100道(41-60)

2015-12-22 10:55 573 查看
41.如何把一段逗号分隔的字符串转换成一个数组?

答:使用String对象.split(“\\,”),返回一个字符串数组对象。例如

public class test  {
public static void main(String[] args) {
String s = "ssdf,qwgew,egw,wgegweg";
String []ss = null;
ss=s.split("\\,");
for (String string : ss) {
System.out.println(string);
}
}

}


42.数组有没有length()这个方法?String有没有length()这个方法?

答:数组里有lenth这个属性,String有length()这个方法。

43.下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"?

答:1个。

引用百度贴吧:

就创建了一个 
String s = "a" + "b" + "c" + "d" + "e"; 
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量 
对于常量,编译时就直接存储它们的字面值而不是它们的引用 
在编译时就直接讲它们连接的结果提取出来变成了"abcde" 
该语句在class文件中就相当于String s = "abcde" 
然后当JVM执行到这一句的时候, 就在String pool里找 
如果没有这个字符串,就会产生一个

44.try{}里有一个return语句,那么紧跟在try之后的finally{}的语句会执行么?

答:不管try里面是否有renturn,finally的语句都是要执行的。(如果在return之前有退出程序的代码,则finally的语句不会被执行。)

45.final,finally,finalize的区别?

答:final用来修饰类和变量和方法的,表示类不能被继承,方法不能被复写,变量的值不可以被改变。

finally是在异常处理中,不论是否抛出异常都会执行里面的语句。

46.运行时异常和一般异常有何异同?

答:前者是只有在程序运行时才会出现的异常,是可以正常编译通过的。

Java 提供了两类主要的异常 :runtime
exception 和 checked
exception 。 checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行 catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。

47.error和exception有什么区别?

答:error是有jvm捕捉到的错误,一般程序里不对其做处理。异常一般要求收到要进行捕捉。

48.java中的异常处理机制的简单原理和应用?

答:try{}catch{}finally{},throw+异常,方法后跟throws +自定义异常

49.请写出你常见的5个runtime exception?

答:空指针异常,类型转异常,算数异常,数组越界异常,类转换异常

50.java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常么?

答:thows放在方法名括号之后,用来声明抛出的异常。throw在代码里抛出异常,try{}里面跟可能有异常的代码块,catch用来处理异常,finally用来执行一些必要操作。

在try块中式可以跑出异常的,如果后面catch这个抛出的异常也行。或者就要在方法名后throws该异常了。

51.java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?

答:两种。继承thread类来实现,或者实现runnable接口。

修饰同步方法的关键字是synchronized。

stop()和suspend()方法为何不推荐使用?

52.sleep()和wait()有什么区别?

答:sleep()是让某个线程进行休眠,完全什么也不执行,而wait()是临时暂停,等待某个操作执行完后再继续执行,例如重新获得对象锁。

53.同步和异步有何异同,在什么情况下分别使用它们?

答:同步会等待,一步比较快。在堆线程安全有要求的时候要用同步。

54.同步有几种实现方法?

答:同步成员变量,同步方法,同步代码块。

55.启动一个线程是用run()还是start()?

答:run是线程或接口里运行时执行的方法,start()方法用于启动线程。

56.当一个线程进入一个对象的一个synchronized方法后,其他线程是否可以进入此对象的其他方法?

答:可以进入,而且要求这个方法为调用同步方法。

57.线程的基本概念,线程的基本状态和状态之间的关系?

答:线程就是在一个程序进程中开辟了一个单独运行的子程序。

线程状态。线程可以处于下列状态之一:
NEW - 至今尚未启动的线程处于这种状态。 
RUNNABLE - 正在 Java 虚拟机中执行的线程处于这种状态。 
BLOCKED - 受阻塞并等待某个监视器锁的线程处于这种状态。 
WAITING - 无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。 
TIMED_WAITING - 等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。 
TERMINATED - 已退出的线程处于这种状态。 
在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。

58.简述synchronized和java.util.concurrent.locks.lock的异同?

答:lock能完成synchronized所有的功能。

lock比synchronized有更好的线程语义和性能。

synchronized可以自动释放锁。而lock必须程序员手动释放,而写必须是在finally从句中。

59.设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.写出程序?

答:首先构建实体类

public class NumJ {
public int j = 10;

synchronized public void cal(int i, int id) {
String threadId = "";
switch (id) {
case 1:
threadId = "thread 1 j+1=";
break;
case 2:
threadId = "thread 2 j+1=";
break;
case 3:
threadId = "thread 3 j-1=";
break;
case 4:
threadId = "thread 4 j-1=";
break;
}
if (i == 0) {
j += 1;
} else {
j -= 1;
}
System.out.println(threadId + j);
}

}
编写测试类

public class test {
public static void main(String[] args) {
final NumJ j = new NumJ();
new Thread() {
public void run() {
while (true) {
j.cal(0, 1);// 参数为0表示加。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

};
}.start();
new Thread() {
public void run() {
while (true) {
j.cal(0, 2);// 参数为0表示加。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
new Thread() {
public void run() {
while (true) {
j.cal(1, 3);// 参数为1表示减法。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
new Thread() {
public void run() {
while (true) {
j.cal(1, 4);// 参数为1表示减法。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}

}


运行结果

thread 1 j+1=11

thread 2 j+1=12

thread 3 j-1=11

thread 4 j-1=10

thread 1 j+1=11

thread 2 j+1=12

thread 3 j-1=11

thread 4 j-1=10

thread 1 j+1=11

thread 2 j+1=12

thread 3 j-1=11

thread 4 j-1=10

thread 1 j+1=11

thread 2 j+1=12

thread 4 j-1=11

60.子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程有循环100次,如此循环50次,请写出程序?
a5dd

答:转

public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
new ThreadTest().init();
}

public void init() throws InterruptedException {
final Business business = new Business();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 50; i++) {
business.SubThread(i);
}
}
}).start();
Thread.sleep(1000); // 此行为了让主线程让出CPU,让子线程先执行
for (int i = 0; i < 50; i++) {
business.MainThread(i);
}
}

class Business {
// boolean bShouldSub=true;
public synchronized void MainThread(int i) throws InterruptedException {
for (int j = 0; j < 100; j++) {
System.out.println(Thread.currentThread().getName() + ":yu_i="
+ i + ",j=" + j);
}
this.notify();
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

}

public synchronized void SubThread(int i) {
for (int j = 0; j < 10; j++) {
System.out.println(Thread.currentThread().getName()
+ ":bing_i=" + i + ",j=" + j);
}
this.notify();
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题 实例 string