公司里有一个技术通道,需要认证,现整理一下笔试内容。
1. System.out.println('a'+1+"");
这道题,大体上一看,可能会做错,认真看一下,还是可以的。
这里注意一下几点:
1) “+”号
Java是不支持操作符重载的,但“+”是唯一重载的操作符,当“+”两边都是基本数据类型时(可能说的不严谨),是加法操作;
当“+”有一边是字符串时,会将两边都作为字符串进行连接操作,这时会有一些装箱,拆箱操作。
在System.out.println()中,还要注意一个优先级的问题:
String s1 = "helloworld";
String s2 = "hello" + "world";
System.out.println(s1 == s2); //true
System.out.println("s1==s2?" + s1 == s2); //false
“+”的优先级比“==”的优先级高。
这里顺便记一下操作符的优先级:
这里记录一个问题:
short num1 = 1;
num1 = num1 + 1;
System.out.println(num1);
问输出结果是什么?
稍微注意一下的话,可以看出来,直接就编译出错了。因为Java中1默认是int类型,这里需要强制类型转换。
还有一个变形题:
short num2 = (short)1;
num2 = num2 + 1;
System.out.println(num2);
问输出结果是什么?
和上一题一样,同样的编译出错。num2 = num2 + 1运算时,Java自动转换为int类型,也需要强制类型转换。
还有一个变行题:
short num3 = (short)1;
num3 += num3;
System.out.println(num3);
问输出结果是什么?
哦,这下终于是2了, +=是不需要进行类型转换的。
关于运算符,还看到一个问题,关于&和&&:
在Java中,&和&&都可以作为逻辑运算符,进行true或false的判断;但是,&&和||又叫做短路与,短路或,即她们有一个短路的特性,
对于a && b当a是false时,Java不会继续判断b到底是true还是false,直接就短路了,返回false;
对于 a || b,同样的道理,当a 是true时,Java会直接短路,不去判断b,直接返回true。
而 & 和 | 作为逻辑运算符就不会这样。
int a1 = 23;
if(a1 == 23 || 100/0 == 0) {
System.out.println("ok");
}
if(a1 == 23 | 100/0 == 0) {
System.out.println("ok");
}
问输出结果是什么?
对于第1个if,输出是ok,而第2个if就跑出异常了,因为0是不能做除数的。
当然,&和 | 还能做位运算。
2)char
‘a'会自动转换成int类型与1进行运算,记住常用的’a' = 97,‘A'=65。
字符型,也有一些问题需要注意:
(刚查到的一个题目,挺好的)
在Java中,byte 是字节,1 byte是8位(8bit),char是字符型是2个字节,就是16bit。Java采用unicode,2个字节(16位)来表示一个字符。
问:
char x = '我';
String str = "我";
byte[] data = str.getBytes();
System.out.println(data.length);
输出是什么?
一看到这个问题,表示不会啊,答案是”3“,即3个字节。
Java是用unicode来表示字符,"我"这个中文字符的unicode就是2个字节。 String.getBytes(encoding)方法是获取指定编码的byte数组表示,通常gbk/gb2312是2个字节,utf-8是3个字节。如果不指定encoding则取系统默认的encoding,系统默认编码是UTF-8。
如果改一下:
char x = '我';
String str = "我";
byte[] data = str.getBytes("gbk");
System.out.println(data.length);
结果就是2个字节了。
2. 字节流与字符流
Java中的字节流的顶层抽象类是InputStream和OutputStream。
Java中的字符流的顶层抽象类是Reader和Writer。
这里需要注意,可以写出基本的文件读写代码,相关的,还有字节流与字符流的转换。
3. 关于break和continue语句,下面说法错误的有( )
A、break只能用于循环语句中。
B、continue只能用于循环语句中。
C、在循环语句中,break语句将终止循环;而continue是略过当前循环中剩余的语句进入下一次循环。
D、在循环语句中,continue语句将终止循环;而break是略过当前循环中剩余的语句进入下一次循环。
break只能使用在循环语句和switch中,
在switch语句中,break是其语法本省的一部分,break语句会终止其后语句的执行,退出switch语句
在循环中遇到break语句时,循环立即终止,程序转到当前循环体后的第一个语句去继续执行。
它只能出现在循环体中,其功能是立即结束本次循环,即遇到continue语句时,不执行循环体中continue后的语句,立即转去判断循环条件是否成 立,
即中止当次循环进入下一次循环。
4. 方法resume()负责恢复哪些线程的执行?( )
A、通过调用stop()方法而停止的线程
B、通过调用sleep()方法而停止的线程
C、通过调用wait()方法而停止的线程
D、通过调用suspend()方法而停止的线程
答案:D
熟悉线程的同学,应该可以选对,suspend()和resume()是一对儿。
suspend() 挂起线程;resume() 唤醒线程。这2个方法都是Thread类的。
通过suspend()函数,可使线程进入停滞状态。通过suspend()使线程进入停滞状态后,除非收到resume()消息,否则该线程不会变回可执行状态。
这里顺便记录一下wait()和notify()方法:
wait()和notify()是Object中的方法。
使用wait()与notify()/notifyAll()可以使得多个任务之间彼此协作。
调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁。这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中。
可以通过notify()/notifyAll(),或者时间到期,从wait()中恢复执行。
只能在同步控制方法或同步块中调用wait()、notify()和notifyAll()。如果在非同步的方法里调用这些方法,在运行时会抛出IllegalMonitorStateException异常。
5. oralce数据库中,以下哪个函数可以针对任意数据类型进行操作?( )
A、TO_CHAR B、LOWER C、MAX D、CEIL
答案是A,
备注:2014-05-21,这里好像有2个答案,C选项max也是对的。
关于to_char,可以看下这篇博客,写的很好:http://www.cnblogs.com/reborter/archive/2008/11/28/1343195.html