java面试总结(第一天)

时间:2021-09-27 17:48:03

  临近大学毕业,出来试试找工作,学c#出身,半路出家java,做过几个ssh、stringMVC的项目。基础知识不太扎实,勿喷

  以下是我面试过程中遇到的问题

------------------------------------------------------------------------------------------------------------------------------

   1)下文摘自《Java Concurrency in Practice》,请译成中文。  

  “When used properly, threads can reduce development and maintenance costs and improve the performance of complex applications.

  Threads make it easier to model how humans work and interact, by turning asynchronous workflows into mostly sequential ones. 

  Threads are useful in GUI applications for improving the responsiveness of the user interface, and in server applications for improving

  resource utilization and throughput.”

 

  直接懵逼,后来回来上网一查《Java并发编程实践》,豆瓣评分9.3

  都说是一本极好的并发入门书籍,果断淘了一本英文的,据说中文版翻译极烂所以下了一个pdf加以对照。

  还可以练一下英文水平

------------------------------------------------------------------------------------------------------------------------------

  2)请指出下列程序片段的输出结果

  public class test {

    public static void main(String[] args) throws Exception {
    String str = "中国";
    System.out.println(str.getBytes("UTF-8").length);
    System.out.println(str.getBytes("GBK").length);
    System.out.println(str.getBytes("ISO-8859-1").length);
    System.out.println(new String(str.getBytes("ISO-8859-1"), "ISO-8859-1"));
    System.out.println(new String(str.getBytes("UTF-8"), "UTF-8"));  
    System.out.println(new String(str.getBytes("GBK"), "GBK"));
    }

  }

  这也是java程序员经常碰到的乱码问题,下面是输出结果

  -----------  

    6 
    4
    2
    ??
    中国
    中国

  ----------

  ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符。
  gb2312是简体中文的码
  gbk支持简体中文及繁体中文 big5支持繁体中文
  utf-8支持几乎所有字符

------------------------------------------------------------------------------------------------------------------------------

  3)请使用Java语言实现多线程模式下的生产者与消费者问题。

    这里我就直接把网上的例子链接拿过来吧,因为没他们写的好23333

         1.这篇文章主要介绍了java多线程解决生产者消费者问题的方法,实例分析了

      java采用多线程的方法解决生产者消费者问题的相关技巧,需要的朋友可以参考下

      http://www.jb51.net/article/67018.htm

      2.Java多线程-并发协作(生产者消费者模型)

      http://www.cnblogs.com/linjiqin/p/3217050.html

      3.http://blog.csdn.net/thinkpadshi/article/details/8163751

------------------------------------------------------------------------------------------------------------------------------

  这道题也是copy某位前辈的,如果涉及到版权联系我我会删除,原帖链接(完整版)http://jeromecen1021.blog.163.com/blog/static/18851527120117274624888/

  4)地球人都知道,Java有个东西叫垃圾收集器,它让创建的对象不需要像c/cpp那样delete、free掉,你能不能谈谈,GC是在什么时候 ,对什么东西,做了什么事情?

    一.回答:什么时候?
    1.系统空闲的时候。
        分析:这种回答大约占30%,遇到的话一般我就会准备转向别的话题,譬如算法、譬如SSH看看能否发掘一些他擅长的其他方面。

    2.系统自身决定,不可预测的时间/调用System.gc()的时候。
        分析:这种回答大约占55%,大部分应届生都能回答到这个答案,起码不能算错误是吧,后续应当细分一下到底是语言表述导致答案 太笼统,还是本身就只有这样一个模糊的认识。

    3.能说出新生代、老年代结构,能提出minor gc/full gc
        分析:到了这个层次,基本上能说对GC运作有概念上的了解,譬如看过《深入JVM虚拟机》之类的。这部分不足10%。

    4.能说明minor gc/full gc的触发条件、OOM的触发条件,降低GC的调优的策略。

        分析:列举一些我期望的回答:eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被
      HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio
      控制新生代老年代比例,通过 MaxTenuringThreshold控制进入老年前生存次数等……能回答道这个阶段就会给我带来比较高的
      期望了,当然面试的时候正常人都不会记得每个参数的拼写,我自己写这段话的时候也是翻过手册的。回答道这部分的小于2%。
      总结:程序员不能具体控制时间,系统在不可预测的时间调用System.gc()函数的时候;当然可以通过调优,用NewRatio控制n
      ewObject和oldObject的比例,用MaxTenuringThreshold 控制进入oldObject的次数,使得oldObject 存储空间延迟达到full
      gc,从而使得计时器引发gc时间延迟OOM的时间延迟,以延长对象生存期。

------------------------------------------------------------------------------------------------------------------------------

  5)StringBuffer与StringBuilder的区别

    StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,

    这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

------------------------------------------------------------------------------------------------------------------------------
  6)(参考)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。

------------------------------------------------------------------------------------------------------------------------------

  大概就是这么多了明日继续,如果涉及到版权问题联系我,我会删掉。

  我只是博客的搬运工~~~~~