Java面试题四

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请求没有长度限制

GETPOST的区别:

 

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的基础上添加了其他功能,比如与SpringAOP更容易集成,也提供了处理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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值