Java面试准备
来源:互联网 发布:西安美林数据 怎么样 编辑:程序博客网 时间:2024/06/08 14:00
1.ArryList 、Vector、LinkedList 区别
ArrayList:当在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差。
LinkedList:当在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
2.HashMap、HashTable、LinkedMap、TreeMap的区别
HashMap:访问速度快,允许值为null,不支持线程同步,无顺序。若要同步可以加synchronizedMap或者使用ConcurrentHashMap。
HashTable:不允许键或值为空,线程同步,写入速度慢。
LinkedHashMap:是HashMap的一个子类,保存了记录的插入顺序,遍历的时候会比HashMap慢。
TreeMap:默认是按键键的升序排序。
3.事务
https://zhidao.baidu.com/question/104479831.html
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。主要用于一些对操作过程的完整性比较高的程序。比如银行系统,用户在转账的过程中程序出现错误,但是这个转账操作没有完成。那么这个操作就被退回。
主要目的:保证数据的一致性和完整性。
特性:
1.原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做
2.一致性:在事务执行前后,数据状态保持一致性。数据不会因为事务的执行而遭到破坏
3.隔离性:一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰
4.持久性:一个事物一旦提交,它对数据库的改变就是永久的
事务的实现方式:实现方式共有两种:编码方式;声明式事务管理方式
基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后再目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务.
声明式事务管理又有两种实现方式:基于xml配置文件的方式;另一个实在业务方法上进行@Transaction注解,将事务规则应用到业务逻辑中
一种常见的事务管理配置:事务拦截器TransactionInterceptor和事务自动代理BeanNameAutoProxyCreator相结合的方式
4.面向切面AOP
面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改,如果只要修改1、2处那还可以接受,万一有1000处呢。
AOP底层的东西就是JDK动态代理和CGLIB代理,说白了就是增强类的功能。
最常用的AOP应用在数据库连接以及事务处理上。
AOP是面向切面编程,是通过代理的方式为程序添加统一功能,集中解决一些公共问题。
AOP的应用:Spring声明式事务.
AOP通知的类型有:前通知,后通知,环绕通知,异常通知
5.两个项目之间如何通信
①使用apache的HttpClient方式。
GET请求:
String url = "......";HttpClient client = new HttpClient();HttpMethod method=new GetMethod("url");CloseableHttpResponse response = client.executeMethod(method);HttpEntity entity = response.getEntity();POST请求:
String url = "......";HttpClient client = new HttpClient();PostMethod postMethod = new PostMethod(url);// 创建参数队列 List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair("username", "admin")); formparams.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); System.out.println("executing request " + httppost.getURI()); CloseableHttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity();
②使用JDK自带的java.NET包下的HttpURLConnection方式。
乱码解决:发送时:conn.setRequestProperty("charset", "UTF-8");
接收时:reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
6.反射机制
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射是什么呢?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.dbtest.myqlConnection,com.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.dbtest.myqlConnection");通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!
《深度解析Java游戏服务器开发》:
看了下目录,没啥干货,大篇幅讲安装环境的,还有很多介绍框架的。
本书从游戏的行业分析、Java技术、游戏逻辑、数据库技术、网络理论、服务器技术、架构分析、系统优化等方面对游戏服务器开发做了全面解析。
web服务器和游戏服务器的区别:
1.从第三方支持来说,web后台有很多成熟的第三方框架,开发者不需要关心底层控制器跳转的实现,只需要一个或几个配置文件,就能完成核心控制器的部分,而开发者只需要关注web自身的业务逻辑,将逻辑与框架融合即可,使用框架一方面简化控制层代码,一方面很好的实现了业务逻辑的分层。而游戏后台开发中,因为各种游戏的需求差异性很大,从网络层,到业务逻辑层,各方面都必须根据自己游戏需求搭建适合自己的框架,因此很难有一些通用的东西能提炼出来一款成熟的框架,游戏后台开发基本上需要自己搭建适合自己的框架。
2.从业务逻辑层面来说,web后台基本上逻辑都是大同小异的,或许这一套系统,稍微改改,另一套系统就能用,而游戏就不同了,每个游戏都有自己的特色,根据策划的不同需求而实现不同的逻辑,不过也会有一些通用的模块,但整体上差异性还是很大的。
3.从数据持久化来说,web的数据基本上是很规整的,表与表之间关系很明确,并且以后也不会有太大的变化,而游戏中的数据多种多样,随着开服之后,数据的变化也是多种多样,甚至传统的关系型数据库根本无法满足游戏数据持久化的需求,游戏中有很多状态和数据是需要服务器来保存的,我个人认为,在游戏开发中,nosql比关系型数据库更实用。
4.从通信层来说,web中的用户都是一个个独立的个体,而游戏中是多人在线的一个游戏世界,在这个游戏世界中,玩家与玩家之间需要进行交互,这就需要服务器实时的向所有在线玩家进行消息广播,这一点很损耗服务器性能的,在这方面,游戏后台要比web做更多的处理,游戏服务器是一个IO密集的服务器类型。
多线程
建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。这个问题用Object的wait(),notify()就可以很方便的解决。代码如下:
/** * wait用法 * @author DreamSea * @time 2015.3.9 */ package com.multithread.wait; public class MyThreadPrinter2 implements Runnable { private String name; private Object prev; private Object self; private MyThreadPrinter2(String name, Object prev, Object self) { this.name = name; this.prev = prev; this.self = self; } @Override public void run() { int count = 10; while (count > 0) { synchronized (prev) { synchronized (self) { System.out.print(name); count--; self.notify(); } try { prev.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws Exception { Object a = new Object(); Object b = new Object(); Object c = new Object(); MyThreadPrinter2 pa = new MyThreadPrinter2("A", c, a); MyThreadPrinter2 pb = new MyThreadPrinter2("B", a, b); MyThreadPrinter2 pc = new MyThreadPrinter2("C", b, c); new Thread(pa).start(); Thread.sleep(100); //确保按顺序A、B、C执行 new Thread(pb).start(); Thread.sleep(100); new Thread(pc).start(); Thread.sleep(100); } }
- Java面试准备
- java面试准备1
- java面试准备2
- java面试准备3
- Java面试准备4
- java面试准备5
- Java面试及准备
- Java 面试准备
- Java 面试准备[二]
- java软件工程师面试准备
- 面试准备---Java异常
- 准备java面试资料
- # Java面试复习准备
- java面试题目准备
- java研发面试准备
- java面试准备-day01
- java面试准备-day02
- java面试准备-day03
- 响应式网页设计的9项基本原则
- undefined 以及 is not defined
- C++的输出入cin/cout和scanf/printf谁比较快?
- D
- cxf 服务端生成客户端的代码
- Java面试准备
- Binder实现分析
- 相机的使用
- ElasticSearch聚合
- 树莓派3设置samba文件共享
- 简易多线程编程
- Spring AOP增强小例子
- Java序列化(实现Serializable接口)作用
- 技术点-ActiveMQ-概念性总结