31、编写多线程程序有几种实现方式?
有三种: (1)继承Thread类,重写run函数 创建: class xx extends Thread{ public void run(){ Thread.sleep(1000) //线程休眠1000毫秒,sleep使线程进入Block状态,并释放资源 }} 开启线程: 对象.start() //启动线程,run函数运行 (2)实现Runnable接口,重写run函数 开启线程: Thread t = new Thread(对象) //创建线程对象 t.start() (3)实现Callable接口,重写call函数 Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。 Callable和Runnable有几点不同: ①Callable规定的方法是call(),而Runnable规定的方法是run(). ②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的 ③call()方法可抛出异常,而run()方法是不能抛出异常的。 ④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等 待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果
class TaskWithResultimplements Callable<String>{
private int id;
public TaskWithResult(int id) {
this.id = id;
}
@Override
public String call() throws Exception {
return "result of TaskWithResult " + id;
}
}
public class CallableTest {
public static void main(String[]args) throwsInterruptedException,
ExecutionException {
ExecutorService exec =Executors.newCachedThreadPool();
// Future 相当于是用来存放Executor执行的结果的一种容器
ArrayList<Future<String>>results = newArrayList<Future<String>>();
for (int i = 0; i < 10; i++) {
results.add(exec.submit(new TaskWithResult(i)));
}
for (Future<String> fs : results) {
if (fs.isDone()) {
System.out.println(fs.get());
} else {
System.out.println("Futureresult is not yet complete");
}
}
exec.shutdown();
}
}
32、POST和GET的区别
什么是HTTP?
超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议。
HTTP在客户端和服务器之间以request-responseprotocol(请求-回复协议)工作。
GET - 从指定的服务器中获取数据
POST - 提交数据给指定的服务器处理
GET方法:
使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器:
/test/demo_form.jsp?name1=value1&name2=value2
特点:
· GET请求能够被缓存
· GET请求会保存在浏览器的浏览记录中
· 以GET请求的URL能够保存为浏览器书签
· GET请求有长度限制
· GET请求主要用以获取数据
POST方法:
使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器:
POST /test/demo_form.jsp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
特点:
· POST请求不能被缓存下来
· POST请求不会保存在浏览器浏览记录中
· 以POST请求的URL无法保存为浏览器书签
· POST请求没有长度限制
GET和POST的区别:
| GET | POST |
点击返回/刷新按钮 | 没有影响 | 数据会重新发送(浏览器将会提示用户“数据被从新提交”) |
添加书签 | 可以 | 不可以 |
缓存 | 可以 | 不可以 |
编码类型(Encoding type) | application/x-www-form-urlencoded | application/x-www-form-urlencoded or multipart/form-data. 请为二进制数据使用multipart编码 |
历史记录 | 有 | 没有 |
长度限制 | 有 | 没有 |
数据类型限制 | 只允许ASCII字符类型 | 没有限制。允许二进制数据 |
安全性 | 查询字符串会显示在地址栏的URL中,不安全,请不要使用GET请求提交敏感数据 | 因为数据不会显示在地址栏中,也不会缓存下来或保存在浏览记录中,所以看POST求情比GET请求安全,但也不是最安全的方式。如需要传送敏感数据,请使用加密方式传输 |
可见性 | 查询字符串显示在地址栏的URL中,可见 | 查询字符串不会显示在地址栏中,不可见 |
其他HTTP请求方式
方式 | 描述 |
HEAD | 与GET请求类似,不同在与服务器只返回HTTP头部信息,没有页面内容 |
PUT | 上传指定URL的描述 |
DELETE | 删除指定资源 |
OPTIONS | 返回服务器支持的HTTP方法 |
CONNECT | 转换为透明TCP/IP隧道的连接请求 |
33、简述synchronized 和java.util.concurrent.locks.Lock的异同?
主要相同点:Lock能完成synchronized所实现的所有功能。
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。syncronized会自动释放锁,而Lock一定要程序员手动释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如它的tryLock()方法可以以非阻塞方式去拿锁。
synchronized (lockObject) {
// update objectstate
}
//java.util.concurrent.locks.ReentrantLock为Lock的实现类
Lock lock = new ReentrantLock();
lock.lock();
try {
// update object state
} finally {
lock.unlock();
}
34、Java中如何实现序列化,有什么意义?
什么是序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作, 也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。
序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。
虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
java序列化主要是为了跨平台,实现对象的一致性,可在不同的平台上,保持自己原有的属性和方法不变
什么情况下需要序列化
1)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
2)当你想用套接字在网络上传送对象的时候;
3)当你想通过RMI传输对象的时候;
如何实现序列化?
要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的, 然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态); 如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。35、请简单介绍一下什么是Spring?
Spring的核心是一个轻量级(Lightweight)的容器(Container),它是实现IoC(Inversionof Control)容器和非入侵性(No intrusive)的框架,并提供AOP(Aspect-orientedprogramming)概念的实现方式;提供对持久层(Persistence)、事物(Transcation)的支持;提供MVC Web框架的实现,并对一些常用的企业服务API(ApplicationInterface)提供一致的模型封装,是一个全方位的应用程序框架(Application Framework),除此之外,对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等),Spring也提供了与他们相整合的方案。
1、Spring的核心是一个轻量级(Lightweight)的容器(Container)。
2、Spring是实现IoC(Inversion ofControl)容器和非入侵性(No intrusive)的框架。
3、Spring提供AOP(Aspect-orientedprogramming)概念的实现方式。
4、Spring提供对持久层(Persistence)、事物(Transcation)的支持。
5、Spring供MVC Web框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装。
6、Spring提供了对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等)相整合的方案。
总之,Spring是一个全方位的应用程序框架。
36、什么是控制反转(IOC)?什么是依赖注入?
控制反转(IoCInversion of Control),是一种概念,是一种思想。是指将传统由程序代码控制对象调用权交给容器,通过容器类实现对象的装配和管理。控制反转是对象控制器的转移,从程序代码本身转移到了容器外部。
依赖注入:DependencyInjection,程序代码不过定位查询,有容器自行完成。在程序运行过程中,若需要调用一个对象进行协助,无需在代码中进行创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
IoC比较流行的实现方式有:依赖注入和依赖查找。
A.依赖注入有三种类型:
构造子注入(例如,Spring框架):依赖是通过构造器参数提供的。
设值方法注入(例如,Spring框架):依赖是通过JavaBeans属性注入的(ex:setter方法)
接口注入(例如,Avalon):注入通过接口完成。
36、请解释下Spring框架中的IoC?
Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框架IoC容器的基础。
BeanFactory接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。ApplicationContex接口对BeanFactory(是一个子接口)进行了扩展,在BeanFactory的基础上添加了其他功能,比如与Spring的AOP更容易集成,也提供了处理message resource的机制(用于国际化)、事件传播以及应用层的特别配置,比如针对Web应用的WebApplicationContext。
org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现,用来包装和管理前面提到的各种bean。BeanFactory接口是Spring IoC 容器的核心接口。
37、BeanFactory和ApplicationContext有什么差别?
BeanFactory 能够理解为含有bean集合的工厂类。
BeanFactory 包括了种bean的定义。以便在接收到client请求时将相应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与beanclient的配置中解放出来。BeanFactory还包括了bean生命周期的控制,调用client的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,依据请求分发bean的功能。
但application context在此基础上还提供了其它的功能。
1. 提供了支持国际化的文本消息
2. 统一的资源文件读取方式
3. 已在监听器中注冊的bean的事件
下面是三种较常见的 ApplicationContext 实现方式:
1、ClassPathXmlApplicationContext:从classpath的XML配置文件里读取上下文,并生成上下文定义。
应用程序上下文从程序环境变量中取得。
ApplicationContext context = newClassPathXmlApplicationContext(“bean.xml”);
2、FileSystemXmlApplicationContext:由文件系统中的XML配置文件读取上下文。
ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);
3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。
38、Spring有几种配置方式?
将Spring配置到应用开发中有下面三种方式:
基于XML的配置
基于注解的配置
基于Java的配置
39、怎样用基于XML配置的方式配置Spring?
在Spring框架中,依赖和服务须要在专门的配置文件来实现。我经常使用的XML格式的配置文件。
这些配置文件的格式通经常使用<beans>开头,然后一系列的bean定义和专门的应用配置选项组成。
SpringXML配置的主要目的时候是使全部的Spring组件都能够用xml文件的形式来进行配置。这意味着不会出现其它的Spring配置类型(比方声明的方式或基于Java Class的配置方式)
Spring的XML配置方式是使用被Spring命名空间的所支持的一系列的XML标签来实现的。Spring有下面基本的命名空间:context、beans、jdbc、tx、aop、mvc和aso。
<beans>
<!-- JSONSupport -->
<beanname="viewResolver"class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<beanname="jsonTemplate"class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
<beanid="restTemplate"class="org.springframework.web.client.RestTemplate"/>
</beans>
以下这个web.xml只配置了DispatcherServlet,这件最简单的配置便能满足应用程序配置执行时组件的需求。
<web-app>
<display-name>ArchetypeCreated Web Application</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
40、#{}和${}的区别是什么?
1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order byuser_id, 如果传入的值是id,则解析成的sql为order by id.
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.
6.一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
40、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
还有很多其他的标签,<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中<sql>为sql片段标签,通过<include>标签引入sql片段,<selectKey>为不支持自增的主键生成策略标签。
select @@indentity
select last_insert_id();