1. overload 和 override 的区别?overload的方法是否可以改变返回值的类型?
Overload:重载 Override:重写
重载:在同一个类中,方法名相同,参数列表不同。与返回值类型无关。
重写:存在于父子类中,或者子父接口中,方法名相同,参数列表相同。
遵循“两同两小一大”规则:
1.两同:方法名相同,参数列表相同
2.两小:a:派生类方法的返回值类型小于或等于超类方法的
void和基本类型时,必须相等
引用类型时,小于或等于
b:派生类方法抛出的异常小于或等于超类方法的
3:一大:派生类访问权限大于或等于超类的方法
Overload的方法可以改变返回值类型,因为它与返回值类型无关。
2. switch是否能作用于byte上,是否能作用于long上,是否能作用于String上?
可以作用再byte上,不能作用于long上
switch中可以是String,(JDK1.7之后可以作用再string)
switch可作用于:byte,short,int,char,string,枚举类型,其他类型不允许
switch可作用于:byte,short,int对应的包装类
switch不可作用于:long,double,float,boolean,以及他们的包装类
3. 简述static 和final的用法
static:修饰属性,方法,代码块
(1)静态属性:也可以叫类变量 类名.属性名 来访问
(共有的类变量与对象无关,只和类有关)
注意:嘞中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量, 是在类加载时被创建并进行初始化,类加载的过程是进行一次。也就是类变量只会被创 建一次。
(2)静态方法:类名.方法名 直接访问
注意:static修饰的方法,不能直接访问本类中的非静态(static)成员(包括方法和属 性)本类的非静态方法可以访问本类的静态成员(包括方法和属性),可以调用 静态方法。修饰变量,方法,类。
final:修饰变量,类,方法
(1)修饰变量
被final修饰的成员变量就是常量(常量名大写),一旦赋值不能改变
修饰局部变量:修饰基本数据类型——>变量的值不能改变
修饰引用——>引用只能指向固定的对象
修饰实例变量:默认值不生效,可以再赋值
(2)修饰方法:不能被子类覆盖
(3)修饰类:不能被继承
在一个final类中的所有方法,都默认是final的
注意:final,不能用来修饰构造方法
4. JAVA 源文件中是否可以包括多个类,有什么限制?
一个 .java 文件里可以写多个类,但是只有一个piblic修饰的类!
5. 写出冒泡排序的算法
for(int i=0;i<arr.length-1;i++){//控制轮数
for(int j=0;j<arr.length-1-i;j++){//控制每一轮的次数
if(arr[j]>arr[j+1]){//每次都是和它下一个元素比
int t =arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
冒泡排序思路:
1.比较相邻元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素回是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较。
JAVA中有几种数据类型?基本类型有哪几种?以及各占的字节数?
两种数据类型:基本类型和引用类型
基本类型:
数据类型 | 占的字节数 | 范围 |
byte | 1 | -128——127 |
short | 2 | -32768——32767 |
int | 4 | -2^31——2^31-1 |
long | 8 | -2^63——2^63-1 |
float | 4 | |
double | 8 | |
boolean | 1 | |
char | 2 |
6.abstract class和 interface 有什么区别
abstract class(抽象类) | interface(接口) | |
实例化 | 不能 | 不能 |
类 | 一种继承关系,一个类只能使用一次继承关系。可以通过实现多个接口 | 一个类可以实现多个接口 |
数据成员 | 可有自己的 | 静态的不能被修改,即必须是static final,一般不在此定义 |
方法 | 可以私有的,非abstract方法,必须实现,可定义构造方法,可以有抽象方法和具体方法 | 不能有私有的,默认是public,abstract类型,完全是抽象的,没有构造方法,方法都是抽象的,不存在方法的实现 |
变量 | 可有私有的,变量有默认的类型,其值可以在子类中重新定义,也可以重新赋值 | 不可有私有的,默认是public static final 型,且必须给其初值,实现类中不能重新定义,不能改变其值。 |
设计理念 | 表示的是“is-a” 关系 | 表示的是“like-a” 关系 |
实现方式 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,他需要提供抽象类中所有声明的方法的实现 | 子类使用implements来实现接口。他需要提供接口中所有声明的方法的实现 |
作用 | 把相同的东西提取出来,即重用 | 为了把程序模块进行固化的契约,是为了降低耦合 |
1.相同点
A:两者都是抽象类,都不能实例化
B:interface实现类及abstract class的子类都必须要实现已经声明的抽象方法。
2.不同点
A:interface 需要实现,要用implements,而abstract class需要继承,要用extends。
B:一个类可以实现多个interface,但是一个类只能继承一个abstract class。
C:interface强调特定功能的实现,而abstract class强调所属关系。
D:尽管interface实现类及abstract 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(这里写需要同步的对象){需要多个线程同步执行的代码片段}
互斥锁:当使用多个synchronized锁定多个代码片段,并且指定的锁对象都相同时,这些代码片段就是互斥的。即:多个线程不能同时执行他们。
死锁:以两个线程为例:当两个线程各自持有一个锁的过程中等待对方先释放锁时就会形成一种僵持状态导致程序卡住无法继续后面的执行,这个线下称为死锁
解决死锁:
1.尽量避免在持有一个锁的同时去等待持有另一个锁(避免synchronized嵌套)
2.当无法避免synchronized嵌套时,就必须保证多个线程锁对象的持有顺序必须一致。
即A线程在持有锁1的过程中去持有锁2时,B线程也要以这样的持有顺序进行
11.sleep()和wait()有什么区别?
区别:
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.谈谈你对面向对象的理解?
java是一门纯粹的面向对象的语言。面向对象这种程序设计模式它将现实世界中的一切事物都看作是对象,例如,一个人是一个对象,汽车、飞机、小鸟等等,都是对象;它强调从对象出发,以对象为中心用人类的思维方式来认识和思考问题。每个对象都具有各自的状态特征(也可以称为属性)及行为特征(方法),java就是通过对象之间行为的交互来解决问题的。
所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。
封装是我们所说的面相对象编程的特征之一。除此之外还有继承和多态
Java面向对象的三大特性是什么
封装(面向对象编程核心思想):封装就是将对象的属性和行为特征包装到一个程序单元(即类)中,把实现细节隐藏起来,通过公用的方法来展现类对外提供的功能,提高了类的内聚性,降低了对象之间的耦合性。
继承:对原有类的拓展,指从已有的类中派生新的类,新的类能够吸收已有类的数据属性和行为,并能够扩展新的功能。
多态:是在继承的基础上。是指允许不同类的对象对同一消息做出响应,根据对象创建实例的不同调用不同的方法,本质是编译时和运行时才决定对象的行为。例如,子类类型的对象可以赋值给父类类型的引用变量,但运行时仍表现子类的行为特征(在内存中运行的,new的实例)。也就是说,同一种类型的对象执行同一个方法时可以表现出不同的行为特征。
16.简单讲一下java的跨平台原理
java源程序(.java文件)通过编译器编译成为Class文件(字节码文件),而他的class文件时基于字节码(以byte为单位存储的文件)的,而字节码文件是描述程序要运行的虚指令的集合,这些虚指令的集合与任何的平台无关,java虚拟机认识它(只要在不同的平台下部署相应的JRE,运行JVM就可以了)
17.有了基本数据类型,为什么还需要包装类型?
我们知道Java是一个面向对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这时就需要这些基本类型的包装类型了。
18.说一下“==”和equals方法究竟有什么区别?
(1)==:对于基本类型而言,比较的是数值是否相等
对于引用类型而言,比较的是内存地址是否相等
(2)equals:调用equals()时默认比较的还是==(即比较地址),没有参考意义,
所以常常重写equals()来比较具体的属性值
注意:java的类(String)已经重写equals()了,但是我们自己定义的类必须自己重 写 equals()
派生类重写equals()的基本规则:
a:两个对象必须是同一个类型,若类型不同则返回false
b:若参数对象为null,则返回false
c:原则上两个对象要比较对象的属性是否相同
19.讲一下java中的集合? **
主要分为Collection和Map两大类
1)Collection:是单列集合的顶层父类,是一个独立元素序列,这些元素都服从一条或多条规则。
List必须按照插入的顺序保存元素,而Set不能有重复的元素。即Collection分为这两类。
a:List是可以存放重复元素且有序的集合,每一个元素都有它的索引。第一个元素的索引值为0。
List集合的实现类有LinkedList、ArrayList、Vector、Stack
java.util.ArrayList:内部使用数组实现,查询性能更好
java.util.LinkedList:内部使用链表实现,增删性能更好,首尾增删性能最佳
b:Set集合是一个不允许有重复元素的集合。
Set的实现类有HashSet、TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际是通过TreeMap实现的
2)Map:是双列集合的顶层父类接口,是一个映射接口,即key-value键值对。允许使用键来查找相应的值,从某种意义上来说,他将数字和对象关联在一起。Map中的每一个元素包含“key”和“key”对应的“value”值。
20.String、StringBuffer和StringBuilder的区别?
1.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder>StringBuffer>String
2.再来说线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
String:使用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:使用于多线程在字符缓冲区进行大量操作的情况
21.ArrayList和LinkedList的区别?
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构
2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
3. 对于增加和删除操作add和remove,linkedList比较占优势,因为 ArrayList要移动数据。
22.讲一下HashMap和HashTable的区别? **
1)继承的父类不同:HashMap继承自AbstractMap类,HashTable继承自Dictionary类,已被废弃。二者都实现了Map接口。
2)线程安全性不同:HashMap线程不安全,HaspTable线程安全
3)包含的contains方法不同:HashMap是没有contains方法的,而包括containsValue和containsKey方法;HashTable保留了contains方法,效果通containsValue,还包括containsValue和containsKey方法。
4)是否允许null值:HashMap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;HashTable键值对都不能为空,否则报空指针异常
23.讲一下线程的几种实现方式?
extends Thread
implements Runnable
implements Callable
Runnable和Callable的区别是:
1)Callable规定的方法是call(),Runnable规定的方法是run()。
2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
3)call方法可以抛出异常,run方法不可以
4)运行Callable任务可以拿到一个Future对象,表示一部计算的结果。
24.讲一下线程的几种启动方式?
1)将类声明为Thread的子类。该类应重写Thread类的run方法,然后在run方法里填写相应的逻辑代码。
2)实现Runnable接口,并编写run方法,相比继承Thread类创建线程的好处是以实现接口的方式创建线程可以对类进行更好的扩展,该类可以继承其他类来扩展自身需求,相比第一种方法更加灵活,扩展性强
实现Callable接口创建线程与Runnable接口的不同之处在于:如果你想要在线程执行完毕之后得到带有返回值的线程则实现Callable接口
25.有没有使用过线程并发库?
在java5 之后,就有了线程池功能了,在介绍线程池之前,先简单看一下线程池的概念。
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后再创建线程后自动启动这些任务。线程池线程都是后台线程,每个线程都是用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(正在等待某个事件),则线程池将插入另一个辅助线程是所有处理器保持繁忙。若所有线程池线程都保持繁忙,但队列中还有工作,则会创建新的辅助线程,直至达到最大值,超过最大值则排队。(相当于雇佣几个客服接待,客服即相当于线程)
java通过Executors提供了四个静态方法创建四种线程池
1)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要可灵活回收空闲线程,若无可回收,则新建线程。
2)newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3)newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
4)newSingleThreadExector创建一个单线程化的线程池,他只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行
26.静态变量和实例变量的区别?
静态变量也叫类变量,这种变量前加了static修饰。可以直接用列明调用,也可以用对象调用。而且所有对象的同一个类变量都是共享同一块内存空间。
实例变量也叫对象变量,这种变量没有加static修饰符。只能通过对象调用,而且所有对象的同一个实例变量是共享不同的内存空间的。
区别:
静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再去获取它的值,得到的是改变后的值。
实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其它对象取值的结果,其他对象仍会得到实例变量一开始就被赋予的值。
27.try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,再return前还是后?
会执行 try{}中的return执行后再没有返回数据时先去执行finally{}中的代码,然后再返回。所以说finally{}再return中间执行
28.同步和异步有何异同,在上面情况下分别使用它们?举例说明
如果数据将在线程间共享,例如正在写的数据以后可能会被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效
29.java 中有几种类型的流? JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别时哪些类?
Java中的流分两种:字节流、字符流。
字节流:java.io.InputStream、java.io.OutputStream
字符流:java.io.Reader、java.io.Writer
java中其他多种多样变化的流均是由他们派生出来的
30.什么是事务处理?
事务是这样一种机制,他确保多个SQL语句被当作单个工作单元来处理。事务具有以下的作用:
*一致性:同时进行的查询和更新彼此不会发生冲突,其他用户不会看到发生了变化但尚未提交的数据
*可恢复性:一旦系统故障,数据库会自动的完全恢复未完成的事务。
31.&和&&的区别?
&和&&都可以用作逻辑运算符,表示逻辑与。当运算符两边的表达式都为true时,结果才为true;否则,结果为false。
另外&&还具有短路功能,也就是说,当&&左边的表达式结果为false时,将不再运算&&右边的表达式,结果肯定为false。例如,对于if(str!=null && !str.equals("")),当str为null时,不会对&&右边的表达式进行运算,否则会出现空指针异常。
&还可以用作位运算符,当&两边的表达式不是boolean类型时,&表示按位与。
32.数组有没有length()这个方法?String有没有length()这个方法?
数组中没有length()这个方法,但是数组中有length这个属性,用来表示数组的长度。
String中有length()这个方法,用来得到字符串的长度
33.构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。
Constructor不能被继承,所以Constructor也就不能被override。每一个类必须有自己的构造函数,负责构造自己这部分的构造。子类不会覆盖父类的构造函数,相反必须负责在一开始调用父类的构造函数
34.构造器如何工作?
Java在构造实例时的顺序时这样的:
1.分配对象空间,并将对象中成员初始化为0或者空,java不允许用户操纵一个不定值的对象。
2.执行属性值的显示初始化
3.执行构造器
4.将变量关联到堆中的对象上
35.super与this的区别?
不同点:
1)super()主要是对对父类构造函数的调用,this()是对重载构造函数的调用
2)super()主要是在继承了父类的子类的构造函数中使用,是在不同类中的使用:this()主要是在同一类的不同构造函数中的使用
相同点:
super()和this()都必须在构造函数的第一行进行调用,否则就是错误的
36.GC是什么?为什么要有GC?
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方。
忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。
Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法:System.gc()或者Runtime。getRuntime().gc(),但JVM可以屏蔽掉显示的垃圾回收调用。
垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下堆内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄漏问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得IOS的系统比Android系统有更好的用户体验,其中一个深层次的原因在于Android系统中垃圾回收的不可预知性。
37.接口是否可以继承接口? 抽象类是否可以实现(implements)接口?抽象类是否可以继承实体类?
接口可以继承接口。
抽象类可以实现(implements)接口
抽象类可以继承实体类,但前提是实体类必须有明确的构造函数
38.内部类可以引用它包含类的成员码?有没有什么限制?
完全可以。如果不是静态内部类,那没有什么限制!
如果把静态嵌套类当作内部类的一种特例,那再这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员
39.mysql数据库的优化问题
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)使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAXO(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。
8)优化的查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。
40.JDBC连接数据库的步骤
1)加载(注册)数据库驱动(到JVM)。
2)建立(获取)数据库连接
3)创建(获取)数据库操作对象。
4)定义操作的SQL语句。
5)执行数据库操作
6)获取并操作结果集
7)关闭对象时,回收数据库资源(关闭结果集--->关闭数据库操作对象--->关闭连接)
41.statement与preparstatement区别
在JDBC应用中,你应该始终以PreparedStatement代替 Statement
1.代码的可读性和可维护性
虽然用PreparedStatement来代替Statement会使代码多处几行,但这样的代码无论从可读性还是维护性上来说,都比直接用Statement的代码高很多档次
2 .PreparedStatement能尽最大可能提高性能
3.最重要的一点是极大的提高了安全性
42. 什么是视图、索引、约束?
- 视图(view):存储的SLECT语句,基于基表的查询结果。视图也叫虚表。一般不建议将内容插入或更新视图,因为视图时收到基表的字段限制。在mysql中用处不大。
- 索引:索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),他们包含着对数据表所有记录的引用指针。 索引存在的目的是为提高查询执行的速度。
- 约束
1) 域约束:数据类型约束
2)外键约束:引用完整的约束
3)主键约束:逐渐是某字段能唯一表示此字段所属的实体,并且不允许为空。符合这个条件的被称为候选主键。一个表只能有一个主键。不允许2个实体在主键上出现相同值。
唯一性约束:每一行的某字段都不允许出现相同值。但是可以为空。表中可出现多个。
检查性约束:自定义约束条件。mysql上功能比较薄弱。
43.DDL包含哪些操作、DML包含哪些操作?
DML(data manipilation lanuage)数据操作语言:
它们是SELECT、UPDATE、INSERT、DELETE,就像它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。
DDL(data definition language)数据库定义语言:
DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
DCL(Data Control Language)数据控制语言:
是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,denv,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),有一定复杂性