互联网公司面试题目

原创 2013年12月05日 16:33:40

1.JVM体系结构:

    类加载器,在JVM启动时或者在类运行时将需要的class加载到JVM中。

    执行引擎,执行引擎的任务是负责执行class文件中包含的字节码指令,相当于实际机器上的CPU。

    内存区,将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器活着PC指针的记录器。

    本地方法调用,调用C或者C++实现的本地方法代码返回结果。

2.JVM内存模型

  PC寄存器数据

  JAVA栈

  堆

  方法区

  运行时常量池

  本地方法栈

3.类加载机制

  找到.class文件并把这个文件包含的字节码加载到内存中。

  字节码验证、Class类数据结构分析及相应的内存分配和最后的符号表的链接

  类中静态属性和初始化复制以及静态快的执行。

4. 堆栈的区别

   堆是用于存储Java对象的内存区域,堆的大小在JVM启动时就一次向操作系统申请完成,通过-Xmx(堆的最大内存)和-Xms(堆的最小内存)两个选项控制大小,一旦分配完成,堆的大小就将固定,Java堆中的内存通过JVM来管理,释放对象所占的内存空间通过JVM的垃圾回收器来完成。由于是运行时动态分配内存,所以存取速度比较慢。

  栈总是和线程关联在一起,每当创建一个线程时,JVM就会为这个线程创建一个对应的JAVA栈。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一 些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

5.垃圾回收算法

  空间维度:标记-清除、标记-压缩、标记-复制、增量回收、分代回收

  时间维度:串行回收、并发回收、并行回收


  优缺点

       GC方式                                                      优点                                         缺点 

   Serial Collector (串行)            适合内存有限的情况下                      回收慢

   Parallel Collector(并行)          效率高                                                 当heap过大时,应用程序暂停时间比较长

   CMS Collector(并发)               Old区回收暂停时间短                       产生内存碎片、整个GC耗时比较长、比较耗CPU

6.装饰器模式于代理模式的区别

   不同点:代理模式具有控制被代理类的访问等性质,而装饰模式紧紧是单纯的扩充被装饰的类。所以区别仅仅在是否对被代理/被装饰的类进行了控制而已。

7.适配器模式与装饰器模式的区别

   适配器模式主要是将一个接口转换为另一个接口,通过改变接口达到重复使用的目的

  装饰器模式不是要改变被装饰器对象的接口,而是恰恰要保持原有的接口,增强原有对象的功能,或者改变原油对象的处理方法而提升性能。

8.工厂方法模式和抽象工厂模式的区别

工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类只能创建一个具体产品类的实例。


抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
一个抽象工厂类,可以派生出多个具体工厂类。   
每个具体工厂类可以创建多个具体产品类的实例。   
    
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。   
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。


9.聚合和组合的区别

聚合(aggregation)关系: 关联关系的一种特例, 是强的关联关系. 聚合是整体和个体之间的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

组合(合成)关系(composition): 也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;合成关系不能共享. 。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
组合跟聚合几乎相同,唯一的区别就是“部分”不能脱离“整体”单独存在,就是说, “部分”的生命期不能比“整体”还要长。


 10.Spring的IOC和AOP实现原理

IOC 通过Resource加载配置文件,解析XML,装载到内存,BeanFactory通过Class.forName().newInstance()创建Bean,然后通过反射赋值。

AOP 通过动态代理、反射在业务逻辑横切面织入非业务逻辑。


 11.如何实现多线程?sleep和wait的区别?wait是否释放锁? 

  继承Thread类、实现Runnable接口,用Executor框架

  sleep是Thread里面的方法,不释放锁,一直占用CPU资源,并且需要捕捉InterruptException异常,而wait是Object里面的方法,释放了锁。


 12.JAVA的并发编程

   12.1 原子类 java.util.concurrent.atomic.AtomicInteger,java.util.concurrent.atomic.AtomicLong

   

   12.2 Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。

    它的优势有:
    可以使锁更公平
    可以使线程在等待锁的时候响应中断
    可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间
    可以在不同的范围,以不同的顺序获取和释放锁


  12.3 Executors框架同java.util.concurrent.Executor 接口在Java 5中被引入。Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架。
  无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用Executors框架可以非   常方便的创建一个线程池


   12.4 java.util.concurrent.BlockingQueue的特性是:当队列是空的时,从队列中获取或删除元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。
      阻塞队列不接受空值,当你尝试向队列中添加空值的时候,它会抛出NullPointerException。
      阻塞队列的实现都是线程安全的,所有的查询方法都是原子的并且使用了内部锁或者其他形式的并发控制。
      BlockingQueue 接口是java collections框架的一部分,它主要用于实现生产者-消费者问题。

  

   12.5 Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。
     Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法去在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结      果。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它我们可以知道Callable任务的状态和得到Callable        返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。

  

    12.6 FutureTask是Future的一个基础实现,我们可以将它同Executors使用处理异步任务。通常我们不需要使用FutureTask类,单当我们打算重写Future接口的一些方法并保持原来基础的实现是,它就变得非常有用。我们可以仅仅继承于它并重写我们需要的方法

   

    12.7 Java集合类都是快速失败的,这就意味着当集合被改变且一个线程在使用迭代器遍历集合的时候,迭代器的next()方法将抛出ConcurrentModificationException异常。
