JAVA面试问题及答案(上)

转载 2016年08月30日 16:25:46

1. 面向对象和面向过程的区别

面向过程 
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 
缺点:没有面向对象易维护、易复用、易扩展 
面向对象 
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 
缺点:性能比面向过程低

2. Java的四个基本特性(抽象、封装、继承,多态)

抽象:就是把现实生活中的某一类东西提取出来,用程序代码表示,我们通常叫做类或者接口。抽象包括两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性。过程抽象是对象的行为特征。 
封装:把类中的数据和操作封装起来,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行封装隐藏。封装分为属性的封装和方法的封装。 
继承:父类的意义在于抽取多类事物的共性。子类继承父类可以增强代码复用。
多态:允许不同类的对象对同一函数做出响应。方法的重载、类的覆盖正体现了多态。

3. 重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同,方法返回值和访问修饰符可以不同,发生在编译时。 
重写:发生在父子类中,方法名、参数列表必须相同,返回值等于父类,抛出的异常小于等于父类,访问修饰符更易访问;如果父类方法访问修饰符为private则子类中就不是重写。

4. 构造器Constructor是否可被override

构造器不能被继承,所以不能被重写。

5. 访问控制符public,protected,private,以及默认的区别

private只有在本类中才能访问; 
public在任何地方都能访问; 
protected在同包内的类及包外的子类能访问; 
默认不写在同包内能访问。

6. 是否可以继承String类

String类是final类故不可以继承,一切由final修饰过的都不能继承

7. String和StringBuffer、StringBuilder的区别

http://blog.csdn.net/ls5718/article/details/51899027

可变性: 
String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。 
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。 
线程安全性: 
String中的对象是不可变的,也就可以理解为常量,线程安全。 
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。 
性能: 
每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

8. hashCode和equals方法的关系

http://blog.csdn.net/ls5718/article/details/51314888

equals相等,hashcode必相等;hashcode相等,equals可能不相等。

9. 抽象类和接口的区别

http://www.cnblogs.com/dolphin0520/p/3811437.html

语法层次: 
抽象类和接口分别给出了不同的语法定义 
设计层次: 
抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。 
跨域不同,抽象类所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在”is-a” 关系,即父类和派生类在概念本质上应该是相同的。对于接口则不然,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,”like-a”的关系。。 
设计层次不同,抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

10. 自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来; 
拆箱:将包装类型转换为基本数据类型; 
Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率,由编译器来完成,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。

11. 什么是泛型、为什么要使用以及泛型擦除

泛型,即“参数化类型”。 
创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。 
Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。 泛型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。 
类型擦除的主要过程如下:

  • 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
  • 移除所有的类型参数。

12. Java中的集合类及关系图

http://blog.csdn.net/ls5718/article/details/51099463

List和Set继承自Collection接口。 
Set无序不允许元素重复。HashSet和TreeSet是两个主要的实现类。 
List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。 
Map也属于集合系统,但和Collection接口没关系。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。 HashMap、TreeMap和Hashtable是三个主要的实现类。 
SortedSet和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

13. HashMap实现原理

具体原理一句两句也说不清楚,网络文章: 
http://zhangshixi.iteye.com/blog/672697 
http://www.admin10000.com/document/3322.html

14. HashTable实现原理

具体原理一句两句也说不清楚,网络文章: 
http://www.cnblogs.com/skywang12345/p/3310887.html 
http://blog.csdn.net/chdjj/article/details/38581035

15. HashMap和HashTable区别

  • HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。
  • HashTable不允许null值(key和value都不可以) ;HashMap允许null值(key和value都可以)。
  • HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。
  • HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。
  • HashTable中hash数组默认大小是11,增加的方式是 old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。
  • 哈希值的使用不同,HashTable直接使用对象的hashCode; HashMap重新计算hash值,而且用与代替求模。

16. ArrayList和vector区别

  • ArrayList和 Vector都实现了List接口, 都是通过数组实现的。
  • Vector是线程安全的,而ArrayList是非线程安全的。
  • List第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当 List 认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

