闲聊日谈 面试

来源:互联网 发布:sql 最近7天记录 编辑:程序博客网 时间:2024/04/28 14:06

从上家公司离职,步入找工作的大军中,虽然有一年的工作经验,经过2次面试,半个月才有2次面试说多了都是泪啊,可能简历有问题,可能项目描述的太简单了,总之没有hr给我打电话,面试还是朋友内推的,丢人啊。本来自信满满,我工作都一年了能和哪些刚出校门的小屁孩一样吗,事实证明还不如他们,面对我们这些刚工作1~2年的开发来说,涉及的都是一些外围的业务,所以有时候面试官也不知道面试什么,会从网上找面试题,可能他们内心独白是这样的(妈的,面试题网上都有都不好好的看看复习,一看就不是找工作的态度,pass),也许不可能直接让你进去写项目,面试题是最简单有效的解决问题的方法,好吧,我还是从网上找了一份面试题,分享给大家,因为答案是自己写的可能不一定准确,大家凑合看。



基本概念


操作系统中 heap 和 stack 的区别


      Heap(堆)      Stack(栈) JVM中的功能     内存数据区                   内存指令区 存储数据     对象实例(1) 基本数据类型, 指令代码,常量,对象的引用地址(2)

1. 保存对象实例,实际上是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在stack中)。
   
   对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的位置,便于找到该对象实例。
 
2. 基本数据类型包括byte、int、char、long、float、double、boolean和short。
    函数方法属于指令.
 
 =======================       
  引用网上广泛流传的“Java堆和栈的区别”里面对堆和栈的介绍;
          "Java 的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。"
        “栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 ”
   
         可见,垃圾回收GC是针对堆Heap的,而栈因为本身是FILO - first in, last out. 先进后出,能够自动释放。 这样就能明白到new创建的,都是放到堆Heap!

什么是基于注解的切面实现

    1. Joinpoint(连接点)    -- 所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
    2. Pointcut(切入点)        -- 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义

execution(public * *(..))切入点表达式

前置通知  before

最终通知 after

后置通知 afterReturning

异常抛出通知 aterThorwing

环绕通知 around

    3. Advice(通知/增强)    -- 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
    4. Introduction(引介)    -- 引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field
    5. Target(目标对象)        -- 代理的目标对象
    6. Weaving(织入)        -- 是指把增强应用到目标对象来创建新的代理对象的过程
    7. Proxy(代理)        -- 一个类被AOP织入增强后,就产生一个结果代理类
    8. Aspect(切面)            -- 是切入点和通知的结合,以后咱们自己来编写和配置的

什么是 对象/关系 映射集成模块

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式
什么是 Java 的反射机制

反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型,类型又包含成员。)
优缺点:
优点:
1、反射提高了程序的灵活性和扩展性。 
2、降低耦合性,提高自适应能力。 
3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
缺点:
1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。 
2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
什么是 ACID
BS与CS的联系与区别

C/S 与 B/S 区别: 
1.硬件环境不同: 
  C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务. 
  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行 
2.对安全要求不同 
  C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息. 
  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。 
3.对程序架构不同 
  C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑. 
  B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟. 
4.软件重用不同 
  C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好. 
  B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子 
5.系统维护不同 
  C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统 
  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级. 
6.处理问题不同 
  C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统 
  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小. 
7.用户接口不同 
  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高 
  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本. 
8.信息流不同 
  C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低 
  B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。
Cookie 和 Session的区别

中心。

会话技术
当用户打开浏览器的时候,访问不同的资源,知道用户将浏览器关闭,可以认为这是一次会话.

cookie是由服务器生成,通过response将cookie写回浏览器(set-cookie),保留在浏览器上,
下一次访问,浏览器根据一定的规则携带不同的cookie(通过request的头 cookie),我们服务器就可以接受cookie

session:
服务器端会话技术.
当我们第一次访问的服务器的时候,服务器获取id,
能获取id
要拿着这个id去服务器中查找有无此session
若查找到了:直接拿过来时候,将数据保存,需要将当前sessin的id返回给浏览器
若查找不到:创建一个session,将你的数据保存到这个session中,将当前session的id返回给浏览器
不能获取id
创建一个session,将你的数据保存到这个session中,将当前session的id返回给浏览器

Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标识这个Session,并将其通过响应发送到浏览器。当浏览器第二次发送请求,会将前一次服务器响应中的Session ID放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有Session ID进行对比,找到这个用户对应的Session。

Session的客户端保存方式即cookie,用于存放sessionid

使用Cookie来保存,这是最常见的方法,本文“记住我的登录状态”功能的实现正式基于这种方式的。服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置这个过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同 样会发送到服务器上。

防止Cookie被修改的问题

用于识别身份的cookie应该设置为HttpOnly,也就是禁止通过JS操作这个cookie,这样可以避免网站因为XSS漏洞而导致用户的cookie被XSS收集.

另一个方面,如果要防止cookie被中间人劫持,还得上HTTPS加密通信,这就得购买CA证书(受制于人)和配置Web服务器了,cookie里也有这个配置,就是secure,比如:

setcookie('sessid', 'uniqid', time()+3600, '/', '', true, true);//上面这句PHP设置cookie的代码将生成类似下面的响应头//Set-Cookie: sessid=uniqid; expires=Wed, 07-Sep-2016 12:08:22 GMT; path=/; secure; httponly

楼主还有一个疑问就是cookie怎么避免被伪造?
要搞清楚这个问题,就要了解cookie的认证过程:

//保护用户密码的盐(用户注册或修改密码时生成)$salt = sha1(uniqid($user_id.'_'.getmypid().'_'.mt_rand().'_', true));//数据库保存的用户密码($pwd_user是用户输入的密码明文)$pwd_db = sha1($salt.sha1($pwd_user));//cookie里的盐//其中$global_salt是配置里config.php定义的全局盐,用来保护用户的盐,一旦修改,所有用户的cookie都将失效.$cookie_salt = sha1($global_salt.sha1($salt));//最终生成的cookie内容$cookie = base64_encode($user_id.'|'.$cookie_salt);//如果你需要高安全性,还可以使用AES对整个cookie的内容做一次加密.//https://segmentfault.com/q/1010000006884052/a-1020000007074076//$cookie = openssl_aes_encrypt($cookie, $key);这里把过期时间设为604800秒(60*60*24*7,一周)setcookie('sessid', $cookie, time()+604800, '/', '', false, true);//解密cookie//$cookie = openssl_aes_decrypt($_COOKIE['sessid'], $key);//解码分割后拿到里面的$user_id和$cookie_salt//根据$user_id查询$salt拼出$cookie_salt,然后跟cookie里的$cookie_salt做对比,一致则通过cookie认证.$cookie = explode('|', base64_decode($_COOKIE['sessid']));list($user_id, $cookie_salt) = $cookie;

可见因为有随机且唯一并经过哈希的盐(以及AES加密),所以cookie是很难伪造的.
根据cookie里的ID查询数据库用户表对应的盐,并与cookie中的盐比对,一致则通过用户身份认


fail-fast 与 fail-safe 机制有什么区别

fail-fast快速失败和fail-safe安全失败比较

当多个线程对同一个集合进行操作的时候,某线程访问集合的过程中,该集合的内容被其他线程所改变(即其它线程通过add、remove、clear等方法,改变了modCount的值);这时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

