1.谈谈你对面向对象程序设计的理解?面向对象程序设计的重点和难点是什么?html
对面向对象的理解java
在我理解,面向对象是向现实世界模型的天然延伸,这是一种“万物皆对象”的编程思想。在现实生活中的任何物体均可以归为一类事物,而每个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,因此程序=对象+消息。程序员
面向对象有三大特性,封装、继承和多态。web
封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公开化,提升了数据的隐秘性的同时,使代码模块化。这样作使得代码的复用性更高。算法
继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每个子类是一个特殊的父类--有父类的行为和属性,也有本身特有的行为和属性。这样作扩展了已存在的代码块,进一步提升了代码的复用性。spring
若是说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。多态的一大做用就是为了解耦--为了解除父子类继承的耦合度。若是说继承中父子类的关系式IS-A的关系,那么接口和实现类之之间的关系式HAS-A。简单来讲,多态就是容许父类引用(或接口)指向子类(或实现类)对象。不少的设计模式都是基于面向对象的多态性设计的。数据库
总结一下,若是说封装和继承是面向对象的基础,那么多态则是面向对象最精髓的理论。掌握多态必先了解接口,只有充分理解接口才能更好的应用多态。
原文:https://blog.csdn.net/weixin_40066829/article/details/78111476
编程
2.什么是类,类实例,如何创建类的实例,在spring中又是如何建立类的?json
类的具体表现或者实例就是对象,而对象的抽象或者总归纳就是类。设计模式
建立对象的根本途径是构造器,经过new关键字来调用某个类的构造器便可建立这个类的实例
1 // 使用Person类定义一个Person类型的变量
2 Person p;
3 // 经过new关键字调用Person类的构造器,返回一个Person实例
4 // 将该Person实例赋给p变量
5 p = new Person();
上面代码也可简写成下面的形式:
1 // 定义p变量的同时并为p变量赋值
2 Person p = new Person();
spring建立对象的三种方式:
一、采用默认的构造函数建立
二、采用静态工厂方法
一、写一个静态工厂方法类
public class HelloWorldFactory {
public static HelloWorld getInstance(){
return new HelloWorld();
}
}
二、在spring的配置文件中进行声明
<bean id="helloWorld2" class="com.itheima05.spring.bean.HelloWorldFactory" factory-method="getInstance"></bean>
告诉spring容器利用HelloWorldFactory类中的getInsatance静态方法产生对象
可是具体的对象的建立的过程是由程序员来完成的
三、实例工厂方法
一、写一个实例工厂类
public class HelloWorldFactory {
public HelloWorld getInstance(){
return new HelloWorld();
}
}
二、在spring的配置文件中
一、<bean id="helloWorld3" class="com.itheima05.spring.bean.HelloWorldFactory2"></bean>
spring容器为HelloWorldFactory2建立对象
二、<bean id="helloWorldFactory" factory-bean="helloWorld3" factory-method="getInstance"></bean>
告诉spring容器,利用helloWorld3对象调用getInstance方法
建立对象的时机
一、在默认的状况下,在spring容器启动的时候建立对象
在spring配置文件中,只要根据以上的三种方式的其中一种配置了,spring容器就会建立对象
好处:spring容器和web容器整合的时候,当web容器启动的时候就能够初始化spring容器了,若是这个时候
spring容器内部有错误,则直接会报错
若是该bean中存放着大量的数据,并且数据的初始化发生在建立对象的时候,这个时候,数据会过早的驻留在内存中
二、若是在spring的配置文件中一个bean的配置中有lazy-init="true",那么该bean在调用getBean方法时建立对象
很差处:不能过早的发现错误
好处:按照需求加载数据(何时要何时加载)
3.什么是抽象类?什么是接口?
抽象类:抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类,抽象类有点相似于“模板”的做用,目的是根据其格式来建立和修改新的类,对象不能由抽象类直接建立,只能够经过抽象类派生出新的子类,再由其子类来建立对象,当一个类被声明为抽象类时,要在这个类前面加上修饰符abstract,在抽象类中的成员方法能够包括通常方法和抽象方法
抽象方法:抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型,方法名称和所须要的参数,没有方法体,也就是说抽象方法只须要声明而不须要事先,当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,不然其子类的该方法仍然是abstract的,而这个子类也必须是抽象的,即声明为avstract
二者联系:抽象类中不必定包含抽象方法,可是包含抽象方法的类必定要被声明为抽象类,抽象类自己不具有实际的功能,只能用于派生其子类,抽象类中能够包含构造方法,可是构造方法不能被声明为抽象,抽象类不能用final来修饰,即一个类不能既是最终类又是抽象类,abstract不能与private,static,final,native并列修饰同一个方法
接口:
Java接口是一些方法特征的集合,没有方法的实现。Java接口中定义的方法在不一样的地方被实现(implements),能够具备彻底不一样的行为(功能)。
注意:(1)、java接口不能被实例化。
(2)、Java接口中声明的成员自动设置为public,所以java接口中不能声明私有的成员。
(3)、Java接口中不能出现方法体实现。
(4)、实现(implements)某个java接口,就必须实现其中定义的全部方法。
接口(interface)的特征:
1.全部的成员变量都是public、static、final类型。
2.全部的方法都是public、abstract类型。
3.全部的嵌套类型(类或接口)都是public、static类型。
抽象类(abstract class)和接口(interface)有什么异同?
答:抽象类和接口都不可以实例化,但能够定义抽象类和接口类型的引用。一个类若是继承了某个抽象类
或者实现了某个接口都须要对其中的抽象方法所有进行实现,不然该类仍然须要被声明为抽象类。接口比
抽象类更加抽象,由于抽象类中能够定义构造器,能够有抽象方法和具体方法,而接口中不能定义构造器 并且其中的方法所有都是抽象方法。抽象类中的成员能够是 private、默认、protected、public 的,而接口中 的成员全都是 public 的。抽象类中能够定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象 方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
4.什么是内部类?内部类有什么好处?
大部分时候,类被定义成一个独立的程序单元.在某些状况下,也会把一个类放在另外一个类的内部定义,这个定义在其余类内部的类就被称为内部类,包含内部类的类也被称为外部类。
内部类主要有以下做用:
(1)内部类提供了更好的封装,能够把内部类隐藏在外部类以内,不容许同一个包中的其余类访问该类。
(2)内部类成员能够直接访问外部类的私有数据,由于内部类被当成其外部类成员,同一个类的成员之间能够换互相访问。但外部类不能访问内部类的实现细节。
(3)匿名内部类适合用于建立那些仅须要一次使用的类。
补充:
从语法角度来看,定义内部类与定义外部类的语法大体相同,内部类除须要定义在其余类里面以外,还存在以下两点区别:
(1)内部类比外部类能够多使用三个修饰符:private、protected、static——外部类不可使用这三个修饰符。
(2)非静态内部类不能拥有静态成员。
5.如何进行整数、浮点数和字符串间的转换?
- 调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueOf(String)便可返回相应基本类型;
- 一种方法是将基本数据类型与空字符串("")链接(+)便可得到其所对应的字符串;另外一种方法是调用 String 类中的 valueOf()方法返回相应字符串
6.说说continue如何控制循环过程的执行。
(1)break;
while循环break是用于永久终止循环。即不执行本次循环中break后面的语句,直接跳出循环。
(2)continue;
while循环continue是用于终止本次循环。即本次循环中continue后面的代码不执行,进行下一次循环的入口判断。
7.说说你对泛型的理解。
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,而后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,相似于方法中的变量参数,此时类型也定义成参数形式(能够称之为类型形参),而后在使用/调用时传入具体的类型(类型实参)。
8.说说Java中异常的分类,以及Java程序中是如何处理异常的。
Throwable类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些经常使用的异常类,咱们也能够自定义异常。
Throwable又派生出Error类和Exception类。
错误:Error类以及他的子类的实例,表明了JVM自己的错误。错误不能被程序员经过代码处理,Error不多出现。所以,程序员应该关注Exception为父类的分支下的各类异常类。
异常:Exception以及他的子类,表明程序运行时发送的各类不指望发生的事件。能够被Java异常处理机制使用,是异常处理的核心。
Java 经过面向对象的方法进行异常处理,把各类不一样的异常进行分类,并提供了良好的接口。在 Java 中,每一个异常都是一个对象,它是 Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常 对象,该对象中包含有异常信息,调用这个对象的方法能够捕获到这个异常并能够对其进行处理。Java 的 异常处理是经过 5 个关键词来实现的:try、catch、throw、throws 和 finally。通常状况下是用 try 来执行一 段程序,若是系统会抛出(throw)一个异常对象,能够经过它的类型来捕获(catch)它,或经过老是执行 代码块(finally)来处理;try 用来指定一块预防全部异常的程序;catch 子句紧跟在 try 块后面,用来指定 你想要捕获的异常的类型;throw 语句用来明确地抛出一个异常;throws 用来声明一个方法可能抛出的各 种异常(固然声明异常时容许无病呻吟);finally 为确保一段代码无论发生什么异常情况都要被执行;try语 句能够嵌套,每当遇到一个 try 语句,异常的结构就会被放入异常栈中,直到全部的 try 语句都完成。若是 下一级的 try 语句没有对某种异常进行处理,异常栈就会执行出栈操做,直到遇到有处理这种异常的 try 语 句或者最终将异常抛给 JVM。
9.说说进程和线程的区别,Java中如何建立线程?
区别:
(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中能够包括多个线程,而且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程结束后它拥有的全部线程都将销毁,而线程的结束不会影响同个进程中的其余线程的结束
(4)线程是轻两级的进程,它的建立和销毁所须要的时间比进程小不少,全部操做系统中的执行功能都是建立线程去完成的
(5)线程中执行时通常都要进行同步和互斥,由于他们共享同一进程的全部资源
(6)线程有本身的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有本身的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
Java 5 之前实现多线程有两种实现方法:一种是继承 Thread 类;另外一种是实现 Runnable 接口。两种方 式都要经过重写 run()方法来定义线程的行为,推荐使用后者,由于 Java 中的继承是单继承,一个类有一个 父类,若是继承了 Thread 类就没法再继承其余类了,显然使用 Runnable 接口更为灵活。
补充:Java 5 之后建立线程还有第三种方式:实现 Callable 接口,该接口中的 call 方法(线程执行体)能够在线程执行结束时产生一个返回值
10.什么是注解?试举例你使用过的注解。
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及之后版本引入的一个特性,与类、接口、枚举是在同一个层次。它能够声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
做用分类:
①编写文档:经过代码里标识的元数据生成文档
② 代码分析:经过代码里标识的元数据对代码进行分析
③编译检查:经过代码里标识的元数据让编译器可以实现基本的编译检查
11.什么是对象序列化?
对象的序列化(Serialize)是指将一个Java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指从IO流中恢复该Java对象。
对象序列化的目标是将对象保存到磁盘中,或容许在网络中直接传输对象。对象序列化机制容许把内存中的Java对象转换成平台无关的二进制流,从而容许把这种二进制流持久地保存在磁盘上,经过网络将这种二进制流传输到另外一个网络节点。其余程序一旦得到了这种二进制流(不管是从磁盘中获取的,仍是经过网络获取的),均可以将这种二进制流恢复成原来的Java对象。
12.列举你使用过的集合类,并说明用途和注意事项。
13.什么是XML,什么是Web Service,什么是Json?在Java中如何处理Json?
XML全称为Extensible Markup Language, 意思是可扩展的标记语言。XML语法上和HTML比较类似, 但HTML中的元素是固定的, 而XML的标签是能够由用户自定义的。
a) xml, eXtensible Markup Language, 可扩展标记语言. 是一种标记语言.
b) xml是一种很是灵活的语言, 没有固定的标签, 全部的标签均可以自定义.
c) 一般, xml被用于信息的记录和传递. 所以, xml常常被用于充当配置文件.
Web Service:
从表面上看,Web Service 就是一个应用程序,它向外界暴露出一个可以经过 Web 进行调用的 API。这 就是说,你可以用编程的方法透明的调用这个应用程序,不须要了解它的任何细节,跟你使用的编程语言 也没有关系。例如能够建立一个提供天气预报的 Web Service,那么不管你用哪一种编程语言开发的应用均可 以经过调用它的 API 并传入城市信息来得到该城市的天气预报。之因此称之为 Web Service,是由于它基于 HTTP 协议传输数据,这使得运行在不一样机器上的不一样应用无须借助附加的、专门的第三方软件或硬件,就 可相互交换数据或集成。 补充:这里必需要说起的一个概念是 SOA(Service-Oriented Architecture,面向服务的架构),SOA 是一种思 想,它将应用程序的不一样功能单元经过中立的契约联系起来,独立于硬件平台、操做系统和编程语言,使 得各类形式的功能单元可以更好的集成。显然,Web Service 是 SOA 的一种较好的解决方案,它更多的是一 种标准,而不是一种具体的技术。
Json:
JSON是JavaScript Object Notation的简称,中文含义为“JavaScript 对象表示法”,它是一种数据交换的文本格式,而不是一种编程语言。
JSON 是一种轻量级的数据交换格式,它基于 ECMAScript (w3c制定的js规范)的一个子集,采用彻底独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提高网络传输效率。
---------------------------------------------------------------------------------------------------------------------
json简介
百度百科:
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript 规范的一个子集,采用彻底独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提高网络传输效率。
什么是 JSON ?
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式
JSON 独立于语言 *
JSON 具备自我描述性,更易理解
* JSON 使用 JavaScript 语法来描述数据对象,可是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不一样的编程语言。
相似 XML
JSON 是纯文本
JSON 具备“自我描述性”(人类可读)
JSON 具备层级结构(值中存在值)
JSON 可经过 JavaScript 进行解析
JSON 数据可以使用 AJAX 进行传输
相比 XML 的不一样之处
没有结束标签
更短
读写的速度更快
可以使用内建的 JavaScript eval() 方法进行解析
使用数组
不使用保留字
-------------------------------------------------------------------------------------------------------------------
14.三大框架的做用
三大框架是用来开发web应用程序中使用的.
Struts:基于MVC的充当了其中的视图层和控制器
Hibernate:作持久化的,对JDBC轻量级的封装,使得咱们能过面向对象的操做数据库
Spring: 采用了控制反转的技术,管理Bean,下降了各层之间的耦合.
15.什么是MVC
Model View Controller,是模型-视图-控制器的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑汇集到一个组件里,在改进和个性化定制界面的及用户交互的时候,不须要从新编写业务逻辑。mvc用于映射传统的输入、处理、输出功能在一个逻辑的图形用户界面的结构中。
mvc就是相似三层的一种架构,主要采用封装(分层)的思想,来下降耦合度,从而使咱们的系统更灵活,扩展性更好。
(1)model是应用程序中用于处理数据逻辑的部分。一般模型对象负责在数据库中存取数据。
(2)view是应用程序中处理数据显示的部分。一般视图是依据数据模型建立的。
(3)controller是应用程序中处理数据交互的部分。一般控制器负责从视图读取数据,控制用户输入,并向模型发送。
模型(Model) “数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权力,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操做。可是模型中数据的变化通常会经过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图能够了解在数据模型上发生的改变。
视图(View) 视图层可以实现数据有目的的显示(理论上,这不是必需的)。在视图中通常没有程序上的逻辑。为了实现视图上的刷新功能,视图须要访问它监视的数据模型(Model),所以应该事先在被它监视的数据那里注册。
控制器(Controller) 控制器起到不一样层面间的组织做用,用于控制应用程序的流程。它处理事件并做出响应。“事件”包括用户的行为和数据模型上的改变。
补充:
一、mvc的优势
(1)多个视图共享一个模型,大大提升代码的可重用性。
(2)三个模块相互独立,改变其中一个不会影响其余两,因此依据这种设计模式能构建良好的松耦合性的组件。
(3)控制器提升了应用程序的灵活性和可控制性。控制器能够用来链接不一样的模型和视图去完成用户的需求,这样控制器能够为构造应用程序提升强有力的手段。
二、mvc的缺点
(1)增长了系统结构和实现的复杂性。
对于简单页面,严格遵循mvc,使模型、视图与控制器分离,会增长结构的复杂性,并可能产生过多的更新操做,下降运行效率。
(2)视图与控制器过于紧密的链接。
视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是颇有限的,反之亦然,这样就妨碍了他们的独立重用。
(3)视图对模型数据的低效率访问。
依据模型操做接口的不一样,视图可能须要屡次调用才能得到足够的显示数据。对未变化数据的没必要要的频繁访问,也将损害操做性能。
(4)目前,一些高级的界面工具或构造器不支持mvc。
改造这些工具以适应MVC须要和创建分离的部件的代价是很高的,从而形成使用MVC的困难。
综上,对于开发存在大量用户界面,而且业务逻辑复杂的大型应用程序,MVC将会使你的软件在健壮性、代码重用和结构方面上一个新的台阶。尽管在最初构建MVC框架时会花费必定的工做量,但从长远角度看,它会大大提升后期软件开发的效率。因此咱们在具体适用时,要综合考虑其适用范围,
16.jsp与servlet的区别与联系
jsp和servlet的区别和联系:
1.jsp经编译后就变成了Servlet.
(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM可以识别的java类)
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,Jsp中的内置对象都是必须经过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象获得.
Jsp是Servlet的一种简化,使用Jsp只须要完成程序员须要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
联系:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
Servlet和JSP最主要的不一样点在于:
Servlet的应用逻辑是在Java文件中,而且彻底从表示层中的HTML里分离开来。
而JSP的状况是Java和HTML能够组合成一个扩展名为.jsp的文件。
JSP侧重于视图,Servlet主要用于控制逻辑
Servlet更多的是相似于一个Controller,用来作控制。
理解如下三点便可:
一、不一样之处在哪?
- Servlet在Java代码中经过HttpServletResponse对象动态输出HTML内容
- JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容
二、各自的特色
- Servlet可以很好地组织业务逻辑代码,可是在Java源文件中经过字符串拼接的方式生成动态HTML内容会致使代码维护困难、可读性差
- JSP虽然规避了Servlet在生成HTML内容方面的劣势,可是在HTML中混入大量、复杂的业务逻辑一样也是不可取的
三、经过MVC双剑合璧
既然JSP和Servlet都有自身的适用环境,那么可否扬长避短,让它们发挥各自的优点呢?答案是确定的——MVC(Model-View-Controller)模式很是适合解决这一问题。
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):
- Controller——负责转发请求,对请求进行处理
- View——负责界面显示
- Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操做实现
在JSP/Servlet开发的软件系统中,这三个部分的描述以下所示:
- Web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
- Controller(Servlet)调用核心业务逻辑——Model部分,得到结果
- Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
- 动态生成的HTML内容返回到浏览器显示
MVC模式在Web开发中的好处是很是明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会经过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提升了代码的可读性和可维护性。
原文:https://www.cnblogs.com/sanyouge/p/7325656.html
17.JDBC的链接步骤
下面的代码以链接本机的 Oracle 数据库为例,演示 JDBC 操做数据库的步骤。
// 加载驱动。
Class.forName("oracle.jdbc.driver.OracleDriver");
// 建立链接。
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
// 建立语句。
PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
ps.setInt(1, 1000);
ps.setInt(2, 3000);
// 执行语句。
ResultSet rs = ps.executeQuery();
// 处理结果。
while(rs.next()) {
System.out.println(rs.getInt("empno") + " - " + rs.getString("ename"));
}
// 关闭资源。
finally {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
提示:关闭外部资源的顺序应该和打开的顺序相反,也就是说先关闭 ResultSet、再关闭 Statement、在关闭 Connection。上面的代码只关闭了 Connection(链接),虽然一般状况下在关闭链接时,链接上建立的语句 和打开的游标也会关闭,但不能保证老是如此,所以应该按照刚才说的顺序分别关闭。此外,第一步加载 驱动在 JDBC 4.0 中是能够省略的(自动从类路径中加载驱动),可是咱们建议保留
Statement 和 PreparedStatement 有什么区别?哪一个性能更好?
答:与 Statement 相比,①PreparedStatement 接口表明预编译的语句,它主要的优点在于能够减小 SQL的 编译错误并增长 SQL 的安全性(减小 SQL 注射攻击的可能性);②PreparedStatement 中的 SQL 语句是能够 带参数的,避免了用字符串链接拼接 SQL 语句的麻烦和不安全;③当批量处理 SQL 或频繁执行相同的查询 时,PreparedStatement 有明显的性能上的优点,因为数据库能够将编译优化后的 SQL 语句缓存起来,下次 执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。
18.用Java 写一个冒泡排序。
冒泡排序的思想
该排序算法意在从后往前像气泡同样,依次冒出数组中值小的元素;或者从前日后依次冒出数组中值大的元素。
以升序为例,假设数组的长度为size。从数组的最后一个元素(即第size-1个元素)开始,从后往前两两进行比较,即最开始比较第size-1个元素和第size-2个元素的值的大小,若发现前者比后者小,则进行交换,不然不交换,以后无论是否已进行交换操做,继续往前遍历,遍历到第0个元素为止,这时候肯定第0个元素为数组中最小的值;而后,再从新开始比较第size-1个元素和第size-2个元素的值的大小,对其进行前面所述的操做,直到遍历到第1个元素为止,这时候肯定第1个元素为数组中第二小的值;以此类推,直到对整个数组操做完为止。
public static void swap( int [] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
/* 冒泡排序。 */
public static void bubbleSort( int [] arr) {
for ( int x=0; x<arr.length-1; x++) {
for ( int y=0; y<arr.length-1-x; y++) {
if (arr[y]>arr[y+1]){
swap(arr,y,y+1);
}
}
}
}
1九、用Java 写一个折半查找。
答:折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程 从数组的中间元素开始,若是中间元素正好是要查找的元素,则搜素过程结束;若是某一特定元素大于或
者小于中间元素,则在数组大于或小于中间元素的那一半中查找,并且跟开始同样从中间元素开始比较。
若是在某一步骤数组已经为空,则表示找不到指定的元素。这种搜索算法每一次比较都使搜索范围缩小一 半,其时间复杂度是 O(logN)。 import java.util.Comparator;
1 public static int halfSearch( int [] arr, int key) {
3 int max,min,mid;
4 min = 0;
5 max = arr.length-1;
6 mid = (max+min)/2;
7 while (arr[mid]!=key) {
9 if (key>arr[mid])
10 min = mid + 1;
11 else if (key<arr[mid])
12 max = mid - 1;
13 if (max<min)
14 return -1;
15 mid = (max+min)/2;
16 }
17 return mid;
18 }
20.Java实现同步的几种方式
https://www.cnblogs.com/jiansen/p/7351872.html
编写多线程程序有几种实现方式?
答:Java 5 之前实现多线程有两种实现方法:一种是继承 Thread 类;另外一种是实现 Runnable 接口。两种方 式都要经过重写 run()方法来定义线程的行为,推荐使用后者,由于 Java 中的继承是单继承,一个类有一个 父类,若是继承了 Thread 类就没法再继承其余类了,显然使用 Runnable 接口更为灵活。
补充:Java 5 之后建立线程还有第三种方式:实现 Callable 接口,该接口中的 call 方法能够在线程执行结束时产生一个返回值.
synchronized 关键字的用法?
答:synchronized 关键字能够将对象或者方法标记为同步,以实现对对象和方法的互斥访问,能够用 synchronized(对象) { … }定义同步代码块,或者在声明方法时将 synchronized 做为方法的修饰符。
什么是线程同步 如何实现线程同步
当使用多个线程来访问同一个数据时,很是容易出现线程安全问题(好比多个线程都在操做同一数据致使数据不一致),因此咱们用同步机制来解决这些问题。
实现同步机制有两个方法:
1.同步代码块:
synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。
2.同步方法:
public synchronized 数据返回类型 方法名(){}
就是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的自己(这里指的对象自己有点含糊,其实就是调用该同步方法的对象)经过使用同步方法,可很是方便的将某类变成线程安全的类,具备以下特征:
1,该类的对象能够被多个线程安全的访问。
2,每一个线程调用该对象的任意方法以后,都将获得正确的结果。
3,每一个线程调用该对象的任意方法以后,该对象状态依然保持合理状态。
注:synchronized关键字能够修饰方法,也能够修饰代码块,但不能修饰构造器,属性等。
实现同步机制注意如下几点: 安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。
1,不要对线程安全类的全部方法都进行同步,只对那些会改变共享资源方法的进行同步。
2,若是可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.
21.Druid 链接池简介
Druid首先是一个数据库链接池。Druid是目前最好的数据库链接池,在功能、性能、扩展性方面,都超过其余数据库链接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,通过一年多生产环境大规模部署的严苛考验。
同时Druid不只仅是一个数据库链接池,它包括四个部分:
Druid是一个JDBC组件,它包括三个部分:
基于Filter-Chain模式的插件体系。
DruidDataSource 高效可管理的数据库链接池。
SQLParser
Druid的功能
一、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库链接池。
二、能够监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,可以详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
三、数据库密码加密。直接把数据库密码写在配置文件中,这是很差的行为,容易致使安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
四、SQL执行日志,Druid提供了不一样的LogFilter,可以支持Common-Logging、Log4j和JdkLog,你能够按须要选择相应的LogFilter,监控你应用的数据库访问状况。
五、扩展JDBC,若是你要对JDBC层有编程的需求,能够经过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。
22.Dubbo(原文:https://blog.csdn.net/houshaolin/article/details/76408399)
1. 服务提供者在启动时,向注册中心注册本身提供的服务。
2. 服务消费者在启动时,向注册中心订阅本身所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,若是有变动,注册中心将基于长链接推送变动数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,若是调用失败,再选另外一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
23.转发和重定向的区别?
请求转发 :
a) 只发送一次请求
b) 地址栏不发生改变
c) 数据能够一直传递
d) 只能跳转内部资源, 不能访问外部资源
// 请求转发
req.getRequestDispatcher("dis2").forward(req, resp);
重定向:
a) 会发送屡次请求
b) 地址栏会发生改变
c) 数据不能继续传递
d) 内部资源和外部资源均可以访问
// 重定向
resp.sendRedirect("red2?mouse="+req.getParameter("mouse"));
forward 是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的 响应内容读取过来,而后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的, 因此它的地址栏中仍是原来的地址。redirect 就是服务器端根据逻辑,发送一个状态码,告诉浏览器从新去 请求那个地址,所以从浏览器的地址栏中能够看到跳转后的连接地址,很明显 redirect 没法访问到服务器 保护起来资源,可是能够从一个网站 redirect 到其余网站。forward 更加高效,因此在知足须要时尽可能使用 forward(经过调用 RequestDispatcher 对象的 forward()方法,该对象能够经过 ServletRequest 对象的 getRequestDispatcher()方法得到),而且这样也有助于隐藏实际的连接;在有些状况下,好比须要访问一个 其它服务器上的资源,则必须使用重定向(经过 HttpServletResponse 对象调用其 sendRedirect()方法实现)。
24.JSP 有哪些内置对象?做用分别是什么?
JSP 有 9 个内置对象:
- request:封装客户端的请求,其中包含来自 GET 或 POST请求的参数;
- response:封装服务器对客户端的响应;
- pageContext:经过该对象能够获取其余对象;
- session:封装用户会话的对象;
- application:封装服务器运行环境的对象;
- out:输出服务器响应的输出流对象;
- config:Web 应用的配置对象;
- page:JSP 页面自己(至关于 Java 程序中的 this);
- exception:封装页面抛出异常的对象。