黑马程序员技术交流社区

标题: java重点难点面试题 [打印本页]

作者: 陈旭刚520    时间: 2015-1-14 21:54
标题: java重点难点面试题
1、方法重载与覆盖的区别?(Overload与Override的区别)
答:方法覆盖是父类直接多态性的一种表现,而方法重载则是一个类中多态性的表现。

2、 String 和StringBuffer的区别
答:String为不可变对象,一旦被创建,就不能修改它的值,对于已经存在的String对象的修改都是重新创建一个新的对象,然后再把新的值保存进去。
StringBuffer是可变对象,在修改值的时候不需要再新建对象,可以用append()方法在后面添加新的值,性能比String高。

3、接口和抽象类
答:接口(interface):接口是用来实现的,里面定义的方法在被子类覆盖时子类中的方法都是public的,里面的成员对象都是final&static,里面的方法都要被实现。
抽象类(abstract):是用来被继承的,里面定义的方法在被子类覆盖时子类的方法不一定都是public的,里面的成员对象不是final&static,在其内部中有abstract方法才会被必须实现。

4、集合类的区别:
java容器类库一共有两种主要类型,Collection和Map。
Collection:它是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。如:Collection.max(Collection coll); Collection.sort(List list);
分为List(ArrayList,LinkedList,Vector,都是有序,元素可重复),
Set(HashSet,TreeSet,LinkedHashSet,都是无序,且元素不可重复),
Queue(PriorityQueue,先进先出的容器)
Map:
HashMap,HashTable,TreeMap
主要其中几款常用到的:
ArrayList:底层用数组实现,查询效率高,增删效率低,轻量级,线程不安全
LinkedList:底层用双向循环链表,查询效率慢,增删效率高。
Vector:底层用数组实现,重量级,占据更多的系统开销,线程安全。
HashSet:底层用的是哈希算法。
HashMap:轻量级,线程不安全,允许key或者value是null。
HashTable:重量级,先出安全,不允许key或者value是null。

5、线程的四种状态:
答:产生(new),可执行(Runnable),死亡(Dead),停滞(Blocked)
线程的实现方式:extends Thread 和 implements Runnable

6、线程中wait,join,sleep,yield,notify,notifyall,synchronized,区别及联系
答:sleep():在指定时间内让当前正在执行的线程休眠。
wait():在线程休眠的同时释放掉机锁,其他线程可以访问该对象。wait必须在同步代码块中执行。
那怎样把对象锁收回来呢?第一种就是给其设定时间,时间一到就立刻收回来,如:wait(1000);
notify():收回对象锁的另一种方式,它的作用是唤醒在此对象监视器上等待的单个线程。当被执行notify()方法后,等待池中的线程就被放到了锁池中,并取得机锁,回到wait()前的中断现场。
notifyAll():唤醒在此对象监视器上等待的所有线程。
join():等待当前线程执行完。
yield():停止当前线程,让同等优先级的线程先运行,如果不是同等优先级的线程,则不执行。
synchronized:当它用来修饰一个方法或者一个代码块时,能够保证在同一时刻只有一个线程能够执行该段代码。

7、 final、finally、finanlize()的区别
答:final:用来修饰成员、方法和类,使得成员变量不能被修改,方法不能被覆写,类不能被继承。
finally:对java异常处理模型的最佳补充,不管有无异常发生,finally结构的代码总会被执行。
finalize:用于一些不容易控制,并且非常重要的资源的释放,例如:I/O的操作,数据的连接。

8、字节流和字符流的区别
答:字符流用到了缓冲区,而字符流没有用到。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
但是我们还是认为使用字节流更好,理由是:
所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,
而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
java面试题先写这么多,以后有需要再补充,至于某些设计模式、数据结构和算法,在这篇博文中暂时先不写。
下一篇就是写Android的面试题。
如果大家有什么的建议和看法,可以提出来,很高兴跟大家分享。

作者: TW莞尔一笑    时间: 2015-1-14 21:57
好,以后可能用得着.....
作者: 陈旭刚520    时间: 2015-1-14 22:02
TW莞尔一笑 发表于 2015-1-14 21:57
好,以后可能用得着.....

那就给点个分啊
作者: TW莞尔一笑    时间: 2015-1-14 22:05
明天到班上给你............:lol
作者: 581712sen    时间: 2015-1-18 00:13
不错,收藏了。。。
作者: 梁小刀11    时间: 2015-1-22 22:46
谢谢分享!
作者: 邓士林    时间: 2015-1-23 09:10
不错,继续努力。
作者: 梁小刀11    时间: 2015-1-24 23:45
谢谢分享.
作者: zw937820438    时间: 2015-1-25 00:03
不错来分享一下
作者: 梁小刀11    时间: 2015-2-5 19:56
第四点的 Collection,少了个s 应该是Collections
作者: franksight    时间: 2015-2-6 08:38
果断看一下。。。
作者: welfsen    时间: 2015-3-12 21:56
留着,以后有用!
作者: 付家辉    时间: 2015-3-15 09:10
1,"=="和equals方法究竟有什么区别?

    (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)

     ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

     equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:

     String a=new String("foo");

     String b=new String("foo");

     两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。

     在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。

     如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
     boolean equals(Object o){
     return this==o;
}

     这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
2. 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。

public class VariantTest
{
public static int staticVar = 0;

public int instanceVar = 0;

public VariantTest()

{

staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);
}
}
3.是否可以从一个static方法内部发出对非static方法的调用?
     不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
4.1. 线程如何同步和通讯

只有多个synchronized代码块使用的是同一个监视器对象,这些synchronized代码块之间才具有线程互斥的效果,假如a代码块用obj1作为监视器对象,假如b代码块用obj2作为监视器对象,那么,两个并发的线程可以同时分别进入这两个代码块中。 …这里还可以分析一下同步的原理。    对于同步方法的分析,所用的同步监视器对象是this

作者: maryuet    时间: 2015-3-23 08:51
好东西,感谢!
作者: 小亮smile    时间: 2015-3-23 22:10
赞一个!!!!顶顶顶!!!1
作者: 风飘逸    时间: 2015-3-26 18:54
集合,IO,多线程就这部分讲的最多
作者: 张红兴    时间: 2015-3-26 23:55
不错,值得一看!
作者: 時間_|_的灰    时间: 2015-5-24 04:22
不错哦,加油
作者: 時間_|_的灰    时间: 2015-5-29 19:21
感谢分享
作者: heima_cy    时间: 2015-8-16 22:17
厉害啊   这个觉得是相当的难了 已经




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2