黑马程序员技术交流社区

标题: 各种基础面试题(含答案),持续更新中。。。 [打印本页]

作者: 李俊超    时间: 2015-6-9 08:00
标题: 各种基础面试题(含答案),持续更新中。。。

1.char型变量中能不能存贮一个中文汉字?为什么?

   答案:char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。


2.、"=="和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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

3.Anonymous Inner Class (匿名内部类)是否可以 extends(继承)其它类,是否可以 implements(实现)interface(接口)?答案:可以继承其他类或实现其他接口。不仅是可以,而是必须!

4.String 和 StringBuffer 的区别答案:JAVA 平台提供了两个类:String 和 StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。      这个 String 类提供了数值不可改变的字符串。而这个 StringBuffer 类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用 StringBuffer。典型地,你可以使用 StringBuffers 来动态构造字符数据。另外,String 实现了 equals 方法,new String(“abc”).equals(new String(“abc”)的结果为 true,而 StringBuffer 没有实现equals 方法,
所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为 false。
接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。
StringBuffer sbf = new StringBuffer();
           for(int i=0;i<100;i++)
            {
              sbf.append(i);
             }
上面的代码效率很高,因为只创建了一个 StringBuffer 对象,而下面的代码效率很低,因为
创建了101个对象。
String str = new String();
for(int i=0;i<100;i++)
{
         str = str + i;
}
在讲两者区别时,应把循环的次数搞成10000,然后用 endTime-beginTime 来比较两者执行的时间差异,最后还要讲讲 StringBuilder 与 StringBuffer 的区别。
String 覆盖了 equals 方法和 hashCode 方法,而 StringBuffer 没有覆盖 equals 方法和hashCode 方法,所以,将 StringBuffer 对象存储进 Java 集合类中时会出现问题。

5.java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和 suspend()方法为何不推荐使用?
答案:java5以前,有如下两种:
第一种:
new Thread(){}.start();这表示调用 Thread 子类对象的 run 方法,new Thread(){}表示一个
Thread 的匿名子类的实例对象,子类加上 run 方法后的代码如下:
new Thread(){public void run(){}}.start();
第二种:
new Thread(new Runnable(){}).start();这表示调用Thread对象接受的Runnable对象的run
方法,new Runnable(){}表示一个 Runnable 的匿名子类的实例对象,runnable 的子类加上
run 方法后的代码如下:
new Thread(new Runnable(){public voidrun(){}}).start();
从 java5开始,还有如下一些线程池创建多线程的方式:
ExecutorService pool = Executors.newFixedThreadPool(3)
for(int i=0;i<10;i++)
{
pool.execute(newRunable(){public void run(){}});
}
Executors.newCachedThreadPool().execute(new Runable(){publicvoid run(){}});
Executors.newSingleThreadExecutor().execute(new Runable(){publicvoid run(){}});
有两种实现方法,分别使用 new Thread()和 new Thread(runnable)形式,第一种直接调用thread 的 run 方法,所以,我们往往使用 Thread 子类,即 new SubThread()。第二种调用runnable 的 run 方法。
有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口
用 synchronized 关键字修饰同步方法
反对使用 stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用 suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的
线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用 suspend(),而应在自己的 Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个 notify()重新启动线程。








作者: 李俊超    时间: 2015-6-9 08:01
6.同步和异步有何异同,在什么情况下分别使用他们?举例说明。
答案:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

7.多线程有几种实现方法?同步有几种实现方法?
答案:多线程有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口。                                                                    同步的实现方面有两种,分别是 synchronized,wait 与 notify.
wait():使一个线程处于等待状态,并且释放所持有的对象的 lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException 异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且不是按优先级。
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

8.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是 equals()?它们有何区别?
答案:Set 里的元素是不能重复的,元素重复与否是使用 equals()方法进行判断的。
equals()和==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个
分离的对象的内容和类型相配的话,返回真值。
作者: java8023    时间: 2015-6-9 09:20
总结的不错的嘛,赞一个
作者: 开弓没有回头箭    时间: 2015-6-9 09:20
学习了。。。
作者: 侯月超    时间: 2015-6-9 10:14
谢谢分享 ,赞一个
作者: 岑寂    时间: 2015-6-9 12:25
好好学习学习!
作者: yang9876q    时间: 2015-6-9 12:40
学习,谢谢楼主
作者: RockLee    时间: 2015-6-9 13:47
学习了。
作者: hellotaomi    时间: 2015-6-9 14:30
大赞啊~
作者: 知来者之可追    时间: 2015-6-9 21:48
学习了。。。
作者: 天涯111    时间: 2015-6-9 21:53
总结的好详细啊,有学到了新东西    赞一个!!!
作者: 曹操001    时间: 2015-6-9 21:59
黑马名不虚传!
作者: hellowo_ccLiv    时间: 2015-6-9 22:02
谢谢!学习收藏了。
作者: QQheima    时间: 2015-6-9 22:14
StringBuffer和StringBuilder到底有啥区别啊,你就列了个标题,也没说明
作者: xiaodong    时间: 2015-6-9 22:17
收藏了,谢谢!!!
作者: dalelufei    时间: 2015-6-10 21:39
GOOD!nice!6666
作者: 安逸小弟    时间: 2015-6-10 21:52
谢谢分享 保存了
作者: DAN66    时间: 2015-6-10 22:46
收藏了~谢谢分享:lol
作者: q757571446    时间: 2015-6-10 23:50
好东西,果断收藏了,狂顶一个!
作者: lixianzhu0712    时间: 2015-8-8 19:54
好棒啊!真的是学习了
作者: 酒倌浪人    时间: 2015-8-8 20:36
收藏了,多谢
作者: Holmes    时间: 2015-8-8 21:58
感谢分享。。。。
作者: 狮子王    时间: 2015-8-8 22:07
好东西~!  
作者: 风的自由    时间: 2015-8-8 22:38
好东西,顶一下

作者: CharnLau    时间: 2015-8-8 22:42
那么长!
作者: 徐鹏辰    时间: 2015-8-8 23:07
给力,写的够详细
作者: 午后阿怪    时间: 2015-8-8 23:12
谢谢分享




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