fail-safe任何对集合结构的修改都会在一个复制的集合上进行修改,因此不会抛出ConcurrentModificationException
fail-safe机制有两个问题
(1)需要复制集合,产生大量的无效对象,开销大
(2)无法保证读取的数据是目前原始数据结构中的数据。

get 和 post请求的区别

1. 最直观的就是语义上的区别,get用于获取数据,post用于提交数据。
2. get参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制),而post无限制

GET和POST的安全性

1.GET是通过URL方式请求,可以直接看到,明文传输。

2.POST是通过请求header请求,可以开发者工具或者抓包可以看到,同样也是明文的。 3.GET请求会保存在浏览器历史纪录中,还可能会保存在Web的日志中。

Interface 与 abstract 类的区别

1、抽象类可以有自己的具体方法,接口中都是抽象方法

2、抽象类子类只能单继承,单子类可以实现多个接口。
IOC的优点是什么

IOC(Inversion of Control)控制反转,将控制权(创建对象和对象之间的依赖关系的权利)交给spring容器。
接口驱动设计(Interface Driven Design)的好处,可以灵活提供不同的子类实现(其实就是解耦),提高程序的灵活性、可扩展性和可维护性。

IOC的缺点:
1、创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。
IO 和 NIO的区别,NIO优点

NIO vs IO之间的理念上面的区别(NIO将阻塞交给了后台线程执行)
IO是面向流的,NIO是面向缓冲区的
Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方;
NIO则能前后移动流中的数据,因为是面向缓冲区的
IO流是阻塞的,NIO流是不阻塞的
Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了
Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。 
非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。
选择器
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。 

Java 8 / Java 7 为我们提供了什么新功能

1,switch中可以使用字串了
2.运用List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断
java8
1,Lambda 表达式
2,新的日期类

JRE、JDK、JVM 及 JIT 之间有什么不同

java虚拟机(JVM)
    使用java编程语言的主要优势就是平台的独立性。你曾经想知道过java怎么实现平台的独立性吗?对,就是虚拟机,它抽象化了硬件设备,开发者和他们的程序的得以操作系统。虚拟机的职责就是处理和操作系统的交流。java不同的接口规范对任何平台都有良好的支持,因为jvm很好的实现了每个平台的规范。jvm可以理解伪代码字节码,在用户和操作系统之间建立了一层枢纽。
 
java运行时环境(JRE)
    java运行时环境是JVM的一个超集。JVM对于一个平台或者操作系统是明确的,而JRE确实一个一般的概念,他代表了完整的运行时环境。我们在jre文件夹中看到的所有的jar文件和可执行文件都会变成运行时的一部分。事实上,运行时JRE变成了JVM。所以对于一般情况时候使用JRE,对于明确的操作系统来说使用JVM。当你下载了JRE的时候,也就自动下载了JVM。
 
java开发工具箱(JDK)
    java开发工具箱指的是编写一个java应用所需要的所有jar文件和可执行文件。事实上,JRE是JKD的一部分。如果你下载了JDK,你会看到一个名叫JRE的文件夹在里面。JDK中要被牢记的jar文件就是tools.jar,它包含了用于执行java文档的类还有用于类签名的jar包。
 
即时编译器(JIT)
    即时编译器是种特殊的编译器,它通过有效的把字节码变成机器码来提高JVM的效率。JIT这种功效很特殊,因为他把检测到的相似的字节码编译成单一运行的机器码,从而节省了CPU的使用。这和其他的字节码编译器不同,因为他是运行时(第一类执行的编译?)the firs of its kind to perform the compilation(从字节码到机器码)而不是在程序运行之前。正是因为这些,动态编译这个词汇才和JIT有那么紧密的关系。

MVC的各个部分都有那些技术来实现?如何实现?

Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),
View 是应用的表示面(由JSP页面产生),
Controller 是提供应用的处理过程控制(一般是一个Servlet),

RPC 通信和 RMI 区别

1. RPC 不支持对象, 采用http协议
2. RMI支持传输对象。采用tcp/ip 协议
3. RMI只限于JAVA语言,RPC跨语言

什么是 Web Service(Web服务)

WebService是一种跨编程语言和跨操作系统平台的远程调用技术。

XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。
XML+XSD 当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。
SOAP协议 = HTTP协议 + XML数据格式
WSDL:好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 
JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

 Web ServiceWeb Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵
守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。
JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口
。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需

要修改代码。
JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。
WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信
息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将
其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端
点(服务)。
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信
息的轻量级协议。 
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web 
Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供
的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。

web容器是一种服务程序,就是为应用服务器组(如jsp,servlet等)提供一个运行环境,使JSP、servlet直接跟容器中的环境变量接口交互,不必关注其他系统问题。主要有web服务器来实现。

②tomcat、WebLogic,WebSphere等 
一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制

这个是可以的,一个“.java”源文件里面可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一致。
每个编译单元只能有一个public 类。这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。
你可以根据需要,往这个文件里面添加任意多个提供辅助功能的package 权限的类。但是如果这个编译单元里面有两个或两个以上的public 类的话,程序就不知道从哪里导入了,编译器就会报错。

简单说说你了解的类加载器。是否实现过类加载器

加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载   7个部分
1.加载:定位要加载的类文件,并将其字节流装载到JVM中;
2.链接:给要加载的类分配最基本的内存结构保存其信息,比如属性,方法以及引用的类。在该阶段,该类还处于不可用状态;
(1)验证:对加载的字节流进行验证,比如格式上的,安全方面的;
(2)内存分配:为该类准备内存空间来表示其属性,方法以及引用的类;
(3)解析:加载该类所引用的其它类,比如父类,实现的接口等。
3.初始化:对类变量进行赋值。
我前些日子就碰到了这个问题,场景大概是这样子的,我们项目的一个同步模块,需要同时导入不同版本的同名包(其中一个版本的包,使我们自己修改过源代码的,另一个是直接开源的)。我需要用RPC在同一个程序中去连接两个的客户端。重新看了一下ClassLoader的相关知识,利用了JVM 类加载的双亲委派模型,就是那本书里面讲的内容,利用线程的一个参数,自己定义一个类加载器,import一个版本的包,自己定义的类加载器去加载另一个版本的包,是以class文件的格式加载的,然后利用反射得到其中的方法,问题解决。


解释一下什么叫AOP(面向切面编程)

。说白了,就是spring里面 用黑科技 强制插入代码的一种手段。
请简述 Servlet 的生命周期及其相关的方法

①实例化阶段:服务器对Servlet进行实例化,调用Servlet的构造方法
②初始化阶段:服务器调用Servlet的init方法进行初始化(只在第一次请求时调用)。
③请求处理阶段:服务器调用Servlet的service方法,然后根据请求方式调用相应的doXXX方法。
④服务终止阶段:服务器调用Servlet的destroy方法销毁Servlet实例

请简述一下 Ajax 的原理及实现步骤

原理: HTTP协议的异步通信
get 请求
1) 创建一个XMLHttpRequest对象
2) 调用该对象的open方法
3) 如果是get请求,设置回调函数onreadystatechange = callback
4) Send


如果是post 请求


5) 创建一个XMLHttpRequest对象
6) 调用该对象的open方法
7) 调用setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
8) 设置回调函数onreadystatechange = callback
9) Send

简单描述Struts的主要功能


什么是 N 层架构