17. ArrayList和LinkedList区别及使用场景

  • ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。
  • LinkedList底层是通过双向链表实现的, LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。
  • LinkedList更适合从中间插入或者删除(链表的特性)。 ArrayList更适合检索和在末尾插入或删除(数组的特性)。

18. Collection和Collections的区别

  • java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
  • java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

19. Concurrenthashmap实现原理

具体原理一句两句也说不清楚,网络文章: 
http://www.cnblogs.com/ITtangtang/p/3948786.html 
http://ifeve.com/concurrenthashmap/

20. Error、Exception区别

Error类和Exception类的父类都是throwable类,他们的区别是:

  • Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
  • Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

21.Unchecked Exception和Checked Exception,各列举几个

http://blog.csdn.net/ls5718/article/details/52389015

Unchecked Exception:

  • 指的是程序的瑕疵或逻辑错误,并且在运行时无法恢复。
  • 包括Error与RuntimeException及其子类,如:OutOfMemoryError, UndeclaredThrowableException,IllegalArgumentException,IllegalMonitorStateException, NullPointerException, IllegalStateException, IndexOutOfBoundsException等。
  • 语法上不需要声明抛出异常。

Checked Exception:

  • 代表程序不能直接控制的无效外界情况(如用户输入,数据库问题,网络异常,文件丢失等)
  • 除了Error和RuntimeException及其子类之外,如:ClassNotFoundException, NamingException, ServletException, SQLException, IOException等。
  • 需要try catch处理或throws声明抛出异常。

22. Java中如何实现代理机制(JDK、CGLIB)

  • JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。
  • CGLIB动态代理:代理类是目标类的子类, 用到MethodInterceptor接口

23. 多线程的实现方式

继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。

24. 线程的状态转换

http://blog.csdn.net/ls5718/article/details/51553698

一张图让你看懂JAVA线程间的状态转换

25. 如何停止一个线程

这个问题简单总结不一定说的清,看一篇网络文章: 
http://www.cnblogs.com/greta/p/5624839.html

26. 什么是线程安全

线程安全就是多线程访问同一代码,不会产生不确定的结果。

27. 如何保证线程安全

  • 对非安全的代码进行加锁控制;
  • 使用线程安全的类;
  • 多线程并发情况下,线程共享的变量改为方法级的局部变量。

28. Synchronized如何使用

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  • 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  • 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  • 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  • 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

29. synchronized和Lock的区别

http://blog.csdn.net/ls5718/article/details/52396652

主要相同点:Lock能完成synchronized所实现的所有功能 
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。Lock的锁定是通过代码实现的,而synchronized是在JVM层面上实现的,synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。Lock锁的范围有局限性,块范围,而synchronized可以锁住块、对象、类。

30. 多线程如何进行信息交互

  • void notify() 唤醒在此对象监视器上等待的单个线程。
  • void notifyAll() 唤醒在此对象监视器上等待的所有线程。
  • void wait() 导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法。
  • void wait(long timeout) 导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量。
  • void wait(long timeout, int nanos) 导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

31. sleep和wait的区别(考察的方向是是否会释放锁)

sleep()方法是Thread类中方法,而wait()方法是Object类中的方法。 
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态,在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

32. 多线程与死锁

http://blog.csdn.net/ls5718/article/details/51896159

33. 如何才能产生死锁

产生死锁的四个必要条件:

  • 互斥条件:所谓互斥就是进程在某一时间内独占资源。
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

34. 死锁的预防

打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。

    • 打破循环等待条件,实行资源有序分配策略。采用这种策略,即把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成环路。所有进程对资源的请求必须严格按资源序号递增的顺序提出。进程占用了小号资源,才能申请大号资源,就不会产生环路,从而预防了死锁。

  • 打破互斥条件。即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等等,这是由资源本身的属性所决定的。所以,这种办法并无实用价值。
  • 打破占有且申请条件。可以实行资源预先分配策略。即进程在运行前一次性地向系统申请它所需要的全部资源。如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程。由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁。

35. 什么叫守护线程,用什么方法实现守护线程

守护线程是为其他线程的运行提供服务的线程。 
setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为守护模式,false为用户模式。

36. Java线程池技术及原理

http://blog.csdn.net/ls5718/article/details/52397485

