Java常见面试题-100道

        面试题

1、 overload 和override的区别 ?overload的方法是否可以改变返回值的类型?
Overload:重载 Override:重写
重载:同一个类中,方法名相同,参数列表不同。与返回值类型无关。
重写:存在于子父类中,或者子父接口中,方法名相同,参数列表相同。
遵循”两同两小一大“规则:
两同:
方法名相同,参数类型相同
两小:
类型:
基本类型:子类返回类型必须等于父类方法返回的类型
引用类型:子类返回类型小于等于父类方法返回类型,
异常:
子类抛出异常小于等于父类方法抛出异常,
一大:
子类访问权限大于等于父类方法访问权限。

Overload的方法可以改变返回值的类型,因为它与返回值类型无关。

2、 switch是否能作用于byte上,是否能作用于long上,是否能作用于String上?
答案:
可以作用在byte上,不能作用于long上,
switch中可以是字符串类型,String(jdk1.7之后才可以作用在string上)
扩展:
switch可作用于char byte short int
switch可作用于char byte short int对应的包装类
switch不可作用于long double float boolean,包括他们的包装类

3、 简述static和final的用法?
static:修饰属性,方法,代码块
(1)静态属性:也可叫类变量 类名.属性名 来访问
(共有的类变量与对象无关,只和类有关)
注意:类中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,类加载的过程是进行一次。也就是类变量只会被创建一次。
(2)静态方法:类名.方法名 直接访问
注意:static修饰的方法,不能直接访问本类中的非静态(static)成员(包括方法和属性)
本类的非静态方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法。
修饰变量,方法,类

final:修饰变量,类,方法
(1)修饰变量
被fianl修饰的成员变量就是常量(常量名大写),一旦赋值不能改变
修饰局部变量:修饰基本数据类型 -> 变量的值不能改变
修饰引用 -> 引用只能指向固定的对象
修饰实例变量:默认值不生效,可以再赋值
(2)修饰方法 :不能被子类覆盖
(3)修饰类:不能被继承
在一个final类中的所有方法,默认都是final的
注意:final,不能用来修饰构造方法。

4、 JAVA 源文件中是否可以包括多个类,有什么限制?
一个.java文件里可以写多个类,但是只有一个public修饰的类.

5、 写出冒泡排序的算法

