1.System.out.println(4|7),问输出的结果?
此题关键点在“|”符,以前只知道它代表“或者”的意思,没想到它的全称是“按位或”,即是按二进制位运算。
所以此题的正解是:
4的2进制值是 00000100
7的2进制值是 00000111 按位或运算后为 00000111 也就是 7题目延伸:System.out.println(4&7) ,输出结果?
&:位运算是对整数的进制位进行操作
4的二进制:0100 7的二进制:0111 首先,二进制与运算规则:1&1=1 1&0=0 0&0=0 然后我们列出表 DCBA 0100 0111 这样们得到 A:0 B:0 C:1 D:0 最好得到: DCBA 0100 结果0100 好明显就是:4了2 一个char类型的变量可以保存一个汉字吗?
以前对char类型占多少个字节这种问题,总是朦朦胧胧,看到这条面试题时,当时考虑,char类型只占一个字节,而一个汉字要占两个字节,所以保存不了。
后来被面试官一顿乱喷,说这么基础的问题都不懂,实在难以理解。随后再网上找来答案,原来这道题还涉及到java的编码问题。
java采用的是unicode编码方式,C采用的是ASCII编码方式。而ASCII和Unicode又有何种区别呢?
ASCII就是编码英文的26个字母和一些常见的符号,之后扩展了一半。总之是一个字节来做编码,大于128的部分是一些特殊符号。但ASCII是无法编码别的东西的,比如说是不 存在“中文的ascii码需要2个字符”这种说法的。ASCII就只有一个字节。
Unicode是足够编码地球上所有的语言了,所以ASCII中所能表示的,Unicode当然全部包括了。Unicode本身是只有2个字节的,之所以出现UTF-8,UTF-16等等之类,那是为 了针对不同的应用环境,提高整体编码效率,比如如果某篇文章里绝大部分是英语(单字节就能表示),就比较适合使用utf-8,而如果绝大部分是中文(需要双字节),可能 就utf-16比较合适了。最简单的说就是,unicode有每个编码的字符有本身就占两个字节,而ascii编码的字符本身只占一个字节;
所以在java中一个char类型的字符占了两个字节,而一个汉字也刚好为两个字节,当然能够存放一个汉字了。(在C中不行,这也是为什么搞混的原因)
测试一下:
public class Test { public static void main(String[] args) { String myName="My name is 于祥通"; char xiang='于'; //合法的 System.out.println("我的姓氏为:"+xiang); //输出:我的姓氏为:于 System.out.println(myName.substring(0, 1)); //输出:M System.out.println(myName.substring(myName.length()-1, myName.length())); //输出:通 }}
substring 处理的最小单元就是一个字符,也就是一个char类型,2个字节 。
3. 线程中sleep()方法和wait()的区别?
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 synchronized(x){ x.notify() //或者wait() }
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
4. 线程有多少种的启动方式?
4.1.继承Thread
public class java_thread extends Thread{ public static void main(String args[]) { (new java_thread()).run(); System.out.println("main thread run "); } public synchronized void run() { System.out.println("sub thread run "); }}
4.2 实现Runnable接口
public class java_thread implements Runnable{ public static void main(String args[]) { (new Thread(new java_thread())).start(); System.out.println("main thread run "); } public void run() { System.out.println("sub thread run "); }}
4.3直接在函数体使用
void java_thread(){ Thread t = new Thread(new Runnable(){ public void run(){ mSoundPoolMap.put(index, mSoundPool.load(filePath, index)); getThis().LoadMediaComplete(); }}); t.start();}
4.4.比较:
实现Runnable接口优势:
1)适合多个相同的程序代码的线程去处理同一个资源
2)可以避免java中的单继承的限制
3)增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
继承Thread类优势:
1)可以将线程类抽象出来,当需要使用抽象工厂模式设计时。
2)多线程同步
在函数体使用优势
1)无需继承thread或者实现Runnable,缩小作用域。
----例子来自网上