37. java并发包concurrent及常用的类

http://blog.csdn.net/ls5718/article/details/51785864

38. volatile关键字

http://blog.csdn.net/ls5718/article/details/51788326

39. Java中的NIO,BIO,AIO分别是什么

  • BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
  • NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
  • AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

40. IO和NIO区别

  • IO是面向流的,NIO是面向缓冲区的。
  • IO的各种流是阻塞的,NIO是非阻塞模式。
  • Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

41. 序列化与反序列化

把对象转换为字节序列的过程称为对象的序列化。 
把字节序列恢复为对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

  • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
  • 在网络上传送对象的字节序列。
  • 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

42. 常见的序列化协议有哪些

xml、json、Protobuf, Thrift, Hessian, Kryo

43. 内存溢出和内存泄漏的区别

内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。 
内存泄漏是指分配出去的内存不再使用,但是无法回收。

44. Java内存模型及各个区域的OOM,如何重现OOM

http://blog.csdn.net/ls5718/article/details/52411211

45. 出现OOM如何解决

  • 可通过命令定期抓取heap dump或者启动参数OOM时自动抓取heap dump文件。
  • 通过对比多个heap dump,以及heap dump的内容,分析代码找出内存占用最多的地方。
  • 分析占用的内存对象,是否是因为错误导致的内存未及时释放,或者数据过多导致的内存溢出。

46. 用什么工具可以查出内存泄漏

  • Memory Analyzer-是一款开源的JAVA内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。
  • JProbe-分析Java的内存泄漏。
  • JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中,GUI可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。
  • JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。
  • YourKit .NET & Java Profiling业界领先的Java和.NET程序性能分析工具。
  • AutomatedQA -AutomatedQA的获奖产品performance profiling和memory debugging工具集的下一代替换产品,支持Microsoft, Borland, Intel, Compaq 和 GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net 1.0,1.1,2.0,3.0和Windows 32/64位应用程序。
  • Compuware DevPartner Java Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块

47. Java内存管理及回收算法

http://blog.csdn.net/ls5718/article/details/51777322

48. Java类加载器及如何加载类(双亲委派)

阅读文章:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/(推荐) 
http://blog.csdn.net/zhoudaxia/article/details/35824249

49. xml解析方式

50. Statement和PreparedStatement之间的区别

51.servlet生命周期及各个方法
http://blog.csdn.net/ls5718/article/details/51620649

52.servlet中如何自定义filter
参考文章http://www.cnblogs.com/javawebsoa/archive/2013/07/31/3228858.html

53.JSP原理
参考文章http://blog.csdn.net/hanxuemin12345/article/details/23831645

54.JSP和Servlet的区别
(1)JSP经编译后就变成了“类servlet”。
(2)JSP由HTML代码和JSP标签构成,更擅长页面显示;Servlet更擅长流程控制。
(3)JSP中嵌入JAVA代码,而Servlet中嵌入HTML代码。

55.JSP的动态include和静态include

http://blog.csdn.net/ls5718/article/details/51553919
(1)动态include用jsp:include动作实现,如<jsp:include page="abc.jsp" flush="true" />,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。会先解析所要包含的页面,解析后和主页面合并一起显示,即先编译后包含。
(2)静态include用include伪码实现,不会检查所含文件的变化,适用于包含静态页面,如<%@ include file="qq.htm" %>,不会提前解析所要包含的页面,先把要显示的页面包含进来,然后统一编译,即先包含后编译。

56.Struts中请求处理过程
http://blog.csdn.net/ls5718/article/details/51606827

57.MVC概念
参考文章http://www.cnblogs.com/scwyh/articles/1436802.html

58.Spring mvc与Struts区别
http://blog.csdn.net/ls5718/article/details/52274135

59.Hibernate/Ibatis两者的区别
参考文章http://blog.csdn.net/firejuly/article/details/8190229

60.Hibernate一级和二级缓存
http://blog.csdn.net/ls5718/article/details/52183086

61.简述Hibernate常见优化策略
参考文章http://blog.csdn.net/shimiso/article/details/8819114

62.Spring bean的加载过程(推荐看Spring的源码)
参考文章http://geeekr.com/read-spring-source-1-how-to-load-bean/

