1. 九种基本数据类型的大小以及他们的封装类
Java中九中基本数据类型为:boolean、byte、short、char、int、float、double、long以及void。对应的封装类为Boolean、Byte、Short、Character、Integer、Float、Double、Long、Void。
2. switch能否用String做参数
代码如下:
public class Test {
public void test(String str) {
switch(str) {
case "abc":
System.out.println("abc");
break;
case "def":
System.out.println("def");
break;
default:
System.out.println("default");
}
}
}
其内部实现如下:
public class Test {
public void test(String str) {
int i = -1;
switch(str.hashCode()) {
case 96354: // "abc".hashCode()
if (str.equals("abc")) {
i = 0;
}
break;
case 99333: // "def".hashCode()
if (str.equals("def")) {
i = 1;
}
break;
default:
break;
}
switch(i) {
case 0:
System.out.println("abc");
break;
case 1:
System.out.println("def");
break;
default:
System.out.println("default");
}
}
}
3. equals与==的区别
java中的数据类型可分为两大类:
基本数据类型,也称原始数据类型。
复合数据类型(对象)
4. Object有哪些公有方法?
5. Java中的四种引用以及用到的场景
Java中引用分为强引用,软引用,弱引用以及虚引用。
6. Hashcode的作用
7. ArrayList、LinkedList、Vector的区别
8. String、StringBuffer以及StringBuilder的区别
9. Map、Set、List、Queue、Stack的特点与用法
Map
Set
只能用Iterator实现单项遍历,Set中没有同步的方法。
List
10. HashMap和ConcurrentHashMap的区别,HashMap的底层源码
11. HashMap和HashTable的区别
集合 | 线程安全 | 键和值 | 效率 | 同步 | 方法 |
---|---|---|---|---|---|
HashMap | 不安全 | 允许有null的键和值 | 效率较高 | 方法不是Synchronize的要提供外同步 | 有containsValue和containsKey方法 |
HashTable | 安全 | 不允许有null的键和值 | 效率较低 | 方法是Synchronize的 | 有contains方法 |
12. TreeMap、HashMap、LinkedHashMap的区别
13. Collection包结构,与Collections的区别
Collections是针对集合类的一个帮助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
14. try catch finally,try里面有return,finally还执行么?
15. Exception与Error包结构,OOM你遇到过哪些情况,SOF你遇到过哪些情况?
Throwable
Exception
16. Java面向对象的三个特征以及含义
17. override和overload的含义
18. Interface与Abstract类的区别
19. static class(嵌套类) 与非静态类(内部类)的区别
staic和not static的区别
static 与final
20. java多态的实现原理
21. 实现多线程的两种方法
22. 线程同步的方法
synchronized关键字和Lock:当使用线程来同时运行多个任务时,可以通过使用锁(互斥)来同步两个任务的行为,从而使得一个任务不会干涉另一个任务的资源。也就是说,如果两个任务在交替着步入某项共享资源,你可以使用互斥来使得任何时刻只有一个任务可以访问这项资源。
Object的方法wait()和notify()或者Condition的await()和signal()方法:任务彼此之间协作一起去解决某个问题,在解决这个问题中,由于某些部分必须在其他部分被解决之前解决。
23. 锁的等级
24. 写出生产者消费者模式
package com.xqq.生产者与消费者之wait和notify实现;
import java.util.LinkedList;
import java.util.Queue;
/** * 用于存放生产数据的缓冲区队列 * @author xqq */
public class FlowQueue<T> {
private Queue<T> queue = new LinkedList<T>();
private int maxSize;
public FlowQueue(int maxSize) {
this.maxSize = maxSize;
}
public synchronized void put(T v) throws InterruptedException{
while(queue.size() >= maxSize){
wait();
}
queue.offer(v);
notifyAll();
}
public synchronized T get() throws InterruptedException{
while(queue.isEmpty()){
wait();
}
T returnVal = queue.poll();
notifyAll();
return returnVal;
}
}
package com.xqq.生产者与消费者之wait和notify实现;
import java.util.concurrent.TimeUnit;
public class Consumer implements Runnable{
private int delay;
private FlowQueue<Item> input;
public Consumer(int delay, FlowQueue<Item> input) {
this.delay = delay;
this.input = input;
}
public void run() {
for(;;){
try {
System.out.println("Consumer " + input.get());
TimeUnit.MILLISECONDS.sleep(delay);
} catch (Exception e) {
return;
}
}
}
}
package com.xqq.生产者与消费者之wait和notify实现;
import java.util.concurrent.TimeUnit;
public class Producer implements Runnable{
private int delay;
private FlowQueue<Item> output;
public Producer(int delay, FlowQueue<Item> output) {
this.delay = delay;
this.output = output;
}
public void run() {
for(;;){
try {
Item product = new Item();
System.out.println("Product " + product);
output.put(product);
TimeUnit.MILLISECONDS.sleep(delay);
} catch (Exception e) {
return;
}
}
}
}
package com.xqq.生产者与消费者之wait和notify实现;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ProducerConsumer {
public static void main(String[] args) throws InterruptedException {
int producerSleep = 1;
int consumerSleep = 200;
FlowQueue<Item> fq = new FlowQueue<Item>(10);
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new Producer(producerSleep, fq));
exec.execute(new Consumer(consumerSleep, fq));
TimeUnit.SECONDS.sleep(2);
exec.shutdownNow();
}
}
运行结果:
Product Item 0
Consumer Item 0
Product Item 1
Product Item 2
Product Item 3
Product Item 4
Product Item 5
Product Item 6
Product Item 7
Product Item 8
Product Item 9
Product Item 10
Product Item 11
Consumer Item 1
Product Item 12
Consumer Item 2
Product Item 13
Consumer Item 3
Product Item 14
Consumer Item 4
Product Item 15
Consumer Item 5
Product Item 16
Consumer Item 6
Product Item 17
Consumer Item 7
Product Item 18
Consumer Item 8
Product Item 19
Consumer Item 9
Product Item 20
package com.xqq.生产者与消费者BlockingQueue实现;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable {
private BlockingQueue<Integer> sharedQueue;
public Consumer(BlockingQueue<Integer> sharedQueue) {
this.sharedQueue = sharedQueue;
}
public void run() {
for (;;) {
try {
System.out.println("Consumer " + sharedQueue.take());
} catch (Exception e) {
return;
}
}
}
}
package com.xqq.生产者与消费者BlockingQueue实现;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable{
private BlockingQueue<Integer> sharedQueue;
public Producer(BlockingQueue<Integer> sharedQueue) {
this.sharedQueue = sharedQueue;
}
public void run() {
for(int i = 0; i<10; i++){
try {
System.out.println("Produce " + i);
sharedQueue.put(i);
} catch (Exception e) {
return ;
}
}
}
}
package com.xqq.生产者与消费者BlockingQueue实现;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
public class ProducerConsumerPattern {
public static void main(String[] args) throws InterruptedException {
ExecutorService exec = Executors.newCachedThreadPool();
BlockingQueue<Integer> sharedQueue = new LinkedBlockingQueue<Integer>();
exec.execute(new Producer(sharedQueue));
exec.execute(new Consumer(sharedQueue));
TimeUnit.SECONDS.sleep(3);
exec.shutdownNow();
}
}
运行结果:
Produce 0
Produce 1
Produce 2
Produce 3
Produce 4
Produce 5
Produce 6
Produce 7
Produce 8
Produce 9
Consumer 0
Consumer 1
Consumer 2
Consumer 3
Consumer 4
Consumer 5
Consumer 6
Consumer 7
Consumer 8
Consumer 9
25. ThreadPool用法与优势
26. ThreadLocal的设计理念与作用
ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。
27. Concurrent包里的其它东西
请看:Java编程思想之并发
28. wait()和sleep()的区别
29. foreach与正常for循环效率对比
针对列表的foreach的效率是最低,耗时是普通for循环的2倍以上。个人理解它的实现应该和iterator相似。
30. java IO 与NIO
31. 反射的作用与原理
32. 泛型常用的特点,List能否转为List
33. 解析XML的几种方式的原理与特点:DOM,SAX、PULL
34. Java与C++对比
指针
JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
多重继承
c++支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。
数据类型及类
Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而c++允许将函数和变量定义为全局的。此外,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。
自动内存管理
Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法: Read r=new Read(); r.work();语句Read r=new Read();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。而c++中必须由程序员释放内存资源,增加了程序设计者的负担。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。Java里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。
操作符重载
Java不支持操作符重载。操作符重载被认为是c++的突出特征,在Java中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。
预处理功能
Java不支持预处理功能。c/c++在编译过程中都有一个预编译阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加丁编译的复杂性。JAVA虚拟机没有预处理器,但它提供的引入语句(import)与c++预处理器的功能类似。
Java不支持缺省函数参数,而c++支持
在c中,代码组织在函数中,函数可以访问程序的全局变量。c++增加了类,提供了类算法,该算法是与类相连的函数,c++类方法与Java类方法十分相似,然而,由于c++仍然支持c,所以不能阻止c++开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。 Java没有函数,作为一个比c++更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。
字符串
c和c++不支持字符串变量,在c和c++程序中使用null终止符代表字符串的结束,在Java中字符串是用类对象(String和StringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:
数组
java引入了真正的数组。不同于c++中利用指针实现的“伪数组”,Java引入了真正的数组,同时将容易造成麻烦的指针从语言中去掉,这将有利于防止在c++程序中常见的因为数组操作越界等指针操作而对系统数据进行非法读写带来的不安全问题。
“goto语句”
“可怕”的goto语句是c和c++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句子要用于无条件转移子程序和多结构分支技术。鉴于以广理由,Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。
类型转换
在c和c++中有时出现数据类型的隐含转换,这就涉及了自动强制类转换问题。例如,在c++中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持c++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
异常
JAVA中的异常机制用于捕获例外事件,增强系统容错能力 try{//可能产生例外的代码 }catch(exceptionType name){ //处理 } 其中exceptionType表示异常类型。而C++则没有如此方便的机制。
35. Java1.7与1.8新特性
36. JNI的使用
JNI作为java和操作系统之间的一个直接接口,可以通过JNI使得java直接调用操作系统的资源。目前JNI只能通过c/c++实现,因为JNI只是对操作系统资源调用的一个桥接过程。所以理论上在Windows下只要是dll文件均可以被调用。
JNI一般有以下应用场景: