- JDK1.7、1.8新增的功能
- 字符流和字节流的区别,使用场景,相关类 ==>>> ==>>>
- 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
- 字节流默认不使用缓冲区;字符流使用缓冲区。
- 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
- 线程安全的概念,实现线程安全的几种方法 ==>>>
实现线程安全总结来说存在四种方法:1. 使用ThreadLocal----主要用于数据的传递2. synchronized----JVm来实现的3. lock----cpu的硬件指令4. 使用Atomic类型----使用CPU的指令来实现5. 并发包中读写分离CopyOnWriteArrayList等...6 ......
- 抽象类和接口的区别,使用场景 ==>>> ==>>> ==>>> ==>>>
2.抽象类中可以有普通成员变量,接口中没有普通成员变量!!!!!!!(注意重点在 普通 即 非静态 和 变量!!!!)
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法(static),接口中不能包含静态方法.
6. 抽象类和接口中都可以包含静态成员变量(static),抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
- hash算法的实现原理,hashcode的实现原理 ==>>> ==>>> ==>>>
- error和exception的区别,RuntimeException和非RuntimeException的区别 ==>>> ==>>> ==>>>
Throwable包含了错误(Error)和异常(Excetion两类)Exception又包含了运行时异常(RuntimeException, 又叫非检查异常)和非运行时异常(又叫检查异常)(1) Error是程序无法处理了, 如果OutOfMemoryError、OutOfMemoryError等等, 这些异常发生时, java虚拟机一般会终止线程 .(2) 运行时异常都是RuntimeException类及其子类,如 NullPointerException、IndexOutOfBoundsException等, 这些异常是不检查的异常, 是在程序运行的时候可能会发生的, 所以程序可以捕捉, 也可以不捕捉. 这些错误一般是由程序的逻辑错误引起的, 程序应该从逻辑角度去尽量避免.(3) 检查异常是运行时异常以外的异常, 也是Exception及其子类, 这些异常从程序的角度来说是必须经过捕捉检查处理的, 否则不能通过编译. 如IOException、SQLException等
- 继承与组合的区别,使用场景 ==>>> ==>>> ==>>>
继承是“is a”,组合是“like a”
组合关系是:
局部类和整体类的关系
包括 :从整体类到局部类的分解过程,从局部类到整体类的组合过程
继承关系
父类和子类的关系
包括:从子类到父类的抽象过程,从父类到子类的扩展过程 - 使用静态工厂方法的好处和坏处 ==>>>
- 排序算法,他们是时间复杂度是多少 ==>>>
- 数据库设计原则、范式 ==>>> ==>>>
- 数据库常用的编码方式有哪几种 以mysql为例,常用的编码方式有utf8;gbk;gb2312;latin1,对应的Java中的编码为UTF-8;GBK;GB2312;ISO-8859-1;
- 如果有10万条学生成绩信息,怎么获取成绩最高的那一条数据,怎么获取成绩第三的那一条数据,列举你认为性能最好的方式 ==>>>
- 序列化的作用,应用场景,除了网路传输 ==>>>
作用:为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来,Java提供这种“序列化”保存对象状态的机制。
使用场景:内存中的对象状态保存到一个文件中或者数据库中时候;用套接字在网络上传送对象的时候;通过RMI传输对象的时候。
- spring的IOC、AOP的使用场景 ==>>>
- ajax是否能跨域请求,解决的办法 ==>>> ==>>>
ajax不能跨域请求,由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。解决方式有两种:1 采用JSONP,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问;2 iframe的方式,通过设置document.domain来实现。 - 解析xml的几种方法,他们的原理 ==>>> ==>>> ==>>>
1.DOM(Document Object Model)它把整个XML文档当成一个对象加载到内 存,不管文档有多大。它一般处理小文件
2.SAX(Simple API for XML)它的处理过程像流媒体。它不会把整个文档加载到内存,它是读一点处理一点。一般用它处理比较大的文件
3.JDOM包含了前两种方式
4.DOM4J也包含了前两种方式
其中DOM和SAX都是java的标准,也就是java本身就提供标准的API,不需要下载其他包,但是它的API都是一些底层的实现,不是很好用。所以有人在它们的基础上封装了一下,就有了DOM4j和JDOM。DOM4J性能最好,连SUN的JAXM也在用DOM4J.Hibernate也用DOM4J,DOM4J对Xpath也有很好的支持
- 怎么样实现高性能的代码
- 如果有和其他系统有接口调用,但其他系统还没开发完成,怎么进行单元测试 ==>>>
采用Mock测试,Mock对象也就是真实对象在调试期的替代品。什么时候需要Mock对象:
1.真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)
2.真实对象很难被创建(比如具体的web容器)
3.真实对象的某些行为很难触发(比如网络错误)
4.真实情况令程序的运行速度很慢
5.真实对象有用户界面
6.测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)
7.真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题) - 防止重复提交有哪几种方式 (这个网上很多,可以google下) ==>>> ==>>>
1.禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了
2.在提交后执行页面重定向
3. 在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。
如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。
- 怎么样运用样式设计一个DIV浮出层 ==>>>
- 数据库连接池的实现原理,请求怎么样去获取连接,关闭连接时,连接池是销毁连接还是回收连接 ==>>>
连接池在初始化的时候,生成多个可用的Connection存放在List中,当DAO获取连接时,关闭连接时,连接被回收 - tomcat、weblogic、jboss的区别,容器的作用 ==>>>
- apache是容器么,它的作用是什么 ==>>>
- 内部跳转和外部跳转的区别,底层实现原理 ==>>>
- http和https的区别 ==>>>
http是超文本传输协议,明文传输信息,https 则是具有安全性的SSL加密传输协议,要比http协议安全
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443 - 宕机的原因有哪几种,怎么样分析宕机的原因,如:数据库的长连接。。。
- 在velocity页面,为什么不推荐不推荐使用宏定义
- webx的核心原理,webx框架和velocity的优缺点
- 页面上如果有一个screen和两个control,那么他们有几个context
- 一个含有layout、screen和control的页面,他们的加载顺序是什么,是等所有的加载完一起显示,还是其他。。。
- #if($!a==’true’)会出问题么,为什么
- 支付宝怎么样保证他的安全,他的调用异常分哪几种
- 项目中你觉得做得最好的是什么
- java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? ==>>>
- 除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式? 反射、序列化、克隆
- classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有什么区别?
- 列举三种以上垃圾回收算法,并比较其优缺点?
- 编写代码实现一个线程池
- 描述一下JVM加载class文件的原理机制? ==>>>
- JVM中类的装在是由ClassLoader和它的子类来实现的,java ClassLoader是一个重要的java运行时组件。它负责在运行时加载和装入类文件的类。
- 试举例说明一个典型的垃圾回收算法? 1.典型的垃圾回收算法 2.理解Java垃圾回收机制
- 请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. ==>>>
- 请写一个java程序实现线程连接池功能? ==>>>
- 给定一个C语言函数,要求实现在java类中进行调用。 ==>>>
- 如何获得数组的长度?
- 访问修饰符“public/private/protected/缺省的修饰符”的使用
- 用关键字final修饰一个类或者方法时,有何意义? ==>>>
- 掌握类和对象的概念,掌握面向对象编程的本质
- 静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法? ==>>> ==>>>
- JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally
- Object类(或者其子类)的finalize()方法在什么情况下被调用? ==>>>
- 一个“.java”原文件中是否可以包括多个类(不是内部类)? ==>>>
- 掌握内部类和接口的概念 ==>>>
- StringTokenizer类的使用 ==>>>
- 数据结构,如何遍历List中的元素?
- 如果要按照键值保存或者访问数据,使用什么数据结构?
- 要掌握Collection相关的接口和类的使用
- 使用StringBuffer类与String类进行字符串连接时有何区别? ==>>>
- 调用Thread类的destroy()方法有什么后果?
- 多线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? ===>>
- 使用socket建立客户端与服务器的通信的过程 简单理解Socket
- JAVA语言国际化应用,Locale类,Unicode 深入理解Java国际化
- 描述反射机制的作用 Java反射机制的原理与简单使用
- 如何读写一个文件? Java的文件读写操作
- 面向对象6大原则 ==>>> ==>>> ==>>>
- 聚合、组合、依赖
- Hibernate悲观锁与乐观锁 ==>>> ==>>>
- 数据库读现象 ==>>>
- 事务隔离级别 ==>>>
关于Hashcode方法和equals?
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:
1
|
public
native
int
hashCode();
|
根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。
为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法。
一.hashCode方法的作用
对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。
为什么这么说呢?考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在)
也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。下面这段代码是java.util.HashMap的中put方法的具体实现:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
put方法是用来向HashMap中添加新的元素,从put方法的具体实现可知,会先调用hashCode方法得到该元素的hashCode值,然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在,则更新value值,否则将新的元素添加到HashMap中。从这里可以看出,hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。
HashMap与HashTable?
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。
支付宝笔试面试
1. cookie 和 session 的区别
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
①cookie数据存放在客户的浏览器上,session数据放在服务器上。
②cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
③session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
④单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
⑤将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中。
2. JVM 内存模型
Java内存区域与内存溢出
3. SQL注入的原理 ==>>>
SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
首先让我们了解什么时候可能发生SQL Injection。
实际项目中,一般我们都是采用各种的框架,比如ibatis,mybatis,hibernate等等。他们一般也默认就是sql预编译的。对于ibatis/mybatis,如果使用的是 #{name}形式的,那么就是sql预编译,使用 ${name} 就不是sql预编译的。
4. 悲观锁 和 乐观锁
深入了解乐观锁与悲观锁 mysql乐观锁总结与实践 mysql悲观锁总结与实践
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度(悲观),因此,在整个数据处理过程中,将数据处于锁定状态。 悲观锁的实现,往往依靠数据库提供的锁机制 (也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)
优点与不足
悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数。
===================================================================================================
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。
优点与不足
乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。但如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题。
5. 读程序,输出结果. 关于treemap的
6. Linux 基础命令,统计日志中的信息
7. java 分布式集群
8. 一道设计题,具体到数据库的表.大概是淘宝的搜索中,输入手机,会出来很多类型,按品牌按价格区间按手机种类.
还有2道题我记不住了.
面试:
1.介绍你做过的项目,用到的技术,涉及到的模块,然后从项目中问各种技术实现的细节(为了确保你是真的懂了).
2.看你的试卷,喊你讲解做题的思路,以及这样结果的原因.(考的是各位的java基础知识了,这点是绕不过去的,懂了就懂了啊,只有平时多看书)
3.团购6位验证码以及团购成功后,发送到你手机上的条码的实现方式.(第一个问题我说用随机数+时间来验证.第二个问题老实说,我也没答上来,我说用序列,面试官说序列到后期20位以上的时候,用户体验很差的)
4.淘宝上是如何保证库存和订单之间的数据准确性的.(考点是分布式事务,这个问题我也没答上来,最后他问我有什么问题问他的时候,我就反问的这个问题,面试官人挺好的,给我耐心的讲解了一遍淘宝的实现方式以及
epay的实现方式. 淘宝是通过分布式事物,中间用了一个叫协调者角色的程序,当那边点击购买时,会库存减一,保存一条预扣的状态,但是是个预准备状态,然后做成功后,协调者会在另一个数据库生成订单,然后这个订单也是预状态,等两边都准备好以后,通知协调者,又协调者统一完成这2个数据库的事物,从而达到完成一笔交易的目的,若其中一方失败,则将预扣的数字返回到库存从而实现类似回滚的操作.)
5.索引的原理.能否构建时间索引.时间索引构建后会存在什么问题.(索引原理我是回答的堆表索引的构建原理以及查询原理,但是关于时间索引的问题,我也没回答出个所以然来,看面试官的反馈,好像回答得不够好吧)
6.你们数据库的数据量有多大,(回答:我们是电信方面的系统,表上亿的数据很正常).问:如果保证效率?
(我是如此回答的,各位自行结合自身的情况参考.答:后台J OB程序会定期备份,把生产表数据移走,然后备份表也会再备份一次,如此剃度的备份,保证生产库的数据是最小的.然后备份表采用分区和子分区,加上构建战略索引(分析系统的sql,常用
查询字段构建复合索引,以减少每次查询时对表的访问次数)).
7.SQL注入的原理以及如何预防,并举例.(这个相对简单,网上一搜一大片)
8.使用过Memcache么? 用在项目中哪些地方? (答,在门户主机上使用,缓存session,分布式的时候,统一访问这台主机验证用户session是否存在,来维持回话的状态和实现回话同步.又追问:java代码中如何实现访问门户服务器的这个session池子的? 几年前的代码,确实忘记了..于是坦白的说,记不清楚了 )
这些是主要的问题,当你回答一个大问题时中间还有很多比较碎的追问性质的小问题,总体给我的感觉是,氛围很轻松+愉快的,技术层面上还是需要你真正的理解透彻一些关键技术点,才能做到应付各种追问和给出满意的答案吧.如果只是一知半解想去蒙混过关肯定是不行的,毕竟在支付宝的技术大牛面前,多追问几句,也就把你逼到死角了.
还有一点比较重要的感觉就是,他们比较在意你是否了解当下的一些比较热的技术点,比如淘宝的秒杀,是如何保证高并发下的安全性和性能,新浪微博那种大数据量的发送,怎么就保证正确性和时效性的.
高级面试总结
(1)
(2)
(3)
(4)
(5)
18、
(1)
(2)
(3)
19、
(1)
(2)
(3)
20、
21、
一个设计模式描述了一个被证实可行的方案。这些方案非常普遍,是具有完整定义的最常用的模式。一般模式有4个基本要素:模式名称(pattern name)、问题(problem)、解决方案(solution)、效果(consequences)
常见23种模式概述:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
(18)
(19)
(20)
(21)
(22)
(23)
22、
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
进度报告
项目总结报告