63.Spring bean的实例化(推荐看Spring的源码)
参考文章http://geeekr.com/read-spring-source-two-beans-initialization/

64.Spring如何实现AOP和IOC(推荐看Spring的源码)
http://blog.csdn.net/ls5718/article/details/51668730

http://blog.csdn.net/ls5718/article/details/51791758

65.Spring bean注入方式
参考文章http://blessht.iteye.com/blog/1162131

66.Spring的事务管理
这个主题的参考文章没找到特别好的,http://blog.csdn.net/trigl/article/details/50968079

67.Spring事务的传播特性
参考文章http://blog.csdn.net/lfsf802/article/details/9417095

68.springmvc原理
参考文章http://blog.sina.com.cn/s/blog_7ef0a3fb0101po57.html

69.springmvc用过哪些注解
参考文章http://aijuans.iteye.com/blog/2160141

70.Restful有几种请求
参考文章,http://www.infoq.com/cn/articles/designing-restful-http-apps-roth

71.Restful好处
(1)客户-服务器:客户-服务器约束背后的原则是分离关注点。通过分离用户接口和数据存储这两个关注点,改善了用户接口跨多个平台的可移植性;同时通过简化服务器组件,改善了系统的可伸缩性。
(2)无状态:通信在本质上是无状态的,改善了可见性、可靠性、可伸缩性.
(3)缓存:改善了网络效率减少一系列交互的平均延迟时间,来提高效率、可伸缩性和用户可觉察的性能。
(4)统一接口:REST架构风格区别于其他基于网络的架构风格的核心特征是,它强调组件之间要有一个统一的接口。

72.Tomcat,Apache,JBoss的区别
Apache:HTTP服务器(WEB服务器),类似IIS,可以用于建立虚拟站点,编译处理静态页面,可以支持SSL技术,支持多个虚拟主机等功能。
Tomcat:Servlet容器,用于解析jsp,Servlet的Servlet容器,是高效,轻量级的容器。缺点是不支持EJB,只能用于java应用。
Jboss:应用服务器,运行EJB的J2EE应用服务器,遵循J2EE规范,能够提供更多平台的支持和更多集成功能,如数据库连接,JCA等,其对Servlet的支持是通过集成其他Servlet容器来实现的,如tomcat和jetty。

73.memcached和redis的区别
(1)性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。
(2)内存使用效率对比:使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。
(3)Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

74.如何理解分布式锁
http://blog.csdn.net/zheng0518/article/details/51607063

http://blog.csdn.net/nicewuranran/article/details/51730131

75.你知道的开源协议有哪些
常见的开源协议有GPL、LGPL、BSD、Apache Licence vesion 2.0、MIT,详细内容参考文章

http://blog.jobbole.com/44175/

http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html

76.json和xml区别
XML:
(1)应用广泛,可扩展性强,被广泛应用各种场合;
(2)读取、解析没有JSON快;
(3)可读性强,可描述复杂结构。
JSON:
(1)结构简单,都是键值对;
(2)读取、解析速度快,很多语言支持;
(3)传输数据量小,传输速率大大提高;
(4)描述复杂结构能力较弱。

77.设计模式
参考文章http://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html#_Toc281750445

78.设计模式的六大原则
参考文章http://www.uml.org.cn/sjms/201211023.asp

79.用一个设计模式写一段代码或画出一个设计模式的UML
参考文章http://www.cnblogs.com/beijiguangyong/archive/2010/11/15/2302807.html#_Toc281750445

80.高内聚,低耦合方面的理解
参考文章http://my.oschina.net/heweipo/blog/423235

算法:

1. 深度优先、广度优先算法

2. 排序算法及对应的时间复杂度和空间复杂度

3. 写一个排序算法

4. 查找算法

5. B+树和二叉树查找时间复杂度

6. KMP算法、hash算法

7. 常用的hash算法有哪些

8. 如何判断一个单链表是否有环?

9. 给你一万个数,如何找出里面所有重复的数?用所有你能想到的方法,时间复杂度和空间复杂度分别是多少?

10. 给你一个数组,如何里面找到和为K的两个数?