for(int i=0;i for(int j=0;j if(arr[j]>arr[j+1]){ //每次都是和它下一个元素比
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
java中有几种数据类型?基本类型有哪几种?以及各占的字节数?
两种数据类型:基本类型和引用类型

基本类型:
数据类型 占的字节数
byte 1
boolean 1
short 2
char 2
int 4
float 4
long 8
double 8

6、abstract class 和 interface 有什么区别?

abstract class	interface

实例化 不能 不能
类 一种继承关系,一个类只能使用一次继承关系。可以通过实现多个接口 一个类可以实现多个interface
数据成员 可有自己的 静态的不能被修改即必须是static final,一般不在此定义
方法 可以私有的,非abstract方法,必须实现 不能有私有的,默认是public,abstract 类型
变量 可有私有的,变量有默认的类型,其值可以在子类中重新定义,也可以重新赋值 不可有私有的,默认是public static final 型,且必须给其初值,实现类中不能重新定义,不能改变其值。
设计理念 表示的是“is-a”关系 表示的是“like-a”关系
实现 需要继承,要用extends 要用implements

1.相同点
A. 两者都是抽象类,都不能实例化。
B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

  1. 不同点
    A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
    B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
    C. interface强调特定功能的实现,而abstract class强调所属关系。
    D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。

7、类有哪三个基本特性?各特性的优点?

类具有封装性、继承性和多态性。

封装性:类的封装性为类的成员提供公有、缺省、保护和私有等访问权限,目的是隐藏类中的私有变量和类中方法的实现细节。

继承性:允许通过继承原有类的某些特性或全部特性而产生全新的类,原有的累称为父类,产生的新类称为子类。子类不仅可以直接继承父类的共性,而且也可以创建它特有的个性。

多态性:是指在基类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同行为,多态性有两种表现形式:重载和覆盖。
8.Error和Exception有什么区别? 列出你见过的Exception并简要说明

答:error表示系统级的错误和程序不必处理的异常,
是恢复不是不可能但很困难的情况下的一种严重问题;
比如内存溢出,不可能指望程序能处理这样的情况;
exception表示需要捕捉或者需要程序进行处理的异常,
是一种设计或实现问题;也就是说,它表示如果程序运行正常,
从不会发生的情况。 常见异常有: NullPointerException:
当操作一个空引用时会出现此错误。 NumberFormatException:
数据格式转换出现问题时出现此异常。 ClassCastException:
强制类型转换类型不匹配时出现此异常。 ArrayIndexOutOfBoundsException:
数组下标越界,当使用一个不存在的数组下标时出现此异常。

9.java中会存在内存泄露吗?请简单描述。

答:内存泄露是指系统中存在无法回收的内存,
有时候会造成内存不足或系统崩溃。Java存在内存泄露。
Java中的内存泄露当然是指:存在无用但是垃圾回收器无法回收的对象。
而且即使有内存泄露问题存在,也不一定会表现出来。
自己实现堆栈的数据结构时有可能会出现内存泄露。

10.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

答:多线程有两种实现方法:继承Thread类或者实现Runnable接口。
实现同步也有两种方法:一种是同步方法,另一种是同步代码块。
同步方法是在方法返回类型前面加上synchronized关键字
同步代码块是synchronized (这里写需要同步的对象){…}

11.sleep()和wait()有什么区别?
答案:
(2)不同点:

  1. Thread类的方法:sleep(),yield()等
    Object的方法:wait()和notify()等
    2.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
    sleep方法没有释放锁,
    wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
    3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
    4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

12.请说出集合类中List、Map、Set的区别

答:List和Set继承了Collection接口,而map不是;
List中存放元素有顺序并且可以重复;
set中存放的元素是无序并且是不可能重复的;
Map中存放是键值对。

13.Collection 和 Collections的区别?

答:Collection是java.util下的接口,它是各种集合的父接口,
继承于它的接口主要有Set 和List;Collections是个java.util下的类,
是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

14.谈谈java跟你所知道的其它的语言相比,有什么优点??

Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
Java是功能完善的通用程序设计语言,可以用来开发可靠的、要求严格的应用程序。
java是纯面向对象开发,功能强大,分支众多,没有java不能做的软件。C/S也好B/S也好。从功能上讲,没有语言可以和java相比。
C是面向过程编程的,这样往往会导致所谓的单一程序,既所有的功能只能包含在几个(通常是一个)代码模块中。当然,C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数族下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
15. 谈谈你对面向对象的理解??
所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。封装是我们所说的面相对象编程的特征之一。除此之外还有继承和多态。继承有点类似与我们生物学上的遗传,就是子类的一些特征是来源于父类的,儿子遗传了父亲或母亲的一些性格,或者相貌,又或者是运动天赋。有点种瓜得瓜种豆得豆的意思。面向对象里的继承也就是父类的相关的属性,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有点我们只要拿过来用就好了。而对于自己类里面需要用到的新的属性和方法,子类就可以自己来扩展了。当然,会出现一些特殊情况,就是我们在有一些方法在父类已经定义好了,但是子类我们自己再用的时候,发现,其实,我们的虽然都是计算工资的,但是普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。这个时候我们就需要用到面向对象的另一个特性,多态。对,就是多态,我们要在子类里面把父类里面定义计算工资的方法在子类里面重新实现一遍。多态包含了重载和重写。重写很简单就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了,当然啦,你还是可以通过super.CaculSalary方法来调用父类的工资计算方法。而重载就是类里面相同方法名,不同形参的情况,可以是形参类型不同或者形参个数不同,或者形参顺序不同,但是不能使返回值类型不同。
16. 简单讲一下java的跨平台原理
java源程序(.java文件)通过编译器编译成为Class文件(字节码文件),而它的class文件是基于字节码(以byte为单位存储的文件)的,而字节码文件是描述程序要运行的的虚指令的集合,这些虚指令的集合与任何的平台无关,Java虚拟机认识它(只要在不同的平台下部署相应的jre,运行jvm!就可以了)
17. 有了基本数据类型,为什么还需要包装类型?
我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。
18. 说一下"=="和equals方法究竟有什么区别?
操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用操作符。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
19.讲一下java中的集合?
set(集)、list(列表)和map(映射)。
区别嘛 HASHMAP只有KEY和value值对应的。。set是可以自动清楚相同的元素
list是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。

  1. String、StringBuffer和StringBuilder的区别?
  2. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
  3. 再来说线程安全
    在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
    String:适用于少量的字符串操作的情况
      StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
    StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
  4. ArrayList和LinkedList的区别?
    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
    2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
    3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
  5. 讲一下HashMap哈HashTable的区别?
    在Java 2以前,一般使用Hashtable来映射键值和元素。为了使用Java集合框架,Java对Hashtable进行了重新设计,但是,为了向后兼容保留了所有的方法。Hashtable实现了Map接口,除了Hashtable具有同步功能之外,它与HashMap的用法是一样的。·
    在使用时一般是用ArrayList代替Vector,LinkedList代替Stack,HashMap代替HashTable,即使在多线程中需要同步,也是用同步包装类。
  6. 讲一下线程的几种实现方式?
    extends Thread
    implements Runnable
    implements Callable
    Runnable和Callable的区别是,
    (1)Callable规定的方法是call(),Runnable规定的方法是run()。
    (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
    (3)call方法可以抛出异常,run方法不可以
    (4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。
  7. 讲一下线程的几种启动方式?
    .第一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法,然后在run方法里填写相应的逻辑代码。
    第二种方法是实现Runnable接口,并编写run方法,相比继承Thread类创建线程的好处是以实现接口的方式创建线程可以对类进行更好的扩展,该类可以继承其他类来扩展自身需求,相比第一种方式更加灵活,扩展性强。
    实现Callable接口创建线程与Runnable接口的不同之处在于:如果你想要在线程执行完毕之后得到带有返回值的线程则实现Callable接口
  8. 有没有使用过线程并发库?
    在java5之后,就有了线程池的功能了,在介绍线程池之前,先来简单看一下线程池的概念。假设我开了家咨询公司,那么每天会有很多人过来咨询问题,如果我一个个接待的话,必然有很多人要排队,这样效率就很差,我想解决这个问题,现在我雇几个客服,来了一个咨询的,我就分配一个客服去接待他,再来一个,我再分配个客服去接待……如果第一个客服接待完了,我就让她接待下一个咨询者,这样我雇的这些客服可以循环利用。这些客服就好比不同的线程,那么装这些线程的容器就称为线程池。
  9. 静态变量和实例变量的区别?
    静态变量也叫类变量,这种变量前加了static修饰符。可以直接用类名调用,也可以用对象调用,而且所有对象的同一个类变量 都是共享同一块内存空间。
    实例变量也叫对象变量,这种变量没有加static修饰符。只能通过对象调用, 而且所有对象的同一个实例变量是共享不同的内存空间的。
    区别在于:
    静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再去获取它的值,得到的是改变后的值;
    实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象取值的结果,其他对象仍会得到实例变量一开始就被赋予的值。
  10. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
    会执行 try{}中的return执行后在没有返回数据时先去执行finally{}中的代码,然后再返回。所以说finally{}在return中间执行
  11. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。
    如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取.
    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率.
  12. java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承, 请说出他们分别是哪些类?
    Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的.
  13. 什么是事务处理?
    事务是这样一种机制,它确保多个SQL语句被当作单个工作单
    元来处理。事务具有以下的作用:
  • 一致性:同时进行的查询和更新彼此不会发生冲突,其他
    用户不会看到发生了变化但尚未提交的数据。
  • 可恢复性:一旦系统故障,数据库会自动地完全恢复未完
    成的事务。
  1. &和&&的区别?
    &和&&都可以用作逻辑运算符,表示逻辑与。当运算符两边的表达式都为true时,结果才为true;否则,结果为false。
    另外&&还具有短路功能,也就是说,当&&左边的表达式结果为false时,将不再运算&&右边的表达式,结果肯定为false。例如,对于if(str!=null&&!str.equals(“”)),当str为null时,不会对&&右边的表达式进行运算,否则会出现空指针异常。
    &还可以用作位运算符,当&两边的表达式不是boolean类型时,&表示按位与。

  2. 数组有没有length()这个方法? String有没有length()这个方法?
    数组中没有length()这个方法,但是数组中有length这个属性。用来表示数组的长度。
    String中有length()这个方法。用来得到字符串的长度。

  3. 构造器Constructor是否可被override?
    构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
    Constructor不能被继承,所以Constructor也就不能被override。每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须负责在一开始调用父类的构造函数。

  4. 构造器如何工作?
    Java在构造实例时的顺序是这样的:
    1、分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。   
    2、执行属性值的显式初始化   
    3、执行构造器   
    4 、将变量关联到堆中的对象上

  5. super与this的区别?
    不同点:
    1、super()主要是对父类构造函数的调用,this()是对重载构造函数的调用
    2、super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用;this()主要是在同一类的不同构造函数中的使用
    相同点:
    1、super()和this()都必须在构造函数的第一行进行调用,否则就是错误的

  6. GC是什么? 为什么要有GC?
    GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,
    忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,
    Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),但JVM可以屏蔽掉显示的垃圾回收调用。

垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。
37. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数
38、内部类可以引用他包含类的成员吗?有没有什么限制?
完全可以。如果不是静态内部类,那没有什么限制!
如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员
39.mysq数据库的优化问题。
1、选取最适用的字段属性
MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
2、使用连接(JOIN)来代替子查询(Sub-Queries)
MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,
3、、使用联合(UNION)来代替手动创建的临时表
MySQL从4.0的版本开始支持union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用UNION作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数目要想同
4、事物
事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。
5、锁定表
尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户来使用,事务造成的影响不会成为一个太大的问题;但假设有成千上万的用户同时访问一个数据库系统,例如访问一个电子商务网站,就会产生比较严重的响应延迟。
6、使用外键
锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。
7、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。
8、优化的查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。
40、JDBC连接数据库的步骤
1)加载(注册)数据库驱动(到JVM)。
2)建立(获取)数据库连接。
3)创建(获取)数据库操作对象。
4)定义操作的SQL语句。
5)执行数据库操作。
6)获取并操作结果集。
7)关闭对象,回收数据库资源(关闭结果集–>关闭数据库操作对象–>关闭连接)。
41、statement与preparstatement区别
在JDBC应用中,你应该始终以PreparedStatement代替Statement.