分而治之的思想在开发中用的很多,用面向对象的思想就是提高内聚,降低耦合。于是有了N层架构

一般都最少包含3层:表示层,业务逻辑层和数据访问层。

什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”

java虚拟机是执行字节码文件(.class)的虚拟机进程。
java源程序(.java)被编译器编译成字节码文件(.class)。然后字节码文件,将由java虚拟机,解释成机器码(不同平台的机器码不同)。利用机器码操作硬件和操作系统


因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码。正是因为有JVM的存在,java被称为平台无关的编程语言

什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配

正则表达式就是用于描述某些规则的工具。这些规则经常用于处理字符串中的查找或替换字符串。换句话说,正则表达式就是记录文本规则的代码。

模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。

 
什么是懒加载(Lazy Loading)

懒加载---即为延迟加载,顾名思义在需要的时候才加载,这样做效率会比较低,但是占用内存低,iOS设备内存资源有限,如果程序启动使用一次性加载的方式可能会耗尽内存,这时可以使用懒加载,先判断是否有,没有再去创建
什么是尾递归,为什么需要尾递归

递归是指函数直接或间接地调用自己。
尾递归是指所有递归形式的调用,一定是发生在函数的末尾。

尾递归和一般的递归不同在对内存的占用,普通递归创建stack累积而后计算收缩,尾递归只会占用恒量的内存


什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)
。它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理

组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。

关键字


finalize


什么是finalize()方法


finalize()方法什么时候被调用


析构函数(finalization)的目的是什么


final 和 finalize 的区别


final


final关键字有哪些用法


final 与 static 关键字可以用于哪里?它们的作用是什么


final, finally, finalize的区别
(1)final:可以作为修饰符修饰变量、方法和类,被final修饰的变量只能一次赋值;被final修饰的方法不能够在子类中被重写(override);被final修饰的类不能够被继承。
 
(2)finally用在异常处理中定义总是执行代码,无论try块中的代码是否引发异常,catch是否匹配成功,finally块中的代码总是被执行,除非JVM被关闭(System.exit(1)),通常用作释放外部资源(不会被垃圾回收器回收的资源)。
 
(3)finalize()方法是Object类中定义的方法,当垃圾回收器将无用对象从内存中清除时,该对象的finalize()方法被调用。由于该方法是protected方法,子类可以通过重写(override)该方法以整理资源或者执行其他的清理工作。

final、finalize 和 finally 的不同之处?


能否在运行时向 static final 类型的赋值


使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变


一个类被声明为final类型,表示了什么意思


throws, throw, try, catch, finally分别代表什么意义


Java 有几种修饰符?分别用来修饰什么

1 public:所有的类都可以访问。
2 private:只有在同一个类中才可以访问。
3 protected:同一个类中、同一个包中、子类中都可以访问
4、包类型的,即默认类型 同一个类中、同一个包中可以访问到


volatile
。volatile 变量可以被看作是一种 “程度较轻的 synchronized”

volatile 修饰符的有过什么实践


volatile 变量是什么?volatile 变量和 atomic 变量有什么不同


volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗

能创建 volatile 数组吗?


transient变量有什么特点

super什么时候使用

public static void 写成 static public void会怎样

说明一下public static void main(String args[])这段声明里每个关键字的作用

请说出作用域public, private, protected, 以及不写时的区别

sizeof 是Java 的关键字吗

static


static class 与 non static class的区别

static 关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法

静态类型有什么特点

main() 方法为什么必须是静态的?能不能声明 main() 方法为非静态
用static修饰的就是静态方法。静态方法不依靠对象而存在。其直接与类有关,只要包含在类中,就可以得到执行,而不一定依附于对象的存在而执行。因此,Main方法作为程序的入口方法,在这之前是不可能有任何对象被建立的,也就在Main之前包括Main自身不可能是非静态方法。所以Main方法一定是静态的,有类就行——从而得到执行,进而有更多静态或非静态方法得到执行。

是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用

静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢

成员方法是否可以访问静态变量?为什么静态方法不能访问成员变量


switch


switch 语句中的表达式可以是什么类型数据

switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上

while 循环和 do 循环有什么不同


操作符


&操作符和&&操作符有什么区别?

a = a + b 与 a += b 的区别?

逻辑操作符 (&,|,^)与条件操作符(&&,||)的区别

3*0.1 == 0.3 将会返回什么?true 还是 false?

float f=3.4; 是否正确?

short s1 = 1; s1 = s1 + 1;有什么错?


数据结构


基础类型(Primitives)


基础类型(Primitives)与封装类型(Wrappers)的区别在哪里

简述九种基本数据类型的大小,以及他们的封装类

int 和 Integer 哪个会占用更多的内存? int 和 Integer 有什么区别?parseInt()函数在什么时候使用到

float和double的默认值是多少

如何去小数四舍五入保留小数点后两位

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


类型转换


怎样将 bytes 转换为 long 类型

怎么将 byte 转换为 String

如何将数值型字符转换为数字

我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象

能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗

类型向下转换是什么


数组


如何权衡是使用无序的数组还是有序的数组

怎么判断数组是 null 还是为空

怎么打印数组? 怎样打印数组中的重复元素

Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList
Array数组可以包含基本类型和对象类型,
ArrayList却只能包含对象类型。
但是需要注意的是:Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。

数组和链表数据结构描述,各自的时间复杂度

数组有没有length()这个方法? String有没有length()这个方法
java中数组有没有length()方法,求数组的长度可以使用数组的length属性。
String 有length()方法,用来求字符串的长度


队列


队列和栈是什么,列出它们的区别
栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。 
队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
1.队列先进先出,栈先进后出。        
2. 对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
3.遍历数据速度不同。队列遍历数据的速度要快得多。

BlockingQueue是什么

简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处。


ArrayList、Vector、LinkedList的存储性能和特性
ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦

LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始

ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢.

Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.

LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快.


arraylist和vector的区别? 
1).同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的 
2).数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半

String
StringBuffer
线程安全,可变字符串

ByteBuffer 与 StringBuffer有什么区别
ByteBuffer类是在Java NIO中常常使用的一个缓冲区类,使用它可以进行高效的IO操作,但是,如果对常用方法的理解有错误,那么就会出现意想不到的bug。

HashMap


HashMap的工作原理是什么
。“你用过HashMap吗?” “什么是HashMap?你为什么用到它?”
  几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而HashTable则不能;HashMap是非synchronized;HashMap很快;以及HashMap储存的是键值对等等。这显示出你已经用过HashMap,而且对它相当的熟悉。但是面试官来个急转直下,从此刻开始问出一些刁钻的问题,关于HashMap的更多基础的细节。面试官可能会问出下面的问题:
  “你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?”
  你也许会回答“我没有详查标准的Java API,你可以看看Java源代码或者Open JDK。”“我可以用Google找到答案。”
  但一些面试者可能可以给出答案,“HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Entry。这一点有助于理解获取对象的逻辑。如果你没有意识到这一点,或者错误的认为仅仅只在bucket中存储值的话,你将不会回答如何从HashMap中获取对象的逻辑。这个答案相当的正确,也显示出面试者确实知道hashing以及HashMap的工作原理。但是这仅仅是故事的开始,当面试官加入一些Java程序员每天要碰到的实际场景的时候,错误的答案频现。下个问题可能是关于HashMap中的碰撞探测(collision detection)以及碰撞的解决方法:
  “当两个对象的hashcode相同会发生什么?” 从这里开始,真正的困惑开始了,一些面试者会回答因为hashcode相同,所以两个对象是相等的,HashMap将会抛出异常,或者不会存储它们。然后面试官可能会提醒他们有equals()和hashCode()两个方法,并告诉他们两个对象就算hashcode相同,但是它们可能并不相等。一些面试者可能就此放弃,而另外一些还能继续挺进,他们回答“因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。”这个答案非常的合理,虽然有很多种处理碰撞的方法,这种方法是最简单的,也正是HashMap的处理方法。但故事还没有完结,面试官会继续问:
  “如果两个键的hashcode相同,你如何获取值对象?” 面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。面试官提醒他如果有两个值对象储存在同一个bucket,他给出答案:将会遍历LinkedList直到找到值对象。面试官会问因为你并没有值对象去比较,你是如何确定确定找到值对象的?除非面试者直到HashMap在LinkedList中存储的是键值对,否则他们不可能回答出这一题。
  其中一些记得这个重要知识点的面试者会说,找到bucket位置之后,会调用keys.equals()方法去找到LinkedList中正确的节点,最终找到要找的值对象。完美的答案!
  许多情况下,面试者会在这个环节中出错,因为他们混淆了hashCode()和equals()方法。因为在此之前hashCode()屡屡出现,而equals()方法仅仅在获取值对象的时候才出现。一些优秀的开发者会指出使用不可变的、声明作final的对象,并且采用合适的equals()和hashCode()方法的话,将会减少碰撞的发生,提高效率。不可变性使得能够缓存不同键的hashcode,这将提高整个获取对象的速度,使用String,Interger这样的wrapper类作为键是非常好的选择。
  如果你认为到这里已经完结了,那么听到下面这个问题的时候,你会大吃一惊。“如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?”除非你真正知道HashMap的工作原理,否则你将回答不出这道题。默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。
  如果你能够回答这道问题,下面的问题来了:“你了解重新调整HashMap大小存在什么问题吗?”你可能回答不上来,这时面试官会提醒你当多线程的情况下,可能产生条件竞争(race condition)。
  当重新调整HashMap大小的时候,确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在LinkedList中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在LinkedList的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了。这个时候,你可以质问面试官,为什么这么奇怪,要在多线程的环境下使用HashMap呢?:)
  热心的读者贡献了更多的关于HashMap的问题:
为什么String, Interger这样的wrapper类适合作为键? String, Interger这样的wrapper类作为HashMap的键是再适合不过了,而且String最为常用。因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。不可变性还有其他的优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的,那么请这么做吧。因为获取对象的时候要用到equals()和hashCode()方法,那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。
我们可以使用自定义的对象作为键吗? 这是前一个问题的延伸。当然你可能使用任何对象作为键,只要它遵守了equals()和hashCode()方法的定义规则,并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。
我们可以使用CocurrentHashMap来代替HashTable吗?这是另外一个很热门的面试题,因为ConcurrentHashMap越来越多人用了。我们知道HashTable是synchronized的,但是ConcurrentHashMap同步性能更好,因为它仅仅根据同步级别对map的一部分进行上锁。ConcurrentHashMap当然可以代替HashTable,但是HashTable提供更强的线程安全性。看看这篇博客查看Hashtable和ConcurrentHashMap的区别。
  我个人很喜欢这个问题,因为这个问题的深度和广度,也不直接的涉及到不同的概念。让我们再来看看这些问题设计哪些知识点:
hashing的概念
HashMap中解决碰撞的方法
equals()和hashCode()的应用,以及它们在HashMap中的重要性
不可变对象的好处
HashMap多线程的条件竞争
重新调整HashMap的大小
  总结
  HashMap的工作原理
  HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。 HashMap在每个LinkedList节点中储存键值对对象。
  当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的LinkedList中。键对象的equals()方法用来找到键值对。
  因为HashMap的好处非常多,我曾经在电子商务的应用中使用HashMap作为缓存。因为金融领域非常多的运用Java,也出于性能的考虑,我们会经常用到HashMap和ConcurrentHashMap。你可以查看更多的关于HashMap和HashTable的文章。

内部的数据结构是什么

HashMap 的 table的容量如何确定?loadFactor 是什么? 该容量如何变化?这种变化会带来什么问题?

HashMap 实现的数据结构是什么?如何实现

HashMap 和 HashTable、ConcurrentHashMap 的区别

HashMap的遍历方式及效率

HashMap、LinkedMap、TreeMap的区别

如何决定选用HashMap还是TreeMap

如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办

HashMap 是线程安全的吗?并发下使用的 Map 是什么,它们内部原理分别是什么,比如存储方式、 hashcode、扩容、 默认容量等


HashSet


HashSet和TreeSet有什么区别

相同点:

单列集合,元素不可重复

不同点

1. 底层存储的数据结构不同

    HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储

2.存储时保证数据唯一性依据不同

   HashSet是通过复写hashCode()方法和equals()方法来保证的,而HashSet通过Compareable接口的compareTo()方法来保证的

3.有序性不一样

 HashSet无序,TreeSet有序

 存储原理:

   HashSet:底层数据结构是哈希表,本质就是对哈希值的存储,通过判断元素的hashCode方法和equals方法来保证元素的唯一性,当hashCode值不相同,就直接存储了,不用在判断equals了,当hashCode值相同时,会在判断一次euqals方法的返回值是否为true,如果为true则视为用一个元素,不用存储,如果为false,这些相同哈希值不同内容的元素都存放一个桶里(当哈希表中有一个桶结构,每一个桶都有一个哈希值)
  TreeSet:底层的数据结构是二叉树,可以对Set集合中的元素进行排序,这种结构,可以提高排序性能, 根据比较方法的返回值确定的,只要返回的是0.就代表元素重复

HashSet 内部是如何工作的

WeakHashMap 是怎么工作的?


Set


Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()? 它们有何区别?
根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,
也就出现了重复元素。所以应该用equals()来判断。

TreeMap:TreeMap 是采用什么树实现的?TreeMap、HashMap、LindedHashMap的区别。TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

TreeSet:一个已经构建好的 TreeSet,怎么完成倒排序。

EnumSet 是什么


Hash算法


Hashcode 的作用

简述一致性 Hash 算法

有没有可能 两个不相等的对象有相同的 hashcode?当两个对象 hashcode 相同怎么办?如何获取值对象

为什么在重写 equals 方法的时候需要重写 hashCode 方法?equals与 hashCode 的异同点在哪里

a.hashCode() 有什么用?与 a.equals(b) 有什么关系

hashCode() 和 equals() 方法的重要性体现在什么地方

Object:Object有哪些公用方法?Object类hashcode,equals 设计原则? sun为什么这么设计?Object类的概述

如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。

可以在 hashcode() 中使用随机数字吗?


LinkedHashMap


LinkedHashMap 和 PriorityQueue 的区别是什么


List


List, Set, Map三个接口,存取元素时各有什么特点
List与Set都是单列元素的集合,它们有一个功共同的父接口Collection。


Set里面不允许有重复的元素,


存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。


取元素:没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。


 


List表示有先后顺序的集合,


存元素:多次调用add(Object)方法时,每次加入的对象按先来后到的顺序排序,也可以插队,即调用add(int index,Object)方法,就可以指定当前对象在集合中的存放位置。


取元素:方法1:Iterator接口取得所有,逐一遍历各个元素


        方法2:调用get(index i)来明确说明取第几个。


 


Map是双列的集合,存放用put方法:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。


取元素:用get(Object key)方法根据key获得相应的value。


        也可以获得所有的key的集合,还可以获得所有的value的集合,


        还可以获得key和value组合成的Map.Entry对象的集合。


 


List以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

List, Set, Map 是否继承自 Collection 接口

遍历一个 List 有哪些不同的方式


LinkedList


LinkedList 是单向链表还是双向链表
双链表

LinkedList 与 ArrayList 有什么区别

描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么?

插入数据时,ArrayList, LinkedList, Vector谁速度较快?


ArrayList


ArrayList 和 HashMap 的默认大小是多数

ArrayList 和 LinkedList 的区别,什么时候用 ArrayList?

ArrayList 和 Set 的区别?

ArrayList, LinkedList, Vector的区别

ArrayList是如何实现的,ArrayList 和 LinkedList 的区别

ArrayList如何实现扩容

Array 和 ArrayList 有何区别?什么时候更适合用Array

说出ArraList,Vector, LinkedList的存储性能和特性


Map


Map, Set, List, Queue, Stack
Map
Map是键值对,键Key是唯一不能重复的,一个键对应一个值,值可以重复。 
TreeMap可以保证顺序,HashMap不保证顺序,即为无序的。 
Map中可以将Key和Value单独抽取出来,其中KeySet()方法可以将所有的keys抽取正一个Set。而Values()方法可以将map中所有的values抽取成一个集合。


Set
不包含重复元素的集合,set中最多包含一个null元素 
只能用Lterator实现单项遍历,Set中没有同步方法。


List
有序的可重复集合。 
可以在任意位置增加删除元素。 
用Iterator实现单向遍历,也可用ListIterator实现双向遍历


Queue
Queue遵从先进先出原则。 
使用时尽量避免add()和remove()方法,而是使用offer()来添加元素,使用poll()来移除元素,它的优点是可以通过返回值来判断是否成功。 
LinkedList实现了Queue接口。 
Queue通常不允许插入null元素。


Stack 
Stack遵从后进先出原则。 
Stack继承自Vector。 
它通过五个操作对类Vector进行扩展,允许将向量视为堆栈,它提供了通常的push和pop操作,以及取堆栈顶点的peek()方法、测试堆栈是否为空的empty方法等


用法


如果涉及堆栈,队列等操作,建议使用List 
对于快速插入和删除元素的,建议使用LinkedList 
如果需要快速随机访问元素的,建议使用ArrayList

Map 接口提供了哪些不同的集合视图

为什么 Map 接口不继承 Collection 接口


Collections


介绍Java中的Collection FrameWork。集合类框架的基本接口有哪些

Collections类是什么?Collection 和 Collections的区别?Collection、Map的实现

集合类框架的最佳实践有哪些

为什么 Collection 不从 Cloneable 和 Serializable 接口继承

说出几点 Java 中使用 Collections 的最佳实践?

Collections 中 遗留类 (HashTable、Vector) 和 现有类的区别


什么是 B+树,B-树,列出实际的使用场景。

接口


Comparator 与 Comparable 接口是干什么的?列出它们的区别


对象


拷贝(clone)


如何实现对象克隆

深拷贝和浅拷贝区别

浅拷贝是指在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝,

没有对引用指向的对象进行拷贝。

而深拷贝是指在拷贝对象时,同时会对引用指向的对象进行拷贝。

区别就在于是否对  对象中的引用变量所指向的对象进行拷贝。


深拷贝和浅拷贝如何实现激活机制

写clone()方法时,通常都有一行代码,是什么


比较


在比较对象时,”==” 运算符和 equals 运算有何区别

如果要重写一个对象的equals方法,还要考虑什么

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对


构造器


构造器链是什么

创建对象时构造器的调用顺序


不可变对象


什么是不可变象(immutable object)

为什么 Java 中的 String 是不可变的(Immutable)

如何构建不可变的类结构?关键点在哪里

能创建一个包含可变对象的不可变对象吗


如何对一组对象进行排序


方法


构造器(constructor)是否可被重写(override)

方法可以同时即是 static 又是 synchronized 的吗

abstract 的 method是否可同时是 static,是否可同时是 native,是否可同时是synchronized

Java支持哪种参数传递类型

一个对象被当作参数传递到一个方法,是值传递还是引用传递

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递

我们能否重载main()方法

如果main方法被声明为private会怎样


GC


概念


GC是什么?为什么要有GC

什么时候会导致垃圾回收

GC是怎么样运行的

新老以及永久区是什么

GC 有几种方式?怎么配置

什么时候一个对象会被GC? 如何判断一个对象是否存活

System.gc() Runtime.gc()会做什么事情? 能保证 GC 执行吗

垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

Minor GC 、Major GC、Young GC 与 Full GC分别在什么时候发生

垃圾回收算法的实现原理

如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

垃圾回收的最佳做法是什么


GC收集器有哪些


垃圾回收器的基本原理是什么?

串行(serial)收集器和吞吐量(throughput)收集器的区别是什么

Serial 与 Parallel GC之间的不同之处

CMS 收集器 与 G1 收集器的特点与区别

CMS垃圾回收器的工作过程

JVM 中一次完整的 GC 流程是怎样的? 对象如何晋升到老年代

吞吐量优先和响应优先的垃圾收集器选择


GC策略


举个实际的场景,选择一个GC策略

JVM的永久代中会发生垃圾回收吗


收集方法


标记清除、标记整理、复制算法的原理与特点?分别用在什么地方

如果让你优化收集方法,有什么思路


JVM


参数


说说你知道的几种主要的jvm 参数

-XX:+UseCompressedOops 有什么作用


类加载器(ClassLoader)


Java 类加载器都有哪些

JVM如何加载字节码文件


内存管理


JVM内存分哪几个区,每个区的作用是什么

1、程序计数器(寄存器)           

            当前线程所执行的字节码行号指示器

            字节码解释器工作依赖计数器控制完成

            通过执行线程行号记录,让线程轮流切换各条线程之间计数器互不影响

            线程私有,生命周期与线程相同,随JVM启动而生,JVM关闭而死

            线程执行Java方法时,记录其正在执行的虚拟机字节码指令地址

            线程执行Nativan方法时,计数器记录为空(Undefined)

            唯一在Java虚拟机规范中没有规定任何OutOfMemoryError情况区域

        在这其中,很多不理解的没关系,我们学过多线程,有两个线程,其中一个线程可以暂停使用,让其他线程运行,然后等自己获得cpu资源时,又能从暂停的地方开始运行,那么为什么能够记住暂停的位置的,这就依靠了程序计数器, 通过这个例子,大概了解一下程序计数器的功能。

 

      2、本地方法栈

            不知道大家看过源码没有,看过的都应该知道,很多的算法或者一个功能的实现,都被java封装到了本地方法中,程序直接通过调用本地的方法就行了,本地方法栈就是用来存放这种方法的,实现该功能的代码可能是C也可能是C++,反正不一定就是java实现的。

 

      上面两个不是我们所要学习的重点,接下来三个才是重点。

 

      3、虚拟机栈

          这个大家都应该有所了解,现在来细讲它,虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用来存放存储局部变量表、操作数表、动态连接、方法出口等信息,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。    这个话怎么理解呢?比如执行一个类(类中有main方法)时,执行到main方法,就会把为main方法创建一个栈帧,然后在加到虚拟机栈中,栈帧中会存放这main方法中的各种局部变量,对象引用等东西。如图

                    

          当在main方法中调用别的方法时,就会有另一个方法的栈帧入虚拟机栈,当该方法调用完了之后,弹栈,然后main方法处于栈顶,就继续执行,直到结束,然后main方法栈帧也弹栈,程序就结束了。总之虚拟机栈中就是有很多个栈帧的入栈出栈,栈帧中存放的都市一些变量名等东西,所以我们平常说栈中存放的是一些局部变量,因为局部变量就是在方法中。也就是在栈帧中,就是这样说过来的。

 

        以上说的三个都是线程不共享的,也就是这部分内存,每个线程独有,不会让别的线程访问到,接下来的两个就是线程共享了,也就会出现线程安全问题。

 

     4、堆

        所有线程共享的一块内存区域。Java虚拟机所管理的内存中最大的一块,因为该内存区域的唯一目的就是存放对象实例。几乎所有的对象实例度在这里分配内存,也就是通常我们说的new对象,该对象就会在堆中开辟一块内存来存放对象中的一些信息,比如属性呀什么的。同时堆也是垃圾收集器管理的主要区域。因此很多时候被称为"GC堆",虚拟机的垃圾回收机制等下一篇文章来讲解。 在上一点讲的栈中存放的局部引用变量所指向的大多数度会在堆中存放。

 

    5、方法区和其中的运行时常量池

        和堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、和编译器编译后的代码(也就是存储字节码文件。.class)等数据,这里可以看到常量也会在方法区中,是因为方法区中有一个运行时常量池,为什么叫运行时常量池,因为在编译后期生成的是各种字面量(字面量的意思就是值,比如int i=3,这个3就是字面量的意思)和符号引用,这些是存放在一个叫做常量池(这个常量池是在字节码文件中)的地方,当类加载进入方法区时,就会把该常量池中的内容放入运行时常量池中。这里要注意,运行时常量池和常量池,不要搞混淆了,字节码文件中也有常量池,在后面的章节会详细讲解这个东西。现在只需要知道方法区中有一个运行时常量池,就是用来存放常量的。还有一点,运行时常量池不一定就一定要从字节码常量池中拿取常量,可能在程序运行期间将新的常量放入池中,比如String.intern()方法,这个方法的作用就是:先从方法区的运行时常量池中查找看是否有该值,如果有,则返回该值的引用,如果没有,那么就会将该值加入运行时常量池中。

        


一个对象从创建到销毁都是怎么在这些部分里存活和转移的

解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法


JVM中哪个参数是用来控制线程的栈堆栈小

简述内存分配与回收策略

简述重排序,内存屏障,happen-before,主内存,工作内存

Java中存在内存泄漏问题吗?请举例说明
。内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的


 


java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。


 


2.如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。


 


3.当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露。

简述 Java 中软引用(SoftReferenc)、弱引用(WeakReference)和虚引用


内存映射缓存区是什么


jstack,jstat,jmap,jconsole怎么用

32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?32 位和 64 位的 JVM,int 类型变量的长度是多数?

怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位

JVM自身会维护缓存吗?是不是在堆中进行对象分配,操作系统的堆还是JVM自己管理堆

什么情况下会发生栈内存溢出
栈溢出有两种,一种是stackoverflow,另一种是outofmemory,前者一般是因为方法递归没终止条件,后者一般是方法中线程启动过多。

双亲委派模型是什么
。双亲委派模型要求除顶层启动类加载器外其余类加载器都应该有自己的父类加载器;类加载器之间通过复用关系来复用父加载器的代码。

多线程


基本概念


什么是线程

多线程的优点


多线程的几种实现方式

用 Runnable 还是 Thread
。Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。

什么是线程安全
线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步

Vector, SimpleDateFormat 是线程安全类吗

什么 Java 原型不是线程安全的

哪些集合类是线程安全的


多线程中的忙循环是什么

如何创建一个线程

编写多线程程序有几种实现方式

什么是线程局部变量

线程和进程有什么区别?进程间如何通讯,线程间如何通讯

什么是多线程环境下的伪共享(false sharing)

同步和异步有何异同,在什么情况下分别使用他们?举例说明


Current


ConcurrentHashMap 和 Hashtable的区别

ArrayBlockingQueue, CountDownLatch的用法


ConcurrentHashMap的并发度是什么


CyclicBarrier 和 CountDownLatch有什么不同?各自的内部原理和用法是什么

Semaphore的用法

Thread


启动一个线程是调用 run() 还是 start() 方法?start() 和 run() 方法有什么区别

调用start()方法时会执行run()方法,为什么不能直接调用run()方法

sleep() 方法和对象的 wait() 方法都可以让线程暂停执行,它们有什么区别


yield方法有什么作用?sleep() 方法和 yield() 方法有什么区别

Java 中如何停止一个线程

stop() 和 suspend() 方法为何不推荐使用

如何在两个线程间共享数据

如何强制启动一个线程

如何让正在运行的线程暂停一段时间

什么是线程组,为什么在Java中不推荐使用

你是如何调用 wait(方法的)?使用 if 块还是循环?为什么


生命周期


有哪些不同的线程生命周期

线程状态,BLOCKED 和 WAITING 有什么区别

画一个线程的生命周期状态图


ThreadLocal 用途是什么,原理是什么,用的时候要注意什么

ThreadPool


线程池是什么?为什么要使用它

如何创建一个Java线程池

ThreadPool用法与优势

提交任务时,线程池队列已满时会发会生什么

newCache 和 newFixed 有什么区别?简述原理。构造函数的各个参数的含义是什么,比如 coreSize, maxsize 等

线程池的实现策略

线程池的关闭方式有几种,各自的区别是什么

线程池中submit() 和 execute()方法有什么区别?


线程调度


Java中用到的线程调度算法是什么

什么是多线程中的上下文切换

你对线程优先级的理解是什么

什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing)


线程同步


请说出你所知的线程同步的方法

synchronized 的原理是什么

synchronized 和 ReentrantLock 有什么不同

什么场景下可以使用 volatile 替换 synchronized

有T1,T2,T3三个线程,怎么确保它们按顺序执行?怎样保证T2在T1执行完后执行,T3在T2执行完后执行

同步块内的线程抛出异常会发生什么

当一个线程进入一个对象的 synchronized 方法A 之后,其它线程是否可进入此对象的 synchronized 方法B

使用 synchronized 修饰静态方法和非静态方法有什么区别

如何从给定集合那里创建一个 synchronized 的集合





Java Concurrency API 中 的 Lock 接口是什么?对比同步它有什么优势

Lock 与 Synchronized 的区别?Lock 接口比 synchronized 块的优势是什么
。在并发量比较小的情况下,使用synchronized是个不错的选择,但是在并发量比较高的情况下,其性能下降很严重,此时ReentrantLock是个不错的方案。

1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;

  2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;

  3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;

  4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

  5)Lock可以提高多个线程进行读操作的效率。

  在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。


ReadWriteLock是什么?

锁机制有什么用

什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题

解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁

什么时候应该使用可重入锁

简述锁的等级方法锁、对象锁、类锁