11. 100000个数找出最小或最大的10个?

12. 一堆数字里面继续去重,要怎么处理?

数据结构:

1. 队列、栈、链表、树、堆、图

2. 编码实现队列、栈

Linux:

1. linux常用命令

2. 如何查看内存使用情况

3. Linux下如何进行进程调度

操作系统:

1. 操作系统什么情况下会死锁

2. 产生死锁的必要条件

3. 死锁预防

数据库:

1. 范式http://blog.csdn.net/ls5718/article/details/51768920

2. 数据库事务隔离级别http://blog.csdn.net/ls5718/article/details/51894799

3. 数据库连接池的原理http://blog.csdn.net/shuaihj/article/details/14223015

4. 乐观锁和悲观锁http://blog.csdn.net/ls5718/article/details/52130687

5. 如何实现不同数据库的数据查询分页http://blog.csdn.net/ls_man/article/details/11783813    http://www.cnblogs.com/bluestorm/archive/2012/08/06/2625578.html

6. SQL注入的原理,如何预防http://blog.csdn.net/ls5718/article/details/52123140

7. 数据库索引的实现(B+树介绍、和B树、R树区别)http://blog.csdn.net/ls5718/article/details/51769697

8. SQL性能优化http://blog.csdn.net/ls5718/article/details/51773813

9. 数据库索引的优缺点以及什么时候数据库索引失效http://blog.csdn.net/ls5718/article/details/52278139

10.Redis的存储结构

网络:

1. OSI七层模型以及TCP/IP四层模型http://blog.csdn.net/ls5718/article/details/51849854

2. HTTP和HTTPS区别http://blog.csdn.net/ls5718/article/details/52431277

3. HTTP报文内容http://blog.csdn.net/ls5718/article/details/51851733

4. get提交和post提交的区别

5. get提交是否有字节限制,如果有是在哪限制的

6. TCP的三次握手和四次挥手http://blog.csdn.net/ls5718/article/details/51583514

7. session和cookie的区别http://blog.csdn.net/ls5718/article/details/52431346

8. HTTP请求中Session实现原理

9. redirect与forward区别

10.DNS

11. TCP和UDP区别http://blog.csdn.net/ls5718/article/details/52141571

安全:

1. 如果客户端不断的发送请求连接会怎样

2. DDos攻击http://blog.csdn.net/ls5718/article/details/52431369

3. DDos预防

4. 那怎么知道连接是恶意的呢?可能是正常连接

其它:

1. 说一个你参与的项目、其中作为什么角色

2. 遇到最困的问题是什么,怎么解决的

3. 你认为自己有那些方面不足

4. 平常如何学习的

5. 如何评价自己

智力题:

1. 给你50个红球和50个黑球,有两个一模一样的桶,往桶里放球,让朋友去随机抽,采用什么策略可以让朋友抽到红球的概率更高?

2. 从100个硬币中找出最轻的那个假币?

举报

相关文章推荐

关于“==”和equals()的比较

在java学习中,尤其是String类型和int类型的学习中,“==”和equals()的区别容易混淆,下面通过程序的方法来说明二者的相同和不同: public class Test { publ...

volatile修饰符的作用

作用 volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值. 简单地说就是防止编译器对代码进行优化.比如如下程序: XBYTE[2]...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

JAVA反射机制的应用场景

概念 反射机制指的是我们可以于java运行时加载、探知、使用编译期间完全未知的classes。 应用场景可以分为两种情景: 情景一:         插件系统    &#...

【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)

在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。 在当前的J...

对volatile修饰符的理解和使用

1. 什么是volatile修饰符? volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其他线程等。遇到这个关键字声明的变量,编译...

java中的Volatile关键字(成员变量修饰符)

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的...

RDS 在线DDL诡异报错ERROR 1062 (23000): Duplicate entry

RDS上执行报错如下:MySQL [ad_billing]> ALTER TABLE ad_spending ADD COLUMN impr bigint(20) NOT NULL DEFAULT 0...

多线程死锁的产生以及如何避免死锁

一、死锁的定义 多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进...
  • ls5718
  • ls5718
  • 2016-07-13 11:07
  • 11376
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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