一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
二、PreparedStatement能尽最大可能提高性能.
三.最重要的一点是极大地提高了安全性.

42.什么是视图、索引 、 约束?
索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
索引存在的目的是为提高查询执行的速度。
视图(view)
存储的SELECT语句,基于基表的查询结果。视图也叫虚表。一般不建议将内容插入或更新视图,因为视图是受到基表的字段限制。在mysql中用处不是很大。
约束
域约束:数据类型约束
外键约束:引用完整性约束
主键约束:主键是某字段能唯一标识此字段所属的实体,并且不允许为空。符合这个条件的被称为候选主键。一个表只能有一个主键。不允许2个实体在主键上出现相同值。
唯一性约束:每一行的某字段都不允许出现相同值。但是可以为空。表中可出现多个。
检查性约束: 自定义约束条件。mysql上功能比较薄弱。
43. DDL包含哪些操作、DML包含哪些操作?
DML(data manipulation language):
它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
DDL(data definition language):
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
DCL(Data Control Language):
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL

44.Oracle与mysql有什么区别?
mysql:
mysql没有类似oracle的构造多版本数据块的机制,只支持read commited的隔离级别。一个session读取数据时,其他session不能更改数据,但可以在表最后插入数据。
session更新数据时,要加上排它锁,其他session无法访问数据。

