1.List/Set/Map的区别
list -- 有序 元素可重复
底层维护的数组可自动扩展
因为有序,所以可以通过下标获得数据 也可以通过迭代
主要实现:ArrayList LinkList Vector
set --- 最简单的一种集合
无序 元素不可重复;
因为数据无序,所以不可以通过下标访问,只能通过迭代得到数据。
主要实现:HashSet TreeSet
map ---
键对象和值对象映射的集合,键值对集合
Map没有继承于Collection接口
主要实现:HashMap HashTable LinkHashMap TreeMap
2. 什么是索引
索引是对数据库表中一列或多列的值进行排序的一种结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单
2.1 作用是什么?
(1)快速取数据;
(2)保证数据记录的唯一性;
(3)实现表与表之间的参照完整性;
(4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。
3.在Java中wait和sleep方法有什么不同
1.这两个方法来自不同的类分别是Thread和Object
2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法
(锁代码块和方法锁)。
3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
(使用范围)
4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
5.sleep()方法是一个静态方法,也就是说他只对当前对象有效
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;
3.1 线程sleep()和yield()方法有什么区别
① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或 更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。
4.java的(PO,VO,TO,BO,DAO,POJO)解释
PO(persistant object) 持久对象
在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了。通常对应数据模型(数据库),本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。
VO(value object) 值对象
通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.个人觉得同DTO(数据传输对象),在web上传递。
TO(Transfer Object),数据传输对象
在应用程序不同tie(关系)之间传输的对象
BO(business object) 业务对象
从业务模型的角度看,见UML元件领域模型中的领域对象。封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。
POJO(plain ordinary java object) 简单无规则java对象
纯的传统意义的java对象。就是说在一些Object/Relation Mapping工具中,能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。我的理解就是最基本的Java Bean,只有属性字段及setter和getter方法!。
DAO(data access object) 数据访问对象
是一个sun的一个标准j2ee设计模式,这个模式中有个接口就是DAO,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合VO, 提供数据库的CRUD操作…
O/R Mapper 对象/关系 映射
定义好所有的mapping之后,这个O/R Mapper可以帮我们做很多的工作。通过这些mappings,这个O/R Mapper可以生成所有的关于对象保存,删除,读取的SQL语句,我们不再需要写那么多行的DAL代码了。
实体Model(实体模式)
DAL(数据访问层)
IDAL(接口层)
DALFactory(类工厂)
BLL(业务逻辑层)
BOF Business Object Framework 业务对象框架
SOA Service Orient Architecture 面向服务的设计
EMF Eclipse Model Framework Eclipse建模框架
PO:全称是
persistant object持久对象
最形象的理解就是一个PO就是数据库中的一条记录。
好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
BO:全称是
business object:业务对象
主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。
比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
这样处理业务逻辑时,我们就可以针对BO去处理。
VO :
value object值对象
ViewObject表现层对象
主要对应界面显示的数据对象。对于一个WEB页面,或者SWT、SWING的一个界面,用一个VO对象对应整个界面的值。
DTO :
Data Transfer Object数据传输对象
主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO
POJO :
plain ordinary java object 简单java对象
个人感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象。
一个POJO持久化以后就是PO
直接用它传递、传递过程中就是DTO
直接用来对应表示层就是VO
DAO:
data access object数据访问对象
这个大家最熟悉,和上面几个O区别最大,基本没有互相转化的可能性和必要.
主要用来封装对数据库的访问。通过它可以把POJO持久化为PO,用PO组装出来VO、DTO
5.JSP和Servlet是什么关系?
servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的Java程序,可以简化页面内容的生成。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。有人说,Servlet就是在Java中写HTML,而JSP就是在HTML中写Java代码,当然这个说法是很片面且不够准确的。JSP侧重于视图,Servlet更侧重于控制逻辑,在MVC架构模式中,JSP适合充当视图(view)而Servlet适合充当控制器(controller)。
6.事务属性的种类: 传播行为、隔离级别、只读和事务超时
7.描述一下JVM加载class文件的原理机制
Java中的类的装载是由类加载器和它的子类来实现的,Java中的类加载器是Java运行时的一个重要的系统组件
它负责在运行时查找和装入类文件中的类。
类加载过程采取了父亲委托机制(PDM),在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器
都有且仅有一个父类加载器。类的加 载首先请求父类加载器加载,父类加载器无能为力时才由其子类
加载器自行加载
8.String,StringBuffer,StringBuilder的区别
**String**是只读字符串(底层代码用final修饰),用string引用的字符串内容是不能改变的
**StringBuffer**表示的字符串内容是可以直接修改的,底层用synchronized修饰,安全性更好,但是效率比StringBuilder低。
**StringBuilder**是由Java5引入的,他和StringBuffer的方法完全相同,区别在于他是在单线程环境上使用,
因为它的所有方面都没有synchronized修饰,所以它的效率要比String Buffer更好
9.事务的特性
原子性:一个事务中的所有操作,要么都完成,要么都不完成,不会结束在某个中间环节。
一致性:在事务开始前和结束后,数据库的完整性没有被破坏。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改能力,隔离性可以防止多个事务执行并发执行时由于
交叉执行而导致的数据不一致。
持久性:事务处理后,对数据的修改就是永久的,即便系统故障也不会全部消失。
9.1存在的问题(脏读,不可重复读,幻读)
1.脏读:一个事务读取到另一个事务没有提交的数据。
2.不可重复读(虚读):在同一个事务中,两次读取到的事务不一样。
3.幻读:一个事务操作(DML)数据表中所有事务,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
9.2事务隔离分为不同级别
读未提交(Read uncommitted):就是一个事务可以读取另一个未提交事务的数据。
(引发的问题:脏读、不可重复读、幻读)
读提交(read committed):就是一个事务要等另一个事务提交后才能读取数据(Oracle数据库默认)
(引发的问题:不可重复读、幻读)
可重复读(repeatable read):就是在开始读取数据(事务开启)时,不再允许修改操作(MySql数据库默认)
(引发的问题:幻读)
串行化(Serializable):完全串行化读,每次都会锁表,读写互相阻塞。
(引发的问题:无)
10.转发和重定向的区别
转发:
通过servlet的request内部请求访问转发的资源,由服务器进行操作,客户端(浏览器)对服务器内部的转发不感知。
重定向:通过response直接将资源路径返回给浏览器,由浏览器重新发起对服务器的请求
(这里资源路径也可以是其他web站点的资源),也就是浏览器会对服务器进行两次请求。
1、重定向时浏览器会发起两次请求;转发时浏览器只进行了一次请求。
2、重定向因为是两次请求所以第一次的request与第二次请求的request是不一样的,数据不可传递;转发因为是servlet的行为,是服务器内部把对一个request/response的处理权,移交给另外一个处理程序,数据是可传递的。
3、重定向时servlet将资源url发送给客户端,由客户端进行重新请求,那么这个url可以是任意的资源请求url;转发因为时servlet的服务器端操作的行为,所以只能转发服务器的该web内站点资源url。
11.设计模式
11.1单例模式
所谓单例,就是整个程序有且仅有一个实例。该类负责创建自己的对象,同时确保只有一个对象被创建。
懒汉模式
线程不安全,延迟初始化,严格意义上不是不是单例模式
饿汉模式
线程安全,比较常用,但容易产生垃圾,因为一开始就初始化
双重锁模式
线程安全,延迟初始化。这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
进行了两次的判断,第一次是为了避免不要的实例,第二次是为了进行同步,避免多线程问题
静态内部类单例模式
只有第一次调用getInstance方法时,虚拟机才加载 Inner 并初始化instance ,只有一个线程可以获得对象的初始化锁,其他线程无法进行初始化,保证对象的唯一性。目前此方式是所有单例模式中最推荐的模式
枚举单例模式
B/S结构与C/S结构的区别
C/S:Client/Server(客户端/服务器)结构
通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势,属于早期的软件系统设计标准
B/S: Browser/Server(浏览器/服务器)结构
对C/S结构的一种变化或者改进的结构。在这种 结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。
C/S 与 B/S 区别:
C/S是建立在局域网基础上的,一般面向相对固定的用户群,对象信息安全的控制力很强(所以一般高度机密信息系统采用此结构);
在程序架构上更加注重流程,系统运行速度可以较少考虑;
由于具有整体性处理出现的问题必须整体考察,维护升级难度大
C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低。
B/S是建立在广域网基础上的。对安全的控制能力相对较弱,面向的是不可知的用户群。
在程序架构上对安全和访问速度有多重考虑。
构件组成,系统维护成本低用户自己下载安装就可以升级
B/S 信息流向可变化,B-B B-C B-G等信息、流向的变化,更象交易中心。
12.HashMap中put与get的实现原理
put—HashMap在put方法中,调用put方法的时候首先判断table是否为空数组或者长度为0,如果是就进行resize(),然后它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。如果索引处为空,则直接插入到对应的数组中,否则,判断是否是红黑树,若是,则红黑树插入,否则遍历链表,若长度超过8,则将链表转为红黑树,转成功之后 再插入。
get—对输入的key的值计算hash值,
首先判断hashmap中的数组是否为空和数组的长度是否为0,如果为空和为0,则直接放回null
如果不为空和0,计算key对应的数组下标,判断对应位置上的第一个node是否满足条件,如果满足条件,直接返回
如果不满足条件,判断当前node是否是最后一个,如果是,说明不存在key,则返回null
如果不是最后一个,判断是否是红黑树,如果是红黑树,则使用红黑树的方式获取对应的key,
如果不是红黑树,遍历链表是否有满足条件的,如果有,直接放回,否则返回null
13.JDBC中如何进行事务处理?
答 :Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显式提交 事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚。除此之外,从JDBC 3.0中还引入了Savepoint(保存点)的概 念,允许通过代码设置保存点并让事务回滚到指定的保存点。
14.值传递和引用传递的区别
值传递: 只要是基本类型传递 都是值传递
引用传递:针对于基本类型进行封装,对封装进行传递,是引用传递
15.Object ob= new Object()占用多少内存
JDK是64位,8字节是引用,16字节是堆内存,总共是8+16=24字节,所以new一个Object对象占用24字节。如果JDK是32位,则new一个Object对象占用4+16=20字节
16.Spring中进行事务控制的常用注解是什么?
@Transactional:Spring提供了基于注解的事务配置,即通过@Transactional对需要事务增强的Bean 接口,实现类或方法进行标注;在容器中配置基于注解的事务增强驱动,即可启用基于注解的声明式事务。一般开 启注解装配之后多才采用这种方式。
@Serivce: 用于Service实现类进行标识
@Autowired:默认是按类型 (byType)匹配的方式在容器中查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标 注的变量中。
17.什么是AOP,作用是什么,什么情况下适合使用AOP
面向切面编程(AOP),他提供了另一种角度来思考程序结构,通过这种当时弥补了oop的不足。AOP用来封装横切关注点。
在正常业务流中像切面一样其他需要执行的代码,比如:业务执行执行间添加日志,测试时获取执行所耗的时间。
还有其他:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
18.服务器网络传输慢的原因
序号 | 原因 |
---|---|
1 | 域名解析的问题 |
2 | 连接数据库的原因(搜索数据) |
3 | 访问第三方网站影响速度(curl与file_get_contents访问第三方效率也是有差别的,curl更快些(个人测试所得)) |
4 | iis的设置问题 |
5 | php的配置问题 |
6 | mysql的配置问题(包括索引,占用cpu内存,mysql服务) |
7 | php升级导致的某些函数问题(某些函数被舍弃等) |
8 | waf防护墙防护导致某些代码或者操作不规范的问题 |
9 | 人数访问量导致服务器负载 |
10 | session导致的错误(session泛滥,服务器临时文件过多等) |
18.原文链接:https://blog.csdn.net/dihuangtian01/article/details/82767419
19. 两个Java项目之间的通信
两个java项目,他们之间进行信息的通信
前提:必须知道要通信的java项目(接收请求方)的服务器的IP地址和访问路径。
其实两个java项目之间的通信还是使用HTTP的请求。主要有两种方式:
①使用apache的HttpClient方式。
②使用JDK自带的java.net包下的HttpURLConnection方式。
HttpURLConnection方式:
HttpURLConnection传递请求常用的有两种方式:POST和GET方式。使用setRequestMethod()方法设置传递的方式。
20.Servlet的工作原理简介
你使用的本地web服务器或者买的别的服务器都一样的原理,鼠标点击事件发出一个HTTP请求以后,服务器会将请求移交给servlet容器,servlet容器首先对所请求的URL进行解析并根据web.xml配置文件找到相应的处理servlet,同时将request、response对象传递给它,servlet通过request对象可知客户端的请求者、请求信息以及其他的信息等,servlet在处理完请求后回把所需要返回的信息放入response对象中并返回客户端,servlet一旦处理完请求,servlet容器就会刷新respons对象,并把控制权重新返还给web服务器。
21.连接池
连接池是管理数据库连接的连接的分配管理释放资源,它允许应用程序重复使用一个连接,而不是重新建立一个连接。
传统的JDBC的步骤是加载驱动,用JDBC建立连接,执行SQL,断开连接,释放资源。而传统的连接重复连接重复释放会相当耗费资源,所以就有了连接池技术来管理连接,使连接可以重复使用。就节省了系统开销,提升了性能。
连接池如何管理连接的?
对于连接的管理可使用空闲池,即把已经创建但尚未分配出去的连接存放到一个空闲池中;每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就分配一个连接给用户;如果没有则检查当前连接池是否达到连接池所允许的最大连接数。如果没有达到,就新建一个连接。如果已经达到,就等待一定的时间。如果在等待的时间内有连接被释放出来,就可以把这个连接分配给等待的用户。如果等待时间超过预定时间,则返回空值(null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。