并发容器支持并发的遍历和并发的更新。主要的类有ConcurrentHashMap, CopyOnWriteArrayList 和CopyOnWriteArraySet, 。

    

    12.8  Executors为Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable类提供了一些工具方法。

  Executors可以用于方便的创建线程池。


    12.9 ConcurrentLinkedQueue 和 ConcurrentLinkedDueue 为并发非阻塞队列和栈

   

13.BIO/NIO

13.1 BIO 

基于字节操作的 I/O 接口:InputStream 和 OutputStream
基于字符操作的 I/O 接口:Writer 和 Reader
基于磁盘操作的 I/O 接口:File
基于网络操作的 I/O 接口:Socket

13.2 NIO

               Channels and Buffers(通道和缓冲区)
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
      Asynchronous IO(异步IO)
Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
Selectors(选择器)
Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。

        目前比较有名的NIO框架有Apache Mina 和Netty

14.集合框架

  Collection是集合接口
        |————Set子接口:无序,不允许重复。
        |————List子接口:有序,可以有重复元素。
 
区别:Collections是集合类
 
Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
 
Set和List具体子类:
Set
 |————HashSet:以哈希表的形式存放元素,插入删除速度很快。
 
List
 |————ArrayList:动态数组
 |————LinkedList:链表、队列、堆栈。
 
Array和java.util.Vector
Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
 
三、Iterator迭代器(接口)
Iterator是获取集合中元素的过程,实际上帮助获取集合中的元素。
迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:
迭代器允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。
方法名称得到了改进。
 
Iterator仅有一个子接口ListIterator,是列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。在长度为 n 的列表中,有 n+1 个有效的索引值,从 0 到 n(包含)。
 
四、集合框架之外的Map接口
Map将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射一个值。
Map接口是Dictionary(字典)抽象类的替代品。
Map 接口提供三种collection 视图,允许以键集、值集合或键-值映射关系集的形式查看某个映射的内容。映射的顺序 定义为迭代器在映射的 collection 视图中返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;某些映射实现则不保证顺序,如 HashMap 类。
 
有两个常见的已实现的子类:
HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
 
TreeMap:它实现SortedMap 接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字,根据使用的构造方法不同,可能会按照键的类的自然顺序 进行排序(参见 Comparable),或者按照创建时所提供的比较器进行排序。
 
Hashtable:此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。
 
五、线程安全类
在集合框架中,有些类是线程安全的,这些都是JDK1.1中的出现的。在JDK1.2之后,就出现许许多多非线程安全的类。
下面是这些线程安全的同步的类:
Vector:就比ArrayList多了个同步化机制(线程安全)。
Statck:堆栈类,先进后出。
Hashtable:就比HashMap多了个线程安全。

Properties:继承Hashtable
Enumeration:枚举,相当于迭代器。
除了这些之外,其他的都是非线程安全的类和接口。
线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低。对于非线程安全的类和接口,在多线程中需要程序员自己处理线程安全问题。


15.如何保证servlet的线程安全

实现SingleThreadModel接口

  同步对共享数据的操作

     对实例变量用关键字volatile修饰。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

如何准备互联网公司面试(算法相关)

来源:http://meterfield.com/otbzi/index.php/2011-03-17/2010-interview-summary-part2/ PS. 推荐一个算法blog,...

某互联网旅游公司面试 补充更新中

基本流程面试包括一小时笔试,三轮面试官面试,我面的是云计算相关,对方基本业务是为内部呼叫中心提供云服务,说是有上万个呼叫中心,用嵌入式盒子加显示器做云终端,连接到云上,主要编程语言是python笔试笔...

中国互联网巨头公司面试

IT是一个人才日益紧缺的行业,2012年的人才需求比2011年上涨了将近2.3倍。随着人才的紧缺,IT业的薪水也是水涨船高。互联网巨头们对人才的争夺,更是日益激烈化。 对 于从事IT的职场人士,绝大...

阿里、百度、搜狐等互联网公司面试经验总结!

原文地址:http://chuansong.me/n/368769648872 这是一位攻城狮面试了近十家互联网公司总结下来的经验之谈: 我现在主要的方向是Java服务端开发,把遇到的问题...

互联网公司面试题库

来自于:https://github.com/JackyAndroid/AndroidInterview-Q-A/blob/master/README-CN.md ...

国内一线互联网公司面试题库

转自: http://blog.csdn.net/fanpeihua123/article/details/51991358以下面试题来自于百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐内部题...

各大互联网公司面试题

  • 2014-02-21 00:18
  • 6.37MB
  • 下载

剑指GOOGLE----论研究生程序员在互联网公司面试前的准备

作为我的第一篇博客,我必然存在写博客的理由。

我的:北京某移动互联网公司面试经验

今天是2014年4月5日,星期六,清明假期第一天,
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)