三、事务
oracle很早就完全支持事务。

mysql在innodb存储引擎的行级锁的情况下才支持事务。

四、数据持久性
oracle
保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,
如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。
mysql:
默认提交sql语句,但如果更新过程中出现db或主机重启的问题,也许会丢失数据。

五、提交方式
oracle默认不自动提交,需要用户手动提交。
mysql默认是自动提交。

六、逻辑备份

oracle逻辑备份时不锁定数据,且备份的数据是一致的。

mysql逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用。

七、热备份
oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。即使备份的数据库不一致,也可以在恢复时通过归档日志和联机重做日志进行一致的回复。
mysql:
myisam的引擎,用mysql自带的mysqlhostcopy热备时,需要给表加读锁,影响dml操作。
innodb的引擎,它会备份innodb的表和索引,但是不会备份.frm文件。用ibbackup备份时,会有一个日志文件记录备份期间的数据变化,因此可以不用锁表,不影响其他用户使用数据库。但此工具是收费的。
innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。

八、sql语句的扩展和灵活性
mysql对sql语句有很多非常实用而方便的扩展,比如limit功能,insert可以一次插入多行数据,select某些管理数据可以不加from。
oracle在这方面感觉更加稳重传统一些。

九、复制
oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理较复杂。
mysql:复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。且需要手工切换丛库到主库。

十、性能诊断
oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等
mysql的诊断调优方法较少,主要有慢查询日志。

十一、权限与安全

mysql的用户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
oracle的权限与安全概念比较传统,中规中矩。

十二、分区表和分区索引
oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
mysql的分区表还不太成熟稳定。

十三、管理工具
oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。
mysql管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin, etc),有一定复杂性。

45.JSP九大内置对象分别是?
1、request对象
  request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
  2、response对象
  response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,只在JSP页面内有效。
  3、session对象
  session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
  4、application对象
  application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
  5、out 对象
  out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
  6、pageContext 对象
  pageContext 对象的作用是取得任何范围的参数,可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
  7、config 对象
  config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
  8、page 对象
  page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
  9、exception 对象
  exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况;在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

  1. 请写出 JavaScript 中常用的三种事件并解释。
    例如:onclick,onblur,onChange
    并分别写出js代码其中包含事件的应用。
    答案:
    (1)— onchange ( HTML事件属性 )
    onchange 在元素值改变时触发。
    onchange 属性适用于:input、textarea 以及 select元素。
    (2)— onclick 事件会在对象被点击时发生。
    请注意, onclick 与 onmousedown 不同!
    单击事件是在同一元素上发生了鼠标按下事件之后又发生了鼠标放开事件时才发生的。
    支持该事件的 JavaScript 对象:
    button, document, checkbox, link, radio, reset, submit
    (3)— onblur( HTML事件属性 )
    onblur 事件会在对象失去焦点时发生。
    支持该事件的 JavaScript 对象:
    button, checkbox, fileUpload, layer, frame, password, radio, reset, submit, text, textarea, window
  2. 介绍一下 springMVC 的工作原理?
    要求:mvc组件介绍,各个组件流程,如何在开发中配置。(可画图)
    答案:
    springMVC工作原理:整个处理过程从一个HTTP请求开始:
    1)DispatcherServlet接收到请求后,根据对应配置文件中配置的处理器映射,找到对应的处理器映射项(HandlerMapping),根据配置的映射规则,找到对应的处理器(Handler)。
    2)调用相应处理器中的处理方法,处理该请求,处理器处理结束后会将一个ModelAndView类型的数据传给DispatcherServlet,这其中包含了处理结果的视图和视图中要使用的数据。
    3)DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将视图要显示的数据传给对应的视图,最后给浏览器构造一个HTTP响应。
    DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:
    1)截获符合特定格式的URL请求。
    2)初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
    3)初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。