Java中活锁和死锁有什么区别?

什么是死锁(Deadlock)?导致线程死锁的原因?如何确保 N 个线程可以访问 N 个资源同时又不导致死锁

死锁与活锁的区别,死锁与饥饿的区别

怎么检测一个线程是否拥有锁

如何实现分布式锁

有哪些无锁数据结构,他们实现的原理是什么


读写锁可以用于什么应用场景


Executors类是什么? Executor和Executors的区别

什么是Java线程转储(Thread Dump),如何得到它

如何在Java中获取线程堆栈

说出 3 条在 Java 中使用线程的最佳实践

在线程中你怎么处理不可捕捉异常

实际项目中使用多线程举例。你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的

请说出与线程同步以及线程调度相关的方法

程序中有3个 socket,需要多少个线程来处理

假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到

如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长

如何确保 main() 方法所在的线程是 Java 程序最后结束的线程

非常多个线程(可能是不同机器),相互之间需要等待协调才能完成某种工作,问怎么设计这种协调方案

你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它


异常


基本概念


Error 和 Exception有什么区别

UnsupportedOperationException是什么

NullPointerException 和 ArrayIndexOutOfBoundException 之间有什么相同之处


什么是受检查的异常,什么是运行时异常

运行时异常与一般异常有何异同

简述一个你最常见到的runtime exception(运行时异常)


finally


finally关键词在异常处理中如何使用

如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗

try里有return,finally还执行么?那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后

在什么情况下,finally语句不会执行


throw 和 throws 有什么区别?

OOM你遇到过哪些情况?你是怎么搞定的?

SOF你遇到过哪些情况?

既然我们可以用RuntimeException来处理错误,那么你认为为什么Java中还存在检查型异常

当自己创建异常类的时候应该注意什么

导致空指针异常的原因

异常处理 handle or declare 原则应该如何理解

怎么利用 JUnit 来测试一个方法的异常

catch块里别不写代码有什么问题

你曾经自定义实现过异常吗?怎么写的

什么是 异常链

在try块中可以抛出异常吗


JDBC


通过 JDBC 连接数据库有哪几种方式

阐述 JDBC 操作数据库的基本步骤

JDBC 中如何进行事务处理

什么是 JdbcTemplate

什么是 DAO 模块

使用 JDBC 操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能

列出 5 个应该遵循的 JDBC 最佳实践


IO


File


File类型中定义了什么方法来创建一级目录

File类型中定义了什么方法来判断一个文件是否存在





为了提高读写性能,可以采用什么流

Java中有几种类型的流

JDK 为每种类型的流提供了一些抽象类以供继承,分别是哪些类

对文本文件操作用什么I/O流

对各种基本数据类型和String类型的读写,采用什么流

能指定字符编码的 I/O 流类型是什么


序列化


什么是序列化?如何实现 Java 序列化及注意事项
。序列化是将对象状态转换为可保持或传输的格式的过程。说明白点就是你可以用对象输出流输出到文件.如果不序列化输出的话.很可能会乱!


 实现方式是实现java.io.Serializable接口.这个接口不需要实现任何具体方法.只要implements java.io.Serializable 就好了

Serializable 与 Externalizable 的区别
。实现serializable,这个确确实实就是一个可以序列化的标示,对serializable进行implements之后,我们不用实现任何的功能,但是如果选择用externalizable,则需要进行实现它其中的接口,那么这其中的工作都将是程序员的.
但是serializable是虚拟机内建的,那么必然是占用大多的资源,导致速度减慢.而externalizable则是由程序员决定,存储什么,那么性能就要比serializable好多了.


Socket


socket 选项 TCP NO DELAY 是指什么

Socket 工作在 TCP/IP 协议栈是哪一层

TCP、UDP 区别及 Java 实现方式


说几点 IO 的最佳实践

直接缓冲区与非直接缓冲器有什么区别?

怎么读写 ByteBuffer?ByteBuffer 中的字节序是什么

当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少

如何使用扫描器类(Scanner Class)令牌化


面向对象编程(OOP)


解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)

多态的实现原理

封装、继承和多态是什么

对象封装的原则是什么?



获得一个类的类对象有哪些方式

重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

说出几条 Java 中方法重载的最佳实践


抽象类
抽象类和接口的区别

抽象类中是否可以有静态的main方法

抽象类是否可实现(implements)接口


抽象类是否可继承具体类(concrete class)


匿名类(Anonymous Inner Class)

匿名内部类是否可以继承其它类?是否可以实现接口


内部类
内部类分为几种

内部类可以引用它的包含类(外部类)的成员吗

请说一下 Java 中为什么要引入内部类?还有匿名内部类


继承
继承(Inheritance)与聚合(Aggregation)的区别在哪里

继承和组合之间有什么不同

为什么类只能单继承,接口可以多继承

存在两个类,B 继承 A,C 继承 B,能将 B 转换为 C 么?如 C = (C) B

如果类 a 继承类 b,实现接口c,而类 b 和接口 c 中定义了同名变量,请问会出现什么问题


接口

接口是什么

接口是否可继承接口

为什么要使用接口而不是直接使用具体类?接口有什么优点


泛型


泛型的存在是用来解决什么问题

泛型的常用特点

List能否转为List


工具类


日历


Calendar Class的用途

如何在Java中获取日历类的实例

解释一些日历类中的重要方法

GregorianCalendar 类是什么

SimpleTimeZone 类是什么

Locale类是什么

如何格式化日期对象

如何添加小时(hour)到一个日期对象(Date Objects)

如何将字符串 YYYYMMDD 转换为日期


Math


Math.round()什么作用?Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?


XML


XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?DOM 和 SAX 解析器有什么不同?

Java解析XML的方式

用 jdom 解析 xml 文件时如何解决中文问题?如何解析

你在项目中用到了 XML 技术的哪些方面?如何实现


动态代理


描述动态代理的几种实现方式,分别说出相应的优缺点


设计模式


什么是设计模式(Design Patterns)?你用过哪种设计模式?用在什么场合

你知道哪些商业级设计模式?

哪些设计模式可以增加系统的可扩展性


单例模式
除了单例模式,你在生产环境中还用过什么设计模式?

写 Singleton 单例模式

单例模式的双检锁是什么

如何创建线程安全的 Singleton


什么是类的单例模式


写出三种单例模式实现


适配器模式

适配器模式是什么?什么时候使用

适配器模式和代理模式之前有什么不同

适配器模式和装饰器模式有什么区别


什么时候使用享元模式

什么时候使用组合模式

什么时候使用访问者模式

什么是模板方法模式

请给出1个符合开闭原则的设计模式的例子


开放问题


用一句话概括 Web 编程的特点

Google是如何在一秒内把搜索结果返回给用户

哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入

树(二叉或其他)形成许多普通数据结构的基础。请描述一些这样的数据结构以及何时可以使用它们

某一项功能如何设计

线上系统突然变得异常缓慢,你如何查找问题

什么样的项目不适合用框架

新浪微博是如何实现把微博推给订阅者

简要介绍下从浏览器输入 URL 开始到获取到请求界面之后 Java Web 应用中发生了什么

请你谈谈SSH整合

高并发下,如何做到安全的修改同一行数据

12306网站的订票系统如何实现,如何保证不会票不被超卖

网站性能优化如何优化的

聊了下曾经参与设计的服务器架构

