首页 》职业素养课 > JAVA面试技巧 >

java笔试题基础知识

发表日期:2019年09月25日 文章编辑:IT实战

1.String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

 

没有。

因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。

s = s + " world!";相当于: (JDK 1.5以上版本)

s = new StringBuilder(String.valueOf(s)).append(" world!").toString();

2、是否可以继承String类?

String类是final类故不可以继承。

3、String s = new String("xyz");创建了几个String Object?二者之间有什么区别?

两个对象。一个是"xyz",为缓冲区对象。另一个是new出来的String对象。

这两个对象的值相同,但不是同一个对象。

补充,新建对象有几种方式?

1). 使用new关键字

2). 使用反射,调用newInstance

3). 使用clone方法

4). 使用序列化与反序列化

5). 动态代理(Proxy类和CGLIB)

4String和StringBuffer的区别

这两个类都实现了CharSequence接口。

1. 类型不同,因为不是一个类,也没有继承关系,做参数时不能共用

2. String对象是不可变对象,不能修改值。而StringBuffer是可变对象,能修改值。

3. 拼接字符串时,String会产生新对象,而StringBuffer只是增加新字符,不产生新对象,因此效率高。

4. String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

5、如何把一段逗号分割的字符串转换成一个数组?

用正则表达式,代码大概为:String [] result = orgStr.split(“,”, -1);

 StingTokenizer ,代码为:

StringTokenizer tokener = new StringTokenizer(s, ",");

String[] result = new String[tokener.countTokens()];

Integer i = 0;

while (tokener.hasMoreTokens()) {

result[i++] = tokener.nextToken();

}

1. 最笨的办法,用String.indexOf()

int index = -1;

int oldIndex = 0;

Listss =new ArrayList();

while ((index = s.indexOf(',', index + 1)) != -1) {

ss.add(s.substring(oldIndex, index));

oldIndex = index + 1;

}

if (s.charAt(s.length() - 1) == ',') {

ss.add("");

}

String[] array = ss.toArray(new String[ss.size()]);

System.out.println(Arrays.toString(array));

 

6、数组有没有length()这个方法? String有没有length()这个方法?JS的数组有没有length()方法?JS的字符串有没有length()方法?

 

数组没有length()这个方法,有length的属性。String有有length()这个方法。JS中只有length属性,没有length方法。

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

答:产生了一个对象,即"abcd"

对于如下代码:

String s1 = "a";

String s2 = s1 + "b";

String s3 = "a" + "b";

System.out.println(s2 == "ab"); // false

System.out.println(s3 == "ab"); // true

String s = "a" + "b" + "c" + "d";

System.out.println(s == "abcd"); // true s被优化为”abcd”

8try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果:

public class Test {

public static void main(String[] args) {

System.out.println(test());

}

 

static int test() {

       int x = 1;

       try {

           return x;

       }

       finally {

           ++x;

       }

    }

}

 

---------执行结果 ---------

1

 

运行结果是1,为什么呢?主函数调用子函数并得到结果的过程,好比主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话之前放进罐子里的。

9、下面的程序代码输出的结果是多少?

public class SmallT {

public static void main(String args[]) {

SmallT t = new SmallT();

int b = t.get();

System.out.println(b);

}

 

public int get() {

try {

return 1;

finally {

return 2;

}

}

}

 

返回的结果是2。

我可以通过下面一个例子程序来帮助我解释这个答案,从下面例子的运行结果中可以发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,所以,返回的结果是2。Return并不是让函数马上返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并不是马上返回,它要执行finally语句后才真正开始返回。

在讲解答案时可以用下面的程序来帮助分析:

public class Test {

 

public static void main(String[] args) {

System.out.println(newTest().test());

}

 

int test() {

try {

return func1();

finally {

return func2();

}

}

 

int func1() {

System.out.println("func1");

return 1;

}

 

int func2() {

System.out.println("func2");

return 2;

}

}

-----------执行结果-----------------

func1

func2

2

 

结论:finally中的代码比return和break语句后执行

 

10final, finally, finalize的区别。

 

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

内部类要访问局部变量,局部变量必须定义成final类型

final int[] number = { 20 };

new Thread() {

@Override

public void run() {

for (int k = 0; k < 20; k++) {

number[0]++;

}

}

}.start();

 

Thread.sleep(10);

System.out.println(number[0]);

 

finally是异常处理语句结构的一部分,表示总是执行,用来释放资源。

 

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

11、运行时异常(Runtime)与检查异常(Checked)有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

运行时异常为编程时的异常,应该在生产环境正常运行状态下不会发生的异常

检查异常通常为一种设计模式,表示某处执行时可能因为条件不足而出现异常,程序必须对此进行处理,JVM会提示编程人员捕获或重新抛出异常

12error和exception有什么区别?

error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序能处理这样的情况。exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,正常情况下从不会发生的情况。

13Java中的异常处理机制的简单原理和应用。

异常是指java程序运行时(非编译)所发生的非正常情况或错误。

Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象中,该对象中包含有异常的信息。

Java可以自定义异常类,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception。

Error表示应用程序本身无法克服和恢复的一种严重问题,程序只有退的份了,例如说内存溢出和线程死锁等系统问题。

Exception表示程序还能够克服和恢复的问题,其中又分为运行时异常和检查异常,运行时异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉。例如,数组越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);检查异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。

Java为运行时异常和检查异常提供了不同的解决方案,编译器强制检查异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以检查异常也称为checked异常,而运行异常可以处理也可以不处理,所以编译器不强制用try..catch处理或用throws声明,所以运行异常也称为Runtime异常。

 

提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序可以死掉也可以不死掉的错误,程序不应该死掉的错误

14、请写出你最常见到的5个RuntimeException。

NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、IllegelArgumentException、SecurityException。

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

1. Java语言如何进行异常处理见43题

2. throws为向上抛异常,当前方法无法处理此异常,需要上层方法进行处理

throw程序出错时,手工抛出异常,最好能把异常进行堆栈式抛出

try尝试执行,里面的语句可能出现异常,如出现异常需要处理

catch处理try中出现的异常

finally在try后执行清理操作,用于释放资源

3. try中可以抛出异常

16、Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

blob.png

相关新闻

济南华育学员:没有华育就没有我们的今天!

济南华育快讯:近日,刚刚就业不久的17-0910Java班学员代表李鑫铭与同学孔杰、孙磊、杨林一起来到济南华育

2018年01月05日

济南华育705网络营销班毕业啦

济南学网络营销课程 就到济南华育IT

2018年01月08日

IT行业,哪些岗位可以拿高薪

IT行业,哪些岗位可以拿高薪在职场毫无方向的时候,你可能会有这样的疑问:干哪行好呢?如果学计算机在你考虑的范围内,将来想进入软件和互

2019年09月25日

零基础如何学好大数据?

零基础如何学好大数据? 大数据是对海量数据进行存储、计算、统计、分析处理的一系列处理手段,处理的数据量通常是TB级,甚至是PB或EB级的

2019年09月24日

非计算机专业能学JAVA软件开发吗?

非计算机专业能学JAVA软件开发吗? 非计算机本专业是完全可以学的,java语言本身是很简单,不需要数学基础,甚至不需要什么计算机基础。 

2019年09月23日

2019,跳槽转行适合学习什么技术?

2019,跳槽转行适合学习什么技术?  近年来,随着信息技术的发展,阿里巴巴、百度、腾讯等IT企业如雨后春笋,拔地而起,马云、李彦宏、马

2019年09月21日

热点推荐