48 简述servlet生命周期。
答案:Servlet容器如何去创建Servlet对象,分配资源,调用service方法处理请求,
以及销毁Servlet对象的整个过程。
(1)阶段一: 实例化(就是创建servlet对象,调用构造器)
在如下两种情况下会进行对象实例化。
第一种情况:
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例。
第二种情况:
容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有 load-on-starup配置。如果有,则会创建该servlet实例。
load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。
(2)阶段二: 初始化

为servlet分配资源,调用init(ServletConfig config);方法
config对象可以用来访问servlet的初始化参数。
初始化参数是使用init-param配置的参数。
init可以override。
(3)阶段三: 就绪/调用
有请求到达容器,容器调用servlet对象的service()方法。
(4)阶段四: 销毁
容器依据自身的算法,将不再需要的servlet对象删除掉。
在删除之前,会调用servlet对象的destroy()方法。
destroy()方法用于释放资源。
在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。
49. 简述session和cookie
要求:概念,使用,区别方面描述
答案:
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
cookie 和session 的联系:
session是通过cookie来工作的
session和cookie之间是通过 C O O K I E [ ′ P H P S E S S I D ′ ] 来 联 系 的 , 通 过 _COOKIE['PHPSESSID']来联系的,通过 COOKIE[PHPSESSID]_COOKIE[‘PHPSESSID’]可以知道session的id,从而获取到其他的信息。
在购物网站中通常将用户加入购物车的商品联通session_id记录到数据库中,当用户再次访问是,通过sessionid就可以查找到用户上次加入购物车的商品。因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。

50.描述 JSP 和 Servlet 的区别、共同点、各自应用的范围
答案:
JSP在本质上就是SERVLET,但是两者的创建方式不一样.Servlet完全是JAVA程序代码构成擅长于流程控制和事务处理而通过Servlet
来生成动态网页;JSP由HTML代码和JSP标签构成,可以方便地编写动态网页
因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.

答案2:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP

51、转发跟重定向的区别
转发是服务器行为,重定向是客户端行为
1.转发在服务器端完成的;重定向是在客户端完成的
2.转发的速度快;重定向速度慢
3.转发的是同一次请求;重定向是两次不同请求
4.转发不会执行转发后的代码;重定向会执行重定向之后的代码
5.转发地址栏没有变化;重定向地址栏有变化
6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
52. short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
答:对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。
53、Java有没有goto?
答:goto 是Java中的保留字,在目前版本的Java中没有使用。(根据James Gosling(Java之父)编写的《The Java Programming Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)
54. 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。
答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
55. 用最有效率的方法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
56. 在Java中,如何跳出当前的多重嵌套循环?
答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。(Java中支持带标签的break和continue语句,作用有点类似于C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好)

  1. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
    答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

  2. char 型变量中能不能存贮一个中文汉字,为什么?
    答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。

  3. mysql有关权限的表都有哪几个
    MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
    user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
    db权限表:记录各个帐号在各个数据库上的操作权限。
    table_priv权限表:记录数据表级的操作权限。
    columns_priv权限表:记录数据列级的操作权限。
    host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

  4. Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?
    答:可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和回调。
    61、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?
    答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。
    62、Java 中的final关键字有哪些用法?
    答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

  5. 数据库事物有哪几种?
    隔离性、持续性、一致性、原子性

  6. 比较一下Java和JavaSciprt。
    答:JavaScript 与Java是两个公司开发的不同的两个产品。Java 是原Sun Microsystems公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而JavaScript是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言。JavaScript的前身是LiveScript;而Java的前身是Oak语言。
    下面对两种语言间的异同作如下比较:

  • 基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。
  • 解释和编译:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运行效率)
  • 强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。
  1. 列出一些你常见的运行时异常?
    答:
  • ArithmeticException(算术异常)
  • ClassCastException (类转换异常)
  • IllegalArgumentException (非法参数异常)
  • IndexOutOfBoundsException (下标越界异常)
  • NullPointerException (空指针异常)
  • SecurityException (安全异常)
    66、阐述final、finally、finalize的区别。
    答:
  • final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。
  • finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
  • finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。
  1. 阐述ArrayList、Vector、LinkedList的存储性能和特性。
    答:ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。
  2. Collection和Collections的区别?
    答:Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
  3. List、Map、Set三个接口存取元素时,各有什么特点?
    答:List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。
  4. 当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
    答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。
    71、请说出与线程同步以及线程调度相关的方法。
    答:
  • wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
  • sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
  • notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;
  • notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;
  1. Java中如何实现序列化,有什么意义?
    答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。
    要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆
    73.XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
    答:XML文档定义分为DTD和Schema两种形式,二者都是对XML语法的约束,其本质区别在于Schema本身也是一个XML文件,可以被XML解析器解析,而且可以为XML承载的数据定义类型,约束能力较之DTD更强大。对XML的解析主要有DOM(文档对象模型,Document Object Model)、SAX(Simple API for XML)和StAX(Java 6中引入的新的解析XML的方式,Streaming API for XML),其中DOM处理大型文件时其性能下降的非常厉害,这个问题是由DOM树结构占用的内存较多造成的,而且DOM解析方式必须在解析文件之前把整个文档装入内存,适合对XML的随机访问(典型的用空间换取时间的策略);SAX是事件驱动型的XML解析方式,它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过事件回调代码来处理XML文件,适合对XML的顺序访问;顾名思义,StAX把重点放在流上,实际上StAX与其他解析方式的本质区别就在于应用程序能够把XML作为一个事件流来处理。将XML作为一组事件来处理的想法并不新颖(SAX就是这样做的),但不同之处在于StAX允许应用程序代码把这些事件逐个拉出来,而不用提供在解析器方便时从解析器中接收事件的处理程序。
    74、你在项目中哪些地方用到了XML?
    答:XML的主要作用有两个方面:数据交换和信息配置。在做数据交换时,XML将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再从XML文件中还原相关信息进行处理,XML曾经是异构系统间交换数据的事实标准,但此项功能几乎已经被JSON(JavaScript Object Notation)取而代之。当然,目前很多软件仍然使用XML来存储配置信息,我们在很多项目中通常也会将作为配置信息的硬代码写在XML文件中,Java的很多框架也是这么做的,而且这些框架都选择了dom4j作为处理XML的工具,因为Sun公司的官方API实在不怎么好用。
  2. 什么是DAO模式?
    答:DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。DAO模式实际上包含了两个模式,一是Data Accessor(数据访问器),二是Data Object(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。
  3. 如何通过反射创建对象?
    答:
  • 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()
  • 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);
  1. 简述一下你了解的设计模式。
    答:所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简单方便的复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
    在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中给出了三类(创建型[对类的实例化过程的抽象化]、结构型[描述如何将类或对象结合在一起形成更大的结构]、行为型[对在不同的对象之间划分责任和算法的抽象化])共23种设计模式,包括:Abstract Factory(抽象工厂模式),Builder(建造者模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式);Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(责任链模式)。
    面试被问到关于设计模式的知识时,可以拣最常用的作答,例如:
  • 工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
  • 代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。实际开发中,按照使用目的的不同,代理可以分为:远程代理、虚拟代理、保护代理、Cache代理、防火墙代理、同步化代理、智能引用代理。
  • 适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够一起工作。
  • 模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法(多态实现),从而实现不同的业务逻辑。
    除此之外,还可以讲讲上面提到的门面模式、桥梁模式、单例模式、装潢模式(Collections工具类和I/O系统中都使用装潢模式)等,反正基本原则就是拣自己最熟悉的、用得最多的作答,以免言多必失。
  1. forward 和redirect的区别
      forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

  2. spring框架中需要引用哪些jar包,以及这些jar包的用途
    答:spring框架是一个分层架构,由7个定义良好的模块组成:核心容器、spring上下文、springAOP、DAO、ORM、Web、MVC是一系列轻量级Javaee框架的集合。

  3. springMVC注解的意思
    答:@Controller注解标识一个控制器,@RequestMapping注解标记一个访问的路径(/index.htm),return "index"标记返回视图(index.jsp);
    @RequestMapping中定义访问页面的URL模版,使用{}传入页面参数,使用@PathVariable 获取传入参数
    使用@RequestParam 注解获取GET请求或POST请求提交的参数

  4. spring中beanFactory和ApplicationContext的联系和区别
    答:BeanFactory基本的工厂解析,管理,实例化所有容器内的bean的接口,spring中所有解析配置文件的类都直接或者间接实现该接口
    ApplicationContext接口implements BeanFactory
    创建对象的特点:
    BeanFactory在解析配置文件时并不会初始化对象,只有在使用对象时(getBean())才会对该对象进行初始化
    ApplicationConte在解析配置文件时对配置文件中的所有对象都初始化了,getBean()方法只是获取对象的过程

  5. spring注入的几种方式(循环注入)
    答:有三种方式:属性注入(setter注入)、构造器注入、工厂注入

  6. spring如何实现事物管理的
    答:(1)事务的4个特性
    (2)事物的实现方式:编码式:使用TransactionTemplate和直接使用PlatformTransactionManager
    (3)声明式事务:基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。
    声明式事务管理又有两种方式:基于XML配置文件的方式;另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。

  7. 如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?

  8. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。

  9. springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

  10. Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

  11. SSM优缺点、使用场景?

  12. Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

  13. Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

  14. Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

  15. 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

  16. 简单介绍下你对mybatis的理解?

  17. mybatis配置

  18. SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。

  19. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。

  20. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

  21. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。

  22. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。

  23. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。

  24. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。

  25. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

  26. MySQL的复制原理以及流程
    基本原理流程,3个线程以及之间的关联;

  27. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;

  28. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中;

  29. 从:sql执行线程——执行relay log中的语句;

  30. MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
    (1)、varchar与char的区别
    char是一种固定长度的类型,varchar则是一种可变长度的类型
    (2)、varchar(50)中50的涵义
    最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)
    (3)、int(20)中20的涵义
    是指显示字符的长度
    但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0
    20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;
    (4)、mysql为什么这么设计
    对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样;

  31. 问了innodb的事务与日志的实现方式
    (1)、有多少种日志;
    错误日志:记录出错信息,也记录一些警告信息或者正确的信息。
    查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。
    慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
    二进制日志:记录对数据库执行更改的所有操作。
    中继日志:
    事务日志:

(2)、事物的4种隔离级别
隔离级别
读未提交(RU)
读已提交(RC)
可重复读(RR)
串行

(3)、事务是如何通过日志来实现的,说得越深入越好。
事务日志是通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现的,当开始一个事务的时候,会记录该事务的lsn(log sequence number)号; 当事务执行时,会往InnoDB存储引擎的日志
的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为“预写日志方式”
90. 一个6亿的表a,一个3亿的表b,通过外间tid关联,你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。
1、如果A表TID是自增长,并且是连续的,B表的ID为索引
select * from a,b where a.tid = b.id and a.tid>500000 limit 200;

2、如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。
select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;
91. 如何连接到MySQL数据库?
连接到MySQL数据库有多种写法,假设MySQL服务器的地址为192.168.59.130,可以通过如下几种方式来连接MySQL数据库:
① mysql -p
② mysql -uroot -p
③ mysql -uroot -h192.168.59.130 -p
答案:运行命令:show databases;。
92. 如何切换到某个特定的数据库?
运行命令:use database_name;。
93. 用哪些命令可以查看MySQL数据库中的表结构?
查看MySQL表结构的命令有如下几种:
(1) DESC 表名;
(2) SHOW COLUMNS FROM 表名;
(3) DESCRIBE 表名;
(4) SHOW CREATE TABLE 表名;
(5) USE INFORMATION_SCHEMA。

  1. MYSQL相比于其他数据库有哪些特点?
    MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,现在已经被Sun公司收购,支持FreeBSD、Linux、MAC、Windows等多种操作系统与其他的大型数据库例如Oracle、DB2、SQL Server等相比功能稍弱一些
    1、可以处理拥有上千万条记录的大型数据
    2、支持常见的SQL语句规范
    3、可移植行高,安装简单小巧
    4、良好的运行效率,有丰富信息的网络支持
    5、调试、管理,优化简单(相对其他大型数据库)

  2. 现有教师关系Teacher(教师编号,姓名,年龄,性别,家庭住址),现在要查询姓“李”的且家庭住址包含“西安市”的教师,则筛选条件是( )

    姓名LIKE ‘李%’ And 家庭住址LIKE ‘%西安市%’

  3. sql语句应该考虑哪些安全性?
    答:
    (1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量。
    (2)最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账户。
    (3)当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息。

  4. 请简述项目中优化sql语句执行效率的方法,从哪些方面。sql语句性能如何分析?
    答:
    (1)尽量选择较小的列
    (2)将where中用的比较频繁的字段建立索引
    (3)select子句中避免使用‘*’
    (4)避免在索引列上使用计算,not,in和<>等操作
    (5)当只需要一行数据的时候使用limit 1
    (6)保证表单数据不超过200w,适时分割表
    (7)针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况

  5. mysql存储引擎有哪些?如何修改mysql存储引擎?
    MyISAM indexed sequential access method (有索引的顺序访问方法)
    MyISAM 具有检查和修复表格的大多数工具。表格可以被压缩,而且支持全文收索
    不是事务安全的,而且不支持外键。
    MEMORY 也是以前的(HEAP) 该类型表存储在内存中,表的索引是哈希分布的。
    merge 这些表为了查询目的,把myisam 表集合作为单个表,因此你可以在某些操作系统中避开最大文件大小的限制。
    archive 这种类型的表只支持,insert ,select 不支持delete,update,replace ,不使用索引。
    csv 这些表保存在服务器的单个文件中,它包含了用逗号间隔的数据。
    innodb 这种表是事务安全的。提供了commit(提交) rollback(实务回滚)支持外键,比myisam慢。
    修改mysql存储引擎alter table tablename type = innodb;
    99、MYSQL 数据表修复及数据恢复面试题
    MYSQL数据表在什么情况下容易损坏?
    服务器突然断电导致数据文件损坏。
    强制关机,没有先关闭mysql 服务等。
    数据表损坏后的主要现象是什么?
    从表中选择数据之时,得到如下错误:Incorrect key file for table: ‘…’. Try to repair it
    查询不能在表中找到行或返回不完全的数据。
    Error: Table ‘p’ is marked as crashed and should be repaired 。
    打开表失败: Can’t open file: ‘×××.MYI’ (errno: 145) 。
    数据表损坏的修复方式有哪些?
    使用 myisamchk 来修复,具体步骤:
    1)修复前将mysql服务停止。
    2)打开命令行方式,然后进入到mysql的/bin目录。
    3)执行myisamchk –recover 数据库所在路径/*.MYI
    使用repair table 或者 OPTIMIZE table命令来修复,REPAIR TABLE table_name 修复表 OPTIMIZE TABLE table_name 优化表 REPAIR TABLE 用于修复被破坏的表。
    OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,使用了OPTIMIZE TABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库)

  6. 有一个关于公司员工信息的数据库empinfo。部门表和员工基本信息表是其中的两个表,表中信息如下:
    部门表depts ( dept_id、dept_name、description)
    说明:dept_id 部门编号 dept_name 部门名称 description 部门描述

员工表employees(id、name、gender、dept_id、join_time、salary、address、age、des)
说明:id员工号 name员工姓名gender性别 dept_id所在部门join_time加入时间salary工资 address地址 age年龄des描述
1)分析各个表之间的关系(主外键引用关系),写出建表语句(6分)
create table depts(dept_id int primary key ,dept_name nvachar(50),description nvarchar(100));
create table employees(id int primary,name nvarchar(50),gender char(10),dept_id int,join_time datetime,salary decemical(2,9),address nvarchar(50),age int,des nvarchar(100),constraint e_fk foreign key(dept_id) references depts(dept_id));

2)为员工表employees添加一个字段image用于记录员工头像(2分)
Alter table employees add image nvarchar(100) not null;

3)查询除了名字叫张三以外的员工的记录(2分)
Select *from employees where name not int(‘张三’)

4)查询薪水在2000-5000之间的员工记录(2分)
Select *from employees where salary >2000 and salary <5000;

5)查询部门编号是1、3、5的员工的记录(2分)
Select *from employees where dept_id int(1,3,5);

6)查询名字以“张”开头的员工的记录(2分)
Select *from employees where name like ‘张%’;

7)查询性别为“M”且在2008年1月1日入职的员工的记录(2分)
Select *from employees where gender=’M’AND join_time=’2018-1-1’;

8)查询出平均月薪最高的部门编号与名字(3分)
Select dept_id,name where group by dept_id having out max(avg(salary));

9)为employees表的name列创建索引(2分)
Create index index_employees on employees (name);

10)创建视图, EMP_V_10, 包括10号部门的信息和所有职员信息(3分)
Create view EMP_V_10 as select employees.,depts. from employees,depts where dept_id=10;

11)创建一个用户test1使他只拥有查询employees表的权限(2分)
Grante select on empinfo.employees to ‘test1@localhost’identity by ‘test1’;

12)授予普通DBA用户(systop)管理empinfo数据库的权限(2分)
Grante * on empinfo.*to ‘systop@localhost’identity by ‘systop’;

13)授予用户test3拥有employees表name列的更改权限(3分)
Grante update on empinfo.employees.name to ‘test3@localhost’identity by ‘test3’;

14)为employees表开启事务功能的操作步骤(4分)
Begin transaction
执行事务体语句{…}
if@error>0
Begin
Rollback transaction
End
Else
Begin
Commit transaction
End
End
15)写出将empinfo数据库备份到远程服务器182.21.32.129的方法和步骤(5分)
备份-发送-导入
Mysqldump -u root -p --all-database >empinfo.sql
Scp empinfo.sql 182.21.32.129 /tmp
Mysql -u root -p < /tmp/empinfo.sql

你可能感兴趣的:(面试题,java,mysql,sql)