请思考一个方案,实现分布式环境下的 countDownLatch

请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存

在你的职业生涯中,算得上最困难的技术挑战是什么

如何写一篇设计文档,目录是什么

大写的O是什么?举几个例子

编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用

解释一下网络应用的模式及其特点

设计一个在线文档系统,文档可以被编辑,如何防止多人同时对同一份文档进行编辑更新

说出数据连接池的工作机制是什么

怎么获取一个文件中单词出现的最高频率

描述一下你最常用的编程风格

如果有机会重新设计你们的产品,你会怎么做

如何搭建一个高可用系统

如何启动时不需输入用户名与密码

如何在基于Java的Web项目中实现文件上传和下载

如何实现一个秒杀系统,保证只有几位用户能买到某件商品。

如何实现负载均衡,有哪些算法可以实现

如何设计一个购物车?想想淘宝的购物车如何实现的

如何设计一套高并发支付方案,架构如何设计

如何设计建立和保持 100w 的长连接

如何避免浏览器缓存。

如何防止缓存雪崩

如果AB两个系统互相依赖,如何解除依

如果有人恶意创建非法连接,怎么解决

如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能

如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)

如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现

如果让你实现一个并发安全的链表,你会怎么做

应用服务器与WEB 服务器的区别?应用服务器怎么监控性能,各种方式的区别?你使用过的应用服务器优化技术有哪些

大型网站在架构上应当考虑哪些问题

有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的

最近看什么书,印象最深刻的是什么

描述下常用的重构技巧

你使用什么版本管理工具?分支(Branch)与标签(Tag)之间的区别在哪里

你有了解过存在哪些反模式(Anti-Patterns)吗

你用过的网站前端优化的技术有哪些

如何分析Thread dump

你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念

你是如何处理内存泄露或者栈溢出问题的

你们线上应用的 JVM 参数有哪些

怎么提升系统的QPS和吞吐量


知识面


解释什么是 MESI 协议(缓存一致性)

谈谈 reactor 模型

Java 9 带来了怎样的新功能

Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用

简单讲讲 Tomcat 结构,以及其类加载器流程

虚拟内存是什么

阐述下 SOLID 原则

请简要讲一下你对测试驱动开发(TDD)的认识

CDN实现原理
Maven 和 ANT 有什么区别

UML中有哪些常用的图


Linux
Linux 下 IO 模型有几种,各自的含义是什么。

Linux 系统下你关注过哪些内核参数,说说你知道的

Linux 下用一行命令查看文件的最后五行

平时用到哪些 Linux 命令

用一行命令输出正在运行的 Java 进程

使用什么命令来确定是否有 Tomcat 实例运行在机器上


什么是 N+1 难题

什么是 paxos 算法

什么是 restful,讲讲你理解的 restful

什么是 zab 协议

什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别

什么是领域驱动开发(Domain Driven Development)

介绍一下了解的 Java 领域的 Web Service 框架

Web Server、Web Container 与 Application Server 的区别是什么

微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里

描述 Cookie 和 Session 的作用,区别和各自的应用范围,Session工作原理

你常用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具有哪些

简述下数据库正则化(Normalizations)

KISS,DRY,YAGNI 等原则是什么含义

分布式事务的原理,优缺点,如何使用分布式事务?

布式集群下如何做到唯一序列号


网络
HTTPS 的加密方式是什么,讲讲整个加密解密流程

HTTPS和HTTP的区别

HTTP连接池实现原理

HTTP集群方案

Nginx、lighttpd、Apache三大主流 Web服务器的区别


是否看过框架的一些代码

持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些

数值提升是什么

你能解释一下里氏替换原则吗

你是如何测试一个应用的?知道哪些测试框架

传输层常见编程协议有哪些?并说出各自的特点


编程题


计算加班费


加班10小时以下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工作26天,一天正常工作8小时)


计算1000月薪,加班9小时的加班费
计算2500月薪,加班11小时的加班费
计算1000月薪,加班15小时的加班费


卖东西


一家商场有红苹果和青苹果出售。(红苹果5元/个,青苹果4元/个)。


模拟一个进货。红苹果跟青苹果各进200个。
模拟一个出售。红苹果跟青苹果各买出10个。每卖出一个苹果需要进行统计。


提示:一个苹果是一个单独的实体。


日期提取


有这样一个时间字符串:2008-8-8 20:08:08 , 请编写能够匹配它的正则表达式,并编写Java代码将日期后面的时分秒提取出来,即:20:08:08


线程


8设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
用Java写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出
wait-notify 写一段代码来解决生产者-消费者问题


数字


判断101-200之间有多少个素数,并输出所有素数
用最有效率的方法算出2乘以17等于多少
有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优
2 亿个随机生成的无序整数,找出中间大小的值
10 亿个数字里里面找最小的 10 个
1到1亿的自然数,求所有数的拆分后的数字之和,如286 拆分成2、8、6,如1到11拆分后的数字之和 => 1 + … + 9 + 1 + 0 + 1 + 1
一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数
一个数组中所有的元素都出现了三次,只有一个元素出现了一次找到这个元素
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
求100-1000内质数的和
求1到100的和的平均数
求s=a+a+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 求出1到100的和


算出1到40的质数,放进数组里
显示放组里的数
找出第[5]个数
删除第[9]个数,再显示删除后的第[9]个


有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。
有一组数1.1.2.3.5.8.13.21.34。写出程序随便输入一个数就能给出和前一组数字同规律的头5个数
计算指定数字的阶乘
开发 Fizz Buzz
给定一个包含 N 个整数的数组,找出丢失的整数
一个排好序的数组,找出两数之和为m的所有组合
将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方
原地交换两个变量的值
找出4字节整数的中位数
找到整数的平方根
实现斐波那契


网络


用Java Socket编程,读服务器几个字符,再写入本地显示


反射


反射机制提供了什么功能?
反射是如何实现的
哪里用到反射机制
反射中 Class.forName 和 ClassLoader 区别
反射创建类实例的三种方式是什么
如何通过反射调用对象的方法
如何通过反射获取和设置对象私有字段的值
反射机制的优缺点


数据库


写一段 JDBC 连Oracle的程序,并实现数据查询


算法


50个人围坐一圈,当数到三或者三的倍数出圈,问剩下的人是谁,原来的位置是多少
实现一个电梯模拟器用
写一个冒泡排序
写一个折半查找
随机产生20个不能重复的字符并排序
写一个函数,传入 2 个有序的整数数组,返回一个有序的整数数组
写一段代码在遍历 ArrayList 时移除一个元素
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少
约瑟芬环游戏


正则


请编写一段匹配IP地址的正则表达式
写出一个正则表达式来判断一个字符串是否是一个数字


字符串


写一个方法,入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
写一个程序找出所有字符串的组合,并检查它们是否是回文串
写一个字符串反转函数,输入abcde转换成edcba代码
小游戏,倒转句子中的单词
将GB2312编码的字符串转换为ISO-8859-1编码的字符串
请写一段代码来计算给定文本内字符“A”的个数。分别用迭代和递归两种方式
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”
给定 2 个包含单词列表(每行一个)的文件,编程列出交集
打印出一个字符串的所有排列
将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七)
在Web应用开发过程中经常遇到输出某种编码的字符,如从 GBK 到 ISO8859-1等,如何输出一个某种编码的字符串