java学习笔记

一、 java开发工具Editplus:Editplus与jdk的连接配置,如:javac(编译)、java(运行)、javap(查看字节码)
a) 配置内容:
i. javac(编译):参数为 -d .  $(FileName);初始目录 $(FileDir)
ii. java(运行):参数为 $(CurSel).$(FileNameNoExt);初始目录:$(FileDir)
iii. javap(查看字节码):参数为 $(FileNameNoExt);初始目录:$(FileDir)
二、 java初始:
a) 通过HelloWorld类讲解了关键字、命名规范、修饰符;
pubic class HelloWorld{
    public static void main(String[] args){
       System.out.println("Hello World!");
    }
}
b) jdk与jre的区别;内容、范围///开发、运行//里面包含了各种类库和工具、java程序的运行环境JVM
           jar;java下的压缩文件
           javac;编译
           javadoc;可形成帮助文档
     共有:java;运行
           native2ascii;本地码改成ASCII码
           javap;查看字节码文件
c) 字节码;是java跨平台的一个机制,是一段二进制代码,是一种包含执行程序、
由一序列 op 代码(操作码)/数据对组成的二进制文件。字节码是一种中间码,它比机器码更抽象,是包含一个执行程序的二进制文件(.class)
数据单位的进制;K是千 M是兆 G是吉咖 T是太拉 8bit(位)=1Byte(字节) 
              1024Byte(字节)=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB
  java中,字节码是CPU构架(JVM)的具有可移植性的机器语言。
d) 四个目标;
   1、java简介;历史和地位---跨平台纯面向对象的语言--第三代语言:继承、封装、多态:方法同名,体不同
                      C++  ---  类函数
                      .NET---跨语言的平台
                      SQL--结构化查询语言--第四代语言
                      Lisp、Prolog人工智能语言---第五代语言
      自身发展:95年后变成javaSE
      java体系:javase、javaee、javame
      特点:面向对象、平台无关、健壮性:无指针、内存的申请与释放(内存分配)
   2、工作原理
        I java虚拟机
Java虚拟机(JVM)是以 字节码 为机器指令的系统,编译虚拟机的指令集与编译微处理器的指令集非常类似。
Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。------堆,栈,本地方法栈,方法区,pc寄存器
    .java---.class
        Ii 垃圾回收机制(GC);不再使用的内存空间应该回收起来
    java 的垃圾回收机制:Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。需要注意的是:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身 
         1.垃圾回收是由虚拟机自动执行,不能人为地干预。
         2.系统比较空闲(垃圾回收线程)执行
         3.对象不在被引用.对象处于引用的隔离岛状态(隔离引用),对象具备了回收的条件
         4.gc()方法,可以建议虚拟机执行垃圾回收,但是不能确定是否会执行回收。
   iii、开发环境搭建
tools:JCreator\Eclipse\MyEclipse\Jbuilder\NetBeans
   
iv、第一个java程序
        java源文件;xx.java
基本组成是class,只能有一个public类,命名与其一致
java运行(JVM): 类装载器、字节码校验、解释器
java中只有值传递
三、 数据类型与转换(标示符和关键字、常量与变量、基本数据类型,自动转换,强制转换、转义字符、表达式)
a) 标示符:标示符的格式要求:
i. 定义:java对各种变量、方法和类等要素的命名时使用的字符序列,均须遵守标示符的规则
ii. 规则:
1. 由字母、下划线_、美元符$、数字组成
2. 开头不能是数字
3. 大小写敏感,长度无限制(区别C)
4. 类名首字母一般要大写,方法名一般要小写,并且遵循骆驼命名规则,如:ActiveDemo
b) 关键字
i. 定义:java中一些赋以特定的含义,用作专门用途的字符串
ii. 所有关键字都必须小写
iii. 常用的关键字用
1. 用于数据类型的:int、long、short、String、byte、char、float、double、boolean
2. 用于流程控制的:if、else、for、switch、case、do、while、break、continue
3. 访问控制符:public、protected、default、private
4. 用于异常的:try、catch、finally、throw、throws
5. 返回类型的:native、super、null、void、return、synchronized(同步)
6. 实例:instanceof、this、new
7. 面向对象:class、extends、interface、abstract、final、implements、import、package、static
8. goto和const用来破坏程序入口,也是关键字
c) 常量与变量
i. 常量:(public static final 常量名;)
1. 定义:始终不变的值,可以是数值、字符、字符串
2. 规则:习惯上命名时要大写
ii. 变量:(type varName  [=value];)
1. 注意:局部变量使用前必须先初始化不然编译失败!
iii. 调用格式:
1. 调用同文件中的其他类的变/常量格式为:对象.变量
2. 同类中调用其它函数的实例变/常量格式为:new 对象().变量名
3. 同类中调用其它函数的类变/常量格式为: 类名.变量名
d) 数据类型
i. 基本数据类型:byte、short、int、long、char、float、double、boolean
1. 默认值(范围是-2^(n-1)∽2^(n-1)-1)
a) Byte//1、short//2、int//4、long//8------默认值为0
b) char //2--------字符0-----范围是0~65535---unicode编码
c) float//4、double//8--------0.0
d) Boolean//2---------------false
ii. 引用数据类型:数组、类、接口
e) 自动转换(隐式转换)(由小转大)
i. 定义:自动类型转换,也称隐式类型转换,是指不需要书写代码,由系统自动完成的类型转换
ii. 转换规则:byteshort(char)intlongfloatdouble
iii. 示例代码:
1. int i = 4;
2. float n = i;
f) 强制转换(由大转小)
i. 转换规则:double→float→long→int→short(char)→byte
ii. 格式:(转换到的类型)需要转换的数值
iii. 示例代码:
1. double d = 3.10;
2. int n = (int)d;
iv. 注意:强制转换通常都会导致精度的损失
g) 转义字符
i. \b退格
ii. \n换行
iii. \r回车
iv. \’单引号
v. \”双引号
vi. \\反斜杠
h) 运算符------表达式
i. 定义:表达式是由数字、算符、数字分组符号(括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。约束变量在表达式中已被指定数值,而自由变量则可以在表达式之外另行指定数值
ii. 算术运算符:
1. 单目: ++(自加1)、--(自减1)、+(取正)、-(取负)
2. 双目: + 、- 、* 、/、 %
3. 三目:   ?:     如:a>b?a:b
iii. 关系运算符:-------返回结果true/false
1. 等于符号:==
2. 不等于符号:!= 
3. 大于符号:> 
4. 小于符号:<
5. 大于等于符号:>= 
6. 小于等于符号:<=
iv. 逻辑运算符:------返回结果true/false
1. 与(&&):假短路
2. 或(||):真短路
3. 非(!):
v. 位运算符:-----将原数转化为二进制计算
1. 与(&):     如  1100&1010=1000
2. 或(|):     如  1100|1010=1110
3. 非(!): 如  !1100=0011
4. 异或(^): 如  1100^1010=0110
5. << 带符号左移 ------相当于乘以2
6. >>带符号右移 -------相当于除以2
7. >>> 无号右移
8. 异或的规律:
a) a ^ a = 0
b) a ^ b = b ^ a
c) a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
d) d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
e) a ^ b ^ a = b
vi. 赋值运算符:
1. =、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=
vii. Intanceof:----归属
1. 定义:为双目运算符,左边操作元是一个对象,右边是一个类。当左边的对象是右边类的对象时,返回true 
2. 格式:result = object instanceof class 如:a = b instaceof B;//true
viii. 优先级:(从高到低、从左到右)
1. () [] 
2. ! +(正) -(负) ~ ++ --
3. * / %
4. +(加) -(减)
5. << >> >>>
6. < <= > >= instanceof
7. == !=
8. &(按位与)
9. ^(位异或)
10. |(位非)
11. &&
12. ||
13. ?:
14. = += -= *= /= %= &= |= ^= ~= <<= >>=>>>=
四、 流程控制语句(分支、循环)
a) If…else:    例1.1:
i. If(a>b){
ii.   System.out.println(a);
iii. }else if(b>c){
iv.   System.out.println(b);
v. }else{
vi.   System.out.println(b);
vii. }
b) 分支:(switch)
i. 格式:switch(条件语句){
case :
case :
…..
default :
}
ii. 例1.2:switch(month){
case 1:System.out.println(“spring”);break;
case 1:System.out.println(“spring”);break;
case 1:System.out.println(“spring”);break;
case 1:System.out.println(“spring”);break;
default: System.out.println(“spring”);break;//一定会执行的语句
}
c) For循环  
i. 格式:For(初始化语句;条件语句;控制语句){
循环体;
}
ii. 例1.3:for(int i=1;i<101;i++){
   int sum = 0;
   sum += i;
}
d) while
i. 格式:while(条件语句){
//初始化语句;
循环体;
//控制语句;
}
ii. 例1.4:int i=1;
while(i<101){
  int sum=0;
  sum += i;
}
e) Do….while()
i. 格式: do{
循环体;
}while(条件语句);
ii. 例1.5:int i =1;
do{
int sum = 0;
 sum += i;
}while(i>101);
f) 增强型for循环----------主要用于打印数组元素
i. 格式:for(e:数组名){
循环体
}
ii. 例1.6:int[] a = new int[10];
                for(e:a){
  System.out.println(e);
}
五、 方法与递归
a) 方法---函数 
i. 定义:一段用来完成特定功能的代码片段
ii. 声明格式:【修饰符】返回类型 方法名(形参列表){
方法体;
}
iii. 语法解释:
1. 形式参数:在方法被调用时用于接收外界输入的数据
2. 实参:调用方法时实际传给方法的数据
3. 返回值:方法在执行完毕后返回给调用它的环境的数据
4. 返回值类型:事先约定的返回值的数据类型,无返回值,必须给出返回类型void
5. return语句中止方法的运行并指定要返回的数据
iv. 调用格式:
1. 静态方法(又称类方法)的调用:类名.方法名(实际参数)
2. 实例方法的调用:对象名.方法名(实际参数)
3. 调用中传递参数时,遵循的规则是:基本数据类型是该数据本身,引用数据类型传递的是对象的引用(地址),不是对象本身----基本数据类型:值传递;引用数据类型:地址传递。
v. 例1:
public class DemoMethod{
public static void main(String[] args){//静态方法(又称类方法)的调用:类名.方法名(实际参数)
        show("i am a girl");
//实例方法的调用:对象名.方法名(实际参数)//如何产生对象(Object),格式:new 构造方法()
        //和类同名的方法称为构造方法
//什么是构造方法(Constructor)?每个类都有一个和类名相同的构造方法,且自动产生
      // new DemoMethod().display();
 new DemoMethod().visiable(12,"aaa",3.0f);
}
    //静态方法的定义【有关键字static修饰的方法】
public static void show(String s){//自定义方法
       System.out.println(s);
}
    //实例方法的定义【没有关键字static修饰的方法】
public int display(){System.out.println("welcome to jiangxi");return (85);//返回结果,可以用括弧,也可以不用}
    //多个参数的实例方法
public void visiable(int x,String y,float f){System.out.println("=======================");}
}
b) 递归----------必须要有出口
i. 定义:递归用于让一个函数从其内部调用其自身
ii. 特点:
1. 程序代码简练,易于理解但浪费内存
2. 一定要有返回类型
3. 一定有if…….else……且if中有终止条件
六、 类(面向对象技术基础、类的声明与使用、对象的声明与使用、构造方法)
a) 面向对象技术基础
i. 面向对象设计的方法论【OOA(分析)OOD(设计)OOP(编程)Test(测试)部署】
ii. 面向对象(Object Oriented,OO)特点: 
1. 对象唯一性:每个对象都有自身唯一的标识,通过这种标识,可以找到相应的对象。在对象的整个生命期中,它的标志都是不改变的,不同的对象不能有相同的标识(地址)。
2. 封装性(抽象性):把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
3. 继承性:继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系,java中的类只支持单继承,接口支持多继承
4. 多态性(多形性):多态性是指相同的操作或方法、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性
5. 总结作用:封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
iii. 面向对象(OO)基本特征
1. 封装(package)
2. 继承(inheritance)------关联关系
a) 继承(泛化generalize)
i. 实现继承
ii. 可视继承
b) 组合(聚合)
i. 接口继承
3. 多态(Polymorphism)
a) 重写(override)
i. 方法
ii. 接口(interface)
b) 重载(overload)
i. 同名函数
b) 类的声明和使用
i. 声明格式:
【修饰符】class【类名】{
方法体;
}
ii. 例1:
public static class Demo{
System.out.println();
}
c) 对象的声明与使用
i. 格式:类名 对象的引用变量 = new 类名();
ii. 例2:Demo d = new Demo();
d) 类与对象的比较
i. 类就是对象的模板,对象是类的实例
e) 构造方法
i. 定义:定义在类中,用来初始化对象的成员变量的方法,返回的是内存地址
ii. 格式:
1. 【修饰符】方法名(){}
2. 例3:public Demo(){}
iii. 要求:
1. 与类同名;2、没有返回值(无void 的修饰);必须要先创建对象,在对象上进行调用(new)
七、 UML
a) UML定义:(Unified Modeling Language)统一建模语言,一种用于面向对象的软件工程的分析与设计阶段的一种可视化建模语言
b) UML关系(类与类之间的关系):关联对属性,依赖对方法
i. 关联关系:菱形指向整体   has a
1. 关联关系------若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B
2. 聚合(aggregation)---实线空心菱形
3. 组合---整体与部分不可分开,实线实心菱形
ii. 泛化(Generalization)关系(继承):用实线空心三角形指向父类    is a
1. 若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性
iii. 实现关系(接口):虚线
iv. 依赖(Dependency)关系:  A”————>”B(A依赖于B)    use a  虚线箭头
c) 修饰符图形
i. +  public -   private #   protected ~  默认访问
d) 建模图形(9种):
i. 用例图(Use Case Diagram):展示系统外部的各类执行者与系统提供的各种用例之间的关系
ii. 类图(Class Diagram):展示系统中类的静态结构(类是指具有相同属性和行为的对象),类图用来描述系统中各种类之间的静态结构
iii. 对象图(Object Diagram):是类图中的一种实例化图(是对类图的实例化)
iv. 顺序图(时序图)序列图(Sequence Diagram):展示对象之间的一种动态协作关系(一组对象组成,随时间推移对象之间交换消息的过程,突出时间关系)
v. 协作图(合作图)(Collaboration Diagram):从另一个角度展示对象之间的动态协作关系(对象间动态协作关系,突出信息收发关系)
vi. 状态图(Statechart Diagram):描述一类对象具有的所有可能的状态及其转移关系(展示对象所具有的所有可能的状态以及特定事件发生时状态的转移情况)
vii. 活动图(Activity Diagram):展示系统中各种活动的执行流程(各种活动的执行顺序、执行流程)
viii. 构件图(Component Diagram):展示程序代码的物理结构(描述程序代码的组织结构,各种构件之间的依赖关系)
ix. 部署图(Deployment Diagram):展示软件在硬件环境中(特别是在分布式及网络环境中)的配置关系(系统中硬件和软件的物理配置情况和系统体系结构)
八、 自定义类
a) 类的定义:类是具有相同属性和相同操作的对象集合,类是对象的模板,一个类可以产生对个对象,产生单个对象的话就是单例模式,类是对现实世界中实体的抽象,对象是对现实世界中实体的实例
b) 类的组成:字段(成员变量)+方法+初始化块(静态初始化块+对象初始化块)
c) 命名规则:类名的首字母大写;变量名和方法名(构造方法除外)的首字母小写,采用骆驼名命名标识
d) 字段(实例变量+类变量(静态变量))的定义格式:
【修饰符(4p、static、final)】 数据类型 属性名【=默认值】;
e) 方法的定义格式:【修饰符(4p、static、final、abstract)】 返回值 方法名(【参数列表】){ 代码块;}
f) 初始化顺序:静态初始化块类变量,实例变量初始化对象初始化块和成员变量初始化(在程序代码中的先后顺序来定)构造方法
g) JavaBean规范:
i. 必须是公共类,并将其访问属性设置为public,如:public class Stu{}
ii. 必须有一个空的构造方法(public、无参):必须有一个不带参数的公共构造器
iii. 字段(实例变量)要私有化,首字母要小写,用private修饰 如:private int id;
iv. 字段应该通过一组存取方法(getter和setter)来访问,一般是用Eclipse、JBuilder、IDE等工具生成getter和setter方法
v. setter和getter规范:字段首字母小写------如:
1. public class Demo{
a) private String name;
b) public Demo(){}
c) public Demo(){
System.out.println(“不错”);
d) }
e) public void setName(String name){
this.name = name;
f) }
g) public String getName(){
return name;
h) }
}
九、 数组(一维数组、二维数组、排序、Arrays.sort)
a) 一维数组
i. 定义:数组就是相同类型元素的集合
ii. 数组变量是引用类型,栈stack(FILO,自动回收)引用堆heap(new出来的,树形结构,JVM回收)中的数据;
iii. 格式:int[] a = new int[3];
int[] a = {1,2,4};
iv. 使用for循环遍历输出,获得数组长度length,访问元素
For…each: 增强型for循环
for(String i:a){//增强型for循环System.out.println(i);}
//冒泡排序
public class SortTest {
 public void sort(int[] args){
    System.out.println("排序前 ");
for(int m : args){System.out.print(args[m]+",");}
  int time1 = 0,time2 = 0;
for(int i = 0 ; i < args.length-1 ; i++){for(int j = i+1 ; j < args.length ; j++){int temp ;if(args[i] > args[j]){temp = args[j];args[j] = args[i];args[i] = temp;}}}System.out.println();System.out.println("排序后 ");for(int n : args){System.out.print(n+",");}}public static void main(String[] args) {int[] arg = new int[]{2,1,4,5,8,7,6,3,9,0};new SortTest().sort(arg);}
}
b) 二维数组-----实质是一维数组引用另一维数组
i. 声明:Int[][] arr;//4个字节
ii. 创建时必须创建行,初始化就是对每个元素进行初始化,使用增强型for循环
十、 Object类
a) Object类是所有类的超类;
b) 常用方法:HashCode()----哈希值,如:
i. IntegertoHexString(p1.hashCode());//把哈希码的无符号十六进制转换成十进制
c) getClass()//获取运行时的类
d) toString()//返回字符,相当于getClass().getName()+”@”+Integer.toHexString(HashCode());
e) clone()//创建一个与源对象完全相同的对象,但新对相象与源对象不相等
i. 子类重写clone()要求:1、创建一个类A实现cloneable接口;2、重写Object的clone(),调用super.clone()
ii. 代码实现:如
public class Person implements Cloneable{
int as ;
protected Object clone() throws CloneNotSupportedException{Person p = (Person)super.clone();
}
}
public class PersonDemo{public static void main()throws CloneNotSupportedException{Person p = new Person();p.as=11;System.out.println(“Before clone”+p.as);Person p1 = (Person)p1.clone();p1.as=22;System.out.println(“After clone”+p.as);}}
十一、 包装类(Integer)
a) 常用方法:
i. Integer.MAX_VALUE();//获取int的最大值
ii. Integer.MIN_VALUE();//获取int的最小值
iii. toBinaryString()//转二进制
iv. toHexStrng()//转十六进制
十二、 抽象类
a) 抽象类的特点:
i. 抽象方法一定在抽象类中;
ii. 抽象方法和抽象类都必须被abstract关键字修饰;
iii. 抽象类不可以用new创建对象,因为调用抽象方法没意义;
iv. 抽象类中的方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用;
v. 如果子类只覆盖了部分抽象方法,那么子类还是一个抽象类
b) 格式:【访问控制符】class 类名{
属性;
访问控制符 返回类型 方法名(形参列表){
//方法体;【return 返回值】
}
访问控制符 abstract 返回类型 方法名(形参列表);
}
例:package b;
public class  AbstractDemo{
public static void main(String[] args){Chinese c = new Chinese();}
}
abstract class Chinese{
public abstract void show();
}
abstract class D{
public void show(){System.out.println("213");} 
}
十三、 接口(interface)--------不能实例对象,也就是不能new接口
a) 定义:当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示
b) 格式:
1、 接口中常见定义:常量、抽象方法
2、 接口中的成员都有固定修饰符
常量:public static final
方法:public abstract
  接口中的成员都是public的
c) 接口不可以建立对象,需要被子类实现时,子类对接口中的抽象方法都覆盖后,才可以实例化,否则子类就是一个抽象类
接口支持多实现implements,但接口不能实现接口,可以继承(多继承)接口
d) 例子
public class InterfaceDemo{
public static void main(String[] args){SubInter si = new SubInter();System.out.println(si.NUM);System.out.println(SubInter.NUM);System.out.println(Inter.NUM);}
}
interface Inter{
public static final int NUM = 3;public abstract void show();
}
class SubInter implements Inter{//实现接口
public void show(){}
}
十四、 单例设计模式
a) 定义:是对同一种问题的固定解决方式,单例就是只创建一个对象
b) 想要保证对象唯一:1、为了避免其他程序过多建立该类对象,先控制其他程序建立该类对象;2、为了让其他程序可以访问,在本类中自定义该对象;3、为方便访问,提供访问方式
c) 使用场景:仅需要创建一个对象时
d) 定义步骤:
1、private 的构造方法
2、private static 的实例对象
3、public static外界访问方法
i. 代码实现:
1. 第一种:饿汉式-----先初始化
private int a;
private A(){};
private static A a = new A();
public static get(){
Return a;
}
2. 第二种:懒汉式----调用时初始化—延时加载
private int a;
private A(){};
private static A a = new A();
public static get(){
if(a==null){a == new A();
}
return a;
}
e) 好处:
i. 控制资源的使用
ii. 控制实例的产生数量
iii. 让多个不相关的两个线程或进程之间实现通信
十五、 package
a) 定义:就是把字段和方法包裹起来,并用一定的修饰符加以修饰从而达到对外信息隐藏,并暴露可以暴露的方法
b) Java.lang.*;--------基础包,默认导入
c) 要求:1、必须放在非注释的第一行;2、包名通常是域名的倒置,包名必须小写,不含关键字,不能以java、javax开头
d) 作用:1、便于管理;封装的需要;防止类名冲突
e) 包的导入用import关键字;
f) 常用包有; java.lang.annotation\java.net\java.nio\java.sql\java.util\javax.sql\
javax.xml\javax.swing
十六、 继承(extends)-----类与类之间是属于关系-----关联关系
a) 实现方式:继承(inheritance)和组合(composition)
i. 继承的实现方式有:实现继承、可视继承----------类与类之间是继承(泛化)关系
1. 实现继承是指使用基类的属性和方法而无需额外编码的能力;
2. 可视继承是指子窗口(类)使用基窗口(类)的外观和实现代码的能力;
ii. 组合(聚合关系):接口继承和纯虚类继承
1. 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
b) 初始化顺序:先父类静态初始化块--》子类静态初始化块---》父类的对象初始化块---》父类的构造方法--》子类的对象初始化块---》子类的构造方法,如:
package a;
public class  B extends A{
static{System.out.println("-------------4------------");}{System.out.println("-------------5------------");}public B(){System.out.println("-------------6------------");}public static void main(String[] args){B b = new B();new B();}
}
class A{
static{System.out.println("-------------1------------");}{System.out.println("-------------2------------");}public A(){System.out.println("-------------3------------");}
}
十七、 多态(向上转型)
a) 多态的坏处
i. 向上转型后,会丢掉子类的新方法
ii. 向上转型是安全的,但向下转型却是不安全的
iii. 例:
package a;
//向上转型------------打印的类型看右边
//缺点:损失掉了子类新增的方法、属性
public class A extends Super{
public void f(Super s){System.out.println(s);}public static void main(String[] args) {//Super a = new A();//a.A@82764b-----打印出A型变量//System.out.println(a);/*A a = new A();a.f(a);//a.A@82764b-------向上转型*///Super[] s = new Super[](new A(),new Super());//System.out.println(a.length);Super[] s = new Super[]{new A(),new Super()};System.out.println(s.length);Object o = new int[3];int[] b = (int[])o;System.out.println(b.length);//编译出错,损失掉了子类新增的方法、属性}
}
class Super{}
b) 后期绑定
i. 将一个方法调用同一个方法主体关联起来被称为绑定。若在程序执行前绑定,叫前期绑定,java中除了static和final方法,其他所有的方法都是后期
ii. Overload-----前期绑定--------静态绑定------编译阶段
Override-----后期绑定--------动态绑定------运行阶段
例:Super a = new subclass();//向上转型-------overload看左边,override看右边
c) 实现多态的方式
i. 重写override:指子类重新定义父类的方法的做法
ii. 重载(overload):是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,顺序或许两者都不同)
iii. 协变重写:子类方法可以比父类方法的返回类型更具体(子类的返回类型是父类方法返回类型的子类)
d) 只有普通方法具有多态,final、static、private方法不具备多态性
Field(域成员==字段)不具备多态性-----它们都是前期绑定----同变量的声明类型绑定
c) 设计原则:
1、开闭原则---对扩展开放,对修改封闭,实现关键在于抽象化
2、里氏代换原则---面向基类原则---任何基类可以出现的地方,子类一定可以出现
十八、 String(声明,创建,初始化,操作(比较equals/==,转换,查找,截取,分割,拆分,替换,连接))
a) 在java中使用的是unicode码;字符串的内存空间大小跟它的属性有关,String创建初始化时在JVM中数据流动,
b) 声明创建初始化
i. 格式:String 变量名 = 初始值;
ii. String 变量名 = new String(初始值);
c) 操作:
i. 比较(equals与==)
1. equals比的是内容,==比的是地址,equalsIgnoreCase()---忽略大小写
2. 例1:String d = “123”;
  String d1 = new String(“123”);
  System.out.println(d.equals(d1)); //true
System.out.println(d==d1);//false
ii. charAt(int index)------返回指定索引处的char值
iii. length()--------返回字符串的长度
iv. 转换
1. toString()------返回本身
2. toLowerCase()---将所有字符串转换为小写
3. toUpperCase()---将所有字符串转换为大写
v. 查找
1. indexOf(String key)------从前查找返回的第一个key的索引
2. indexOf(String key,int formindex)----返回从指定位置开始查找到的第一个key的索引
3. lastIndexOf()---------从后查找返回最后一个key的索引
vi. 截取
1. substring(int bindex,int eindex)----截取源字符串(begin,end)并返回一个新String
vii. 拆分
1. split(String regex)-----根据regex将源字符串进行分割成若干个新字符串
viii. 替换
1. replace(char oldchar,char newchar);
ix. 连接
1. + 或concat连接---在源字符串尾部连接新字符串,返回新字符串
2. “a“+”b”;
x. 创建对象
1. String str1 = "abc"; 
  System.out.println(str1 == "abc");
步骤: 
1) 栈中开辟一块空间存放引用str1, 
2) String池中开辟一块空间,存放String常量"abc", 
3) 引用str1指向池中String常量"abc", 
4) str1所指代的地址即常量"abc"所在地址,输出为true
2. String str2 = new String("abc"); 
  System.out.println(str2 == "abc");
步骤: 
1) 栈中开辟一块空间存放引用str2, 
2) 堆中开辟一块空间存放一个新建的String对象"abc", 
3) 引用str2指向堆中的新建的String对象"abc", 
4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false
3. String str3 = new String("abc"); 
  System.out.println(str3 == str2);
步骤: 
1) 栈中开辟一块空间存放引用str3, 
2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象, 
3) 引用str3指向另外新建的那个String对象 
4) str3和str2指向堆中不同的String对象,地址也不相同,输出为false
4. String str4 = "a" + "b"; 
  System.out.println(str4 == "ab");
步骤: 
1) 栈中开辟一块空间存放引用str4, 
2) 根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"ab", 
3) 引用str4指向池中常量"ab", 
4) str4所指即池中常量"ab",输出为true
5. final String s = "a"; 
  String str5 = s + "b"; 
  System.out.println(str5 == "ab");
步骤: 
同4
6. String s1 = "a"; 
  String s2 = "b"; 
  String str6 = s1 + s2; 
  System.out.println(str6 == "ab");
步骤: 
1) 栈中开辟一块中间存放引用s1,s1指向池中String常量"a", 
2) 栈中开辟一块中间存放引用s2,s2指向池中String常量"b", 
3) 栈中开辟一块中间存放引用str5, 
4) s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象, 
5) 引用str6指向堆中(s1 + s2)所还原的新String对象, 
6) str6指向的对象在堆中,而常量"ab"在池中,输出为false
7. String str7 = "abc".substring(0, 2); 
  
步骤: 
1) 栈中开辟一块空间存放引用str7, 
2) substring()方法还原一个新的String对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象, 
3) 引用str7指向堆中的新String对象,
8. String str8 = "abc".toUpperCase(); 
  步骤: 
1) 栈中开辟一块空间存放引用str6, 
2) toUpperCase()方法还原一个新的String对象"ABC",池中并未开辟新的空间存放String常量"ABC", 
3) 引用str8指向堆中的新String对象
十九、 this
a) this是只指向当前对象的指针;
b) 使用:
i. 如果用在构造方法中,表示当前构造方法正在初始化的对象,如:
1. Person p = new Person();
2. public Person(int id){
this.id = id;//相当于是p.id = id;
3. }
ii. 如果用在方法中,表示当前正在调用该方法的对象,如:
1. public show(int id){
this.id = id;//相当于是p.id = id;
2. }
------------p.show();
二十、 Static------数据共享
a) Static修饰符可以用于修饰类的成员变量和方法-----只在类加载时加载一次
i. 修饰成员变量时,该变量成为类变量或静态变量,隶属于类,类的所有对象共享同一个静态变量(生命周期长,类加载时确立,保存在方法区中)
ii. 修饰方法时,该方法成为类方法或静态方法,可以直接用类名.方法名()调用,也可以使用创建对象后通过对象引用名.方法()调用
iii. 静态方法不能访问非静态方法:
1. 静态方法也称类方法,它在调用时直接使用类名.方法来调用;非静态方法在调用时必须先创建对象,在对象上调用,格式为:对象名.方法名();
2. 在静态方法被调用时可能没有实例对象,也就无法调用非静态方法
二十一、 区别与联系:
a) break与continue与return
i. continue和break都可以结束本轮循环,但continue结束本轮后继续下一轮循环,break则直接跳出循环
ii. break可以用在多重循环中用来跳出离它最近的循环,也可以用在多分支语句swtich中用来跳出循环
iii. continue只能用在循环语句中,用于结束本轮循环,执行下一次循环;
iv. continue与break之后的语句都不执行
v. return是终止方法并返回数据,在方法体内return后的语句都不执行
b) 类变量(static)、实例变量、局部变量
i. 定义:类变量和实例变量定义在类中方法外,局部变量定义在方法内、形参、代码块中
ii. 修饰符:类变量必须要用static修饰,实例变量不用static修饰,类变量和实例变量可以不赋值,局部变量必须要先初始化
iii. 使用:类变量调用格式为:类名.变量名;实例变量调用时必须要先创建实例对象,在该对象上调用(对象.变量名);局部变量可以直接使用
iv. 加载:类变量(栈中)在类加载时加载,类结束时结束;实例变量(堆中)在对象调用时加载,调用结束时结束;局部变量(栈中)在方法开始调用时开始,方法结束时结束
c) this与super
i. 操作属性--------this.属性:表示调用本类中的属性,如果本类中的属性不存在,则从父类开始查找;super.属性:表示调用父类中的属性
ii. 操作方法--------this.方法():表示调用本类中的方法,如果本类中的方法不存在,则从父类开始查找;super.方法():表示调用父类中的方法;
iii. 调用构造方法----this();调用本类中的其他构造方法,super():表示调用父类的构造方法
iv. 查找范围---------this先从子类查找,如果没有从父类查找,super不查子类直接查父类;
v. 特殊:this可以表示当前对象
d) String与StringBuffer、StringBuilder
i. String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变长度的字符序列,修改后不会产生新对象
ii. StringBuffer的实质是它有容量这个属性,默认容量为16,当初始化长度大于16时,其容量为初始化长度的2倍。
iii. String操作字符的方法有”+”、concat;StringBuffer操作字符的方法有insert、append、delete(开始int,endint)
iv. 初始化格式:
1. String st = “234”; String s = new String();
2. StringBuffer sb = new StringBuffer();
v. StringBuffer与StringBuilder都是可变长度的字符序列,在多线程中,前者是安全的,后者是不安全的
e) equals与==
i. 如果是基本类型比较,那么只能用==来比较,不能用equals;

ii. 对于基本类型的包装类型,比如Boolean、Character、Byte、Short、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的;

iii. 在String或重写equals方法的类中:equals是比内容,==是比地址
iv. 在其他类中没有重写equals方法时,equals与==用法相同,都是比地址
f) 重载与重写
i. 重载与重写都是类的多态表现形式,重载是一个类的多态表现形式,重写是子类继承父类的多态表现形式,重载与重写都是针对方法;
ii. 重载要求同名不同参数列表(类型、个数、顺序),与返回类型无关,重写要求同名同参数列表(类型、个数、顺序),同返回类型(协同----引用数据类型,是其子类或相同,基本数据类型是相同),访问修饰符大于或等于父类,抛出异常要小于或等于父类(当抛出的异常是RuntimeException时,则都可以编译通过)
iii. 重载可以用在构造方法和普通方法中,重写只能用在普通方法中
g) Integer与int
i. 类型:int是基本数据类型,Integer是引用数据类型;
ii. Integer是对int的包装,属于包装类;
iii. 默认值:int的默认值是0,Integer的默认值是null.
h) 类、抽象类、interface
1、抽象类需要有abstract修饰,类则不需要
2、抽象类中可以有普通方法和抽象方法,但普通类中只能有普通方法
3、 抽象类和普通类都可以继承,但抽象类的子类必须重写其父类的所有抽象方法,而普通类则不要求
4、抽象类不能被实例化,普通类可以被实例化
5、接口是抽象类的抽象,接口中只能有抽象方法和常量,接口支持多继承,不含有构造方法和初始化块
i) final、finally与finalize
i. final用于声明属性方法和类,分别表示:属性不可变,方法不可覆盖,类不可继承
ii. finally是异常处理语句的一部分,表示总是执行
iii. finalize是Object的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。
二十二、 不能共存的
a) super()与this():都必须放在方法的非注释第一行
b) final与abstract:一个最终的,一个是抽象的
c) abstract与private
 

 一、内部类(局部内部类、成员内部类、匿名内部类)

1、定义:内部类就是在类的内部定义一个类,它的分类有成员内部类、局部内部类、匿名内部类,
它可以定义在类中方法外,也可以定义在类中方法内,内部类的好处是可以访问外部类的私有成员,但外部类无法访问内部类的私有成员
通过使用内部类可以确保程序的结构清晰和代码精炼

编译后的内部类名称:InnerTest$A.class

2、分类:成员内部类(静态成员内部类)、局部内部类、匿名内部类
a、成员内部类(非静态内部类):与外部类的属性和方法并列,成员内部类可以看作是外部类的实例变量
在内部类中访问实例变量:this.字段;
在内部类中访问外部类的实例变量:外部类名.this.字段
成员内部类中不能有静态字段或方法(final修饰的常量除外),因为Static在加载时就创建,此时内部类可能还没被实例化
在外部类的外部实例化对象:
Foo foo = new Foo();
Koo koo = foo.new Koo();
Foo.Koo koo = new Foo().new Koo();

b、静态内部类
静态内部类可以直接访问外部类的静态成员,不能访问外部类的实例成员,但可以通过外部类的实例(new 对象)来访问
静态内部类里面可以定义静态成员(其他内部类不可以)
静态内部类不可以使用private修饰
静态内部类的对象可以直接生成
Foo.Koo koo = new Foo().new Koo();
c、局部内部类
在方法中定义的内部类称为局部内部类,类似局部变量,不可以加修饰符public、protected、private,其范围为定义它的代码块
可以访问外部类的所有成员,还可以访问所在方法中的final修饰的参数和变量,但不能访问方法体中的局部变量
d、匿名内部类
匿名内部类没有类名,它必须继承一个类或者实现一个接口,并且不能显示的extends或implements关键字
匿名内部类不能有构造方法,因为它没有类名。可以通过new<父类名>的方法创建实例对象,匿名类的创建与定义同时进行
匿名内部类只能一次性的创建其对象
匿名内部类既可以在方法体中,也可以在参数列表中
注意:匿名内部类一定是在new的后面隐含实现一个接口或继承一个类,匿名内部类不是抽象类
      匿名内部类必须实现他的父类抽象接口或接口里的所有的抽象方法
new 父类的构造器(实参列表)|实现接口(){
//类体
}
new Object(){
}

3、内部类的访问规则:内部类可以直接访问外部类中的成员,包括私有
                    最近的外部类要访问内部类必须建立内部类对象new Inner().fumction()来访问内部类中的成员
               如: Outer.Inner in = new Outer().new Inner();
                    in.function();

4、使用:当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容。
内部类定义在局部时,不能使用成员修饰符、static修饰,使用时需要new—
可以直接访问外部类中的成员,但不可访问它所在的局部中的变量,只能访问被final修饰的局部变量

5、代码分析:例1:----分类
public class Demo2 {
class B{//成员内部类------Demo2$B.class
}
static class A{//静态成员内部类------Demo2$A.class
}
void show(){
class C{//局部内部类-------Demo2$1C.class
}
}
public static void main(String[] args) {
class C{//局部内部类----Demo2$2C.class
}
System.out.println();
}
}

 

例2:-----匿名内部类

1、  匿名内部类其实就是内部类的简写格式
2、  定义前题必须继承一个类或实现一个接口
3、  匿名内部类的格式: new 父类或接口(){定义子类的内容}
4、  匿名内部类定义的方法最好不要超过三个

public class Test{
       public static void main(String[] agrs){
              Test t=new Test();   //new了 一个Test对象
              t.te(new A(){                //调用实例方法并且声明一个匿名内部类类作为一个参数传入
                            public void as(){
                                   System.out.println("我是实现了接口A的匿名类");
                            }
                     }
              );
      }         
      void te(A a){    //实例方法
              a.as();
      }
}
interface A{    //声明了一个接口类
       void as();    //抽象方法
}

 

例3:
class A{
       void as(){
              System.out.println("我是内部类A");
       }
}
class B{
       void bs(){
              System.out.println("我是内部类B");
       }
}
public class MultipleExtends {
       private class C extends A{}
       private class D extends B{}
       public static void main(String[] args) {
              MultipleExtends m=new MultipleExtends(); //声明一个外部类的对象
              MultipleExtends.C c=m.new C(); //让外部类对象持有一个
              MultipleExtends.D d=m.new D();//内部类对象的引用
              c.as();                                                                                                                          
              d.bs();                                                                                                                          
       }
}


例4:-----内部类是可以被私有的
public class MemberClass {
   private int i=10;  //定义一个私有字段
    private static int j=20;      
    public static void main(String[] args) {
MemberClass mc=new MemberClass();//new 一个外部类的对象
A a=mc.new A();//A a=new MemberClass().new A();//new 一个内部类的对象
a.as();//调用内部类的实例方法
    }
private class A{
//static int j=6;
//int i=5;              //定义一个内部类的实例字段    
void as(){     //定义一个内部类的实例方法
System.out.println("这里是内部类A");   
System.out.println("调用外部类私有实例字段i:"+i);
System.out.print("调用外部类私有静态字段j:"+j);
}
}
}

//---------- java ----------
//这里是内部类A
//调用外部类私有实例字段i:10
//调用外部类私有静态字段j:20

 


例5:----静态内部类
public class StaticClass {         
       private static int i=10; //定义一个私有静态字段
       //private int j=7;
       public static void main(String[] args) {
              StaticClass sc=new StaticClass();//new 一个外部类的对象
              A a=new StaticClass.A(); //new 一个静态内部类
              a.as();            //调用静态内部类的实例方法
              A.at        //调用静态内部类的静态方法
       }
       static class A{       
              int i=5;
              static at(){   //定义静态内部类的静态方法
                     System.out.println("这里是静态内部类的静态方法");
              }
              void as(){                 //定义静态内部类的实例方法
                     System.out.println("这里是内部类A");
                     System.out.print("调用外部类私有静态字段i:"+i);
              }
       }
}

 
例6:------局部内部类
public class InteriorClass {
         private int i=5;
         public static void main(String[] args) {
                   InteriorClass ic=new InteriorClass();   //new 一个对象
                   ic.as();             //调用实例方法
                   //      B b=ic.new B();
         }
         void as(){
                   final int y=5;        //常量       
                   int u=1;            //局部变量
                   class B{
                            void bs(){
                                     System.out.println("这里是内部类B");        
                                     System.out.println("调用i"+i);
                                     System.out.println("常量"+y);
                            }                          
                   }
                   new B().bs();
         }
}

----------------------------------------------------------------------|----------------------------------------------------------------------|
----------------------------------------------------------------------|----------------------------------------------------------------------|
----------------------------------------------------------------------|----------------------------------------------------------------------|

二、异常(try\catch\fainlly\throw\throws)
i、 异常的含义和分类
  a)含义:异常是对问题的描述,将问题进行问题的封装
  b)分类:java.lang.Object-----Throwable(java中所有错误和异常的超类)-----Error(无法通过代码来处理的错误)        
                                            |---------------Exception(可处理的异常,并能恢复运行)
     |---RuntimeException(运行时异常)---可以不捕获也可以不处理
     |----CheckedException(已检查时异常)----必须捕获或处理不然编译失败---IOException\SQLException
 标签(Marker)接口:既无字段又无方法---Cloneable/Serializable/EventListener

 Error----如:JVM硬件错误----OutOfMemoryError—内存不足、不断的创建实例、StackOverflowError---递归导致的堆异常
 
 2、异常分类(Throwable)
  1、编译时被检测的异常
     throws 需要处理
  2、编译时不被检测的异常---运行时异常(RuntimeException或其子类)
    函数内throw,函数外不需要声明,--------无法处理,需要修改代码

ii、 异常处理
a)RuntimeEception及其子类异常,不需要程序员处理,其后语句不编译
b)非运行时异常必须处理
c)Exeception中有一个特殊的子类异常RuntimeException,如果在方法内抛出该异常,方法上可以不用声明,编译可以通过;如果在方法上声明了该异常,调用者可以不用处理,编译可以通过。之所以不在函数声明,是因为不希望让使用者处理,当异常发生时,希望程序停止,程序员修正程序代码

异常的捕获和处理

第一种格式:
try{
         //可能抛出异常的语句
}catch(异常类型 e){
         //处理语句1
} catch(异常类型 e){
         //处理语句2
}finally{
         //一定执行的语句
}

finally只要用于异常处理,修饰异常块,无论异常是否处理都会执行
finally在return、throw前输出,不管return是在try还是catch中
finally定义一定执行的代码,通常用于关闭资源------如:数据库关闭连接

finally块在以下情况将不会被执行:
(1)finally块中发生了异常;
(2)程序所在线程死亡;
(3)在前面的代码中用了System.exit(0);
(4)关闭CPU。

第二种格式:
try{

}finally{

}

第三种格式:
try{

}catch(){

}

 
iii.在多个catch时只执行一个,自上而下遇到的第一个异常所对应的catch,如果没有对应的catch,则先执
行finally后在抛出,没有finally则直接抛出,定义多个catch可精确地定位异常。如果为子类的异常定
义了特殊的catch块,而父类的异常则放在另外一个catch块中,此时,必须满足以下规则:子类异常的处
理块必须在父类异常处理块的前面,否则会发生编译错误。所以,越特殊的异常越在前面处理,越普遍的
异常越在后面处理。这类似于制订防火墙的规则次序:较特殊的规则在前,较普通的规则在后。

throws--------声明方法抛出异常
1、说明:当不知道在当前代码中如何处理的时候,可以选择用throws将异常交给上层调用者处理
2、基本格式:
类型 方法名(形参列表)throws 异常列表(逗号隔开){
          //代码
}

例:
//手工抛出异常实例
public class JavaThrow1{
         public static void main(String[] args){
                   System.out.print(" Now");
                   try{
                            System.out.print(" is");
                            throw new NullPointerException();//直接抛出异常转到catch进行处理
                            //System.out.println("This will not excute!");//有throw这句执行不到
                   }catch (NullPointerException e){
                            System.out.print(" the");
                   }
                   System.out.print(" time.\n");
         }
}

//自动抛异常
public class ExTest {
public static void main(String[] args){
String s=null;
try{
System.out.println("0");
int i=s.length();//自动抛异常--空指针异常
System.out.println("2");
}finally{
System.out.println("1");
}
}
}

例:--------throws
public class ExceptionTest4{
public static void p() throws ArithmeticException{
//间接抛出异常,自己并未处理,让方法的调用者来处理
int i;
i=4/0;//可能发生异常
System.out.println("8");
}
  public static void main(String[] args){    
try{ 
try{
                p();//方法的直接调用调用者捕获异常处理
}catch(ArithmeticException e){
System.out.println("Divider is zero !");
}
}catch(RuntimeException  e){
              System.out.println("4");
}
  }
}

v.java异常处理机制

答:程序出现想数组角标越界,空指针等错误时,JAVA就会用异常Throwable 
来描述这些错误,Throwable继承了Object类,同时实现了Serializable接口,
根据出现的问题是否可以通过程序来解决。把Throwable分为Error错误和Exception异常,Exception根据编译时是否会被检
测分为运行时异常RuntimeException和已检测异常CheckedException。异常的处理方
式有两种,在发生异常的地方直接使用catch处理,或者将异常抛出给调用者,让调用者来处理。

 1、检查性异常------程序正确,但因为外在的环境条件不满足引发。例如:用
户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序
本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,
程序开发者必须考虑并处理这个问题。JAVA编译器强制要求处理这类异常,如果不
捕获这类异常,程序将不能被编译。
  2、运行期异常------这意味着程序存在bug,如数组越界,0被除,入参不满足规
范.....这类异常需要更改程序来避免,JAVA编译器强制要求处理这类异常。
  3、错误------一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般
更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。


三、 自定义异常
当jdk内置异常类型不能满足系统需求时,我们需要自定义异常,如:
public class MyExceptionTest {
         public static void main(String[] args) {
                  MyExceptionTest mt = new MyExceptionTest();
                  mt.manager();
         }

         public void registe(int num) throws MyException{
                  if(num<0){
                           throw new MyException("人数为负数",3);
                  }
                  System.out.println(" 登记人数为:"+num);
         }

         public void manager(){
                  try{
                           registe(-100);
                  }catch (MyException e){
                           System.out.println("登记类型出错:"+e.getId());
                           e.printStackTrace();
                  }       
                  System.out.println(" 操作结束!");
         }
}
class MyException extends Exception{
         private int id;
         public MyException(){}
         public MyException(String message,int id){
                  super(message);//调用父类的getMessage()
                  //父类中已经定义了getMessage()可以直接使用-----------该方法为Exception继承Throwable的
                  this.id=id;
         }
         public int getId(){
                  return id;
         }
}

自定义异常类必须要继承Exception/RuntimeException,如果该异常的发生无法再继续进行运算,就让它继承RuntimeException 
继承的原因是为了让该类自定义类具备可抛型,让该类具备操作异常的共性方法
自定义异常:按照JAVA的OO思想,将程序中出现的特有问题进行封装

四、常见异常
IOException--------------------输入输出异常
ClassNotFoundException-------找不到类异常
NumberFormatException---------字符串到数字格式的异常
FileNotfoundException-----------文件找不到异常
NoSuchMethodException---------------请求方法异常

运行时异常:RuntimeException
SecurityException-----------试图违反安全性异常
NullPointerException----没有实例化却调用其属性和方法--------------空指针异常
ArrayIndexOfBoundsException---------数组越界异常
StringIndexOfBoundsException---------字符串越界异常
ArithmeticException--------------算数异常/除数为零异常
NullPointerException-------试图查找null异常


Main方法通常情况下不能把异常抛给JVM

Super a = new subclass();//向上转型----
---overload看左边,override看右边
-----------------------------------多态针对的是方法
 

异常的好处:1、将问题进行封装
            2、将正常流程代码和问题代码进行分离,方便阅读

处理原则:
1、处理方式有:try或者throws
2、调用到抛出异常的功能时,抛出几个处理几个(一个try对应多个catch)
3、多个catch,父类的catch放到最后
4、Catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace输出语句,也不要不写
5、当铺获到的异常,本功能处理不了时,可以继续在catch中抛出

6、  例:
try{
throw new AException();
}catch(AException e){
throw e;
}

7、如果异常在内部被处理(catch),外部则不需要抛出

基本格式:catch用来处理异常,如果该异常为检测时异常时,必须要处理或者抛出
异常继承时,子类只能抛出父类的异常或者该异常的子类/子集异常,也可以不抛出异常

异常的注意事项
1、在子父类覆盖时,
a)子类抛出的异常必须是父类异常的子类或子集
b)如果父类或接口没有异常抛出时,子类覆盖出现异常,只能try不能抛
c)如果父类中是RuntimeException时,子类可以不用抛出异常,反之,子类为RuntimeException异常,父类为其异常的子类或自己都可以编译通过

1、throw 与throws
throw 后跟异常对象(只能有一个),throws后跟异常类(多个时用逗号隔开);
位置:throw用在方法体中,代表手工抛异常,throws用在方法声明上,代表该方法可能发生异常

2、RuntimeException和CheckedException的区别
前者可以不在方法上声明也可以不处理,后者必须要处理或者抛出

----------------------------------------------------------------------|----------------------------------------------------------------------|
----------------------------------------------------------------------|----------------------------------------------------------------------|
----------------------------------------------------------------------|----------------------------------------------------------------------|
                                                                                                                                                                                                                                                                                                                                                                                                                     
三、集合(collection、set、list、map)

一、定义:
集合是Java里面最常用的,也是最重要的一部分。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。
容器:用来存储数据,不同的容器集合以不同的格式保存对象,它能够自动的改变这个容器的所能存放的数据数量的大小。这一点上,如果使用数组来存储的话,就显得十分的笨拙。
对于对象集合,必须执行的操作主要以下三种:
?       添加新的对象
?       删除对象
?       查找对象
Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:
1)  Collection 。 一组对立的元素,通常这些元素都服从某种规则。List必须保持元素特定的顺序,而Set 不能有重复元素。
2)  Map 。 一组 成对的“键值对”对象。

? Collection – 对象之间没有指定的顺序,允许重复元素。
? Set –  对象之间没有指定的顺序,不允许重复元素
? List–  对象之间有指定的顺序,允许重复元素,并引入位置下标。 
? Map –  接口用于保存关键字(Key)和数值(Value)的集合,集合中的每个对象加入时都提供数值和关键字。Map 接口既不继承 Set 也不继承 Collection。 
List、Set、Map共同的实现基础是Object数组


Collection
1.2.1常用方法
Collection 接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。Collection 在前面的大图也可以看出,它是List和Set 的父类。并且它本身也是一个接口。它定义了作为集合所应该拥有的一些方法。如下:
注意:
集合必须只有对象,集合中的元素不能是基本数据类型。
Collection接口支持如添加和除去等基本操作。设法除去一个元素时,如果这个元素存在,除去的仅仅是集合中此元素的一个实例。
?     boolean add(Object element) 
?     boolean remove(Object element) 
Collection 接口还支持查询操作:
?     int size() 
?     boolean isEmpty() 
?     boolean contains(Object element) 
?     Iterator iterator() 
组操作 :Collection 接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于整个集合的任务。
?     boolean containsAll(Collection collection) 
?     boolean addAll(Collection collection) 
?     void clear() 
?     void removeAll(Collection collection) 
?     void retainAll(Collection collection) 
containsAll() 方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集合是否是当前集合的子集。其余方法是可选的,因为特定的集合可能不支持集合更改。 addAll() 方法确保另一个集合中的所有元素都被添加到当前的集合中,通常称为并。 clear() 方法从当前集合中除去所有元素。 removeAll() 方法类似于 clear() ,但只除去了元素的一个子集。 retainAll() 方法类似于 removeAll() 方法,不过可能感到它所做的与前面正好相反:它从当前集合中除去不属于另一个集合的元素,即交。
 
集合类的基本方法的使用:
import java.util.*;
public class CollectionToArray {
public static void main(String[] args) {
Collection collection1=new ArrayList();//创建一个集合对象
collection1.add("000");//添加对象到Collection集合中
collection1.add("111");
collection1.add("222");
System.out.println("集合collection1的大小:"+collection1.size());
System.out.println("集合collection1的内容:"+collection1);
collection1.remove("000");//从集合collection1中移除掉 "000" 这个对象
System.out.println("集合collection1移除 000 后的内容:"+collection1);
System.out.println("集合collection1中是否包含000 :"+collection1.contains("000"));
System.out.println("集合collection1中是否包含111 :"+collection1.contains("111"));
Collection collection2=new ArrayList();
collection2.addAll(collection1);//将collection1 集合中的元素全部都加到collection2中
System.out.println("集合collection2的内容:"+collection2);
collection2.clear();//清空集合 collection1 中的元素
System.out.println("集合collection2是否为空 :"+collection2.isEmpty());
//将集合collection1转化为数组
Object s[]= collection1.toArray();
for(int i=0;i System.out.println(s[i]);
}
}
}
运行结果为:
集合collection1的大小:3
集合collection1的内容:[000, 111, 222]
集合collection1移除 000 后的内容:[111, 222]
集合collection1中是否包含000 :false
集合collection1中是否包含111 :true
集合collection2的内容:[111, 222]
集合collection2是否为空 :true
111
222
这里需要注意的是,Collection 它仅仅只是一个接口,而真正使用的时候,却是创建该接口的一个实现类。作为集合的接口,它定义了所有属于集合的类所都应该具有的一些方法。
而ArrayList (列表)类是集合类的一种实现方式。
 
Collection的实现基础是数组,所以有转换为Object数组的方法: 
?     Object[] toArray() 
?     Object[] toArray(Object[] a)
其中第二个方法Object[] toArray(Object[] a) 的参数 a 应该是集合中所有存放的对象的类的父类

1.2.2  迭代器(Iterator)
迭代器(Iterator)本身就是一个对象,它的工作就是遍历并选择集合序列中的对象,而客户端的程序员不必知道或关心该序列底层的结构。此外,迭代器通常被称为“轻量级”对象,创建它的代价小。但是,它也有一些限制,例如,某些迭代器只能单向移动。
Collection 接口的 iterator() 方法返回一个 Iterator。Iterator 和Enumeration 接口类似。使用 Iterator 接口方法,可以从头至尾遍历集合,并安全的从底层 Collection 中除去元素。
迭代器的使用:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
 
public class IteratorDemo {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("s1");
collection.add("s2");
collection.add("s3");
Iterator iterator = collection.iterator();//得到一个迭代器
while (iterator.hasNext()) {//遍历
Object element = iterator.next();
System.out.println("iterator = " + element);
}
if(collection.isEmpty())
System.out.println("collection is Empty!");
else
System.out.println("collection is not Empty! size="+collection.size());
Iterator iterator2 = collection.iterator();
while (iterator2.hasNext()) {//移除元素
Object element = iterator2.next();
System.out.println("remove: "+element);
iterator2.remove();
}
Iterator iterator3 = collection.iterator();
if (!iterator3.hasNext()) {//察看是否还有元素
System.out.println("还有元素");
}
if(collection.isEmpty())
System.out.println("collection is Empty!");
//使用collection.isEmpty()方法来判断
}
}
程序的运行结果为:
iterator = s1
iterator = s2
iterator = s3
collection is not Empty! size=3
remove: s1
remove: s2
remove: s3
还有元素
collection is Empty!
可以看到,Java的Collection的Iterator 能够用来,:
1)使用方法 iterator() 要求容器返回一个Iterator .第一次调用Iterator 的next() 方法时,它返回集合序列的第一个元素。
2)使用next() 获得集合序列的中的下一个元素。
3)使用hasNext()检查序列中是否元素。
4)使用remove()将迭代器新返回的元素删除。
需要注意的是:方法删除由next方法返回的最后一个元素,在每次调用next时,remove方法只能被调用一次 。

1.3 List
1.3.1概述
Collection接口实际上并没有直接的实现类。而List是容器的一种,表示列表的意思。当我们不知道存储的数据有多少的情况,
我们就可以使用List 来完成存储数据的工作。例如保存一个应用系统当前的在线用户的信息。List的最大的特点就是能够自动
的根据插入的数据量来动态改变容器的大小。

1.3.2  常用方法
List 就是列表的意思,它是Collection 的一种,即继承了 Collection 接口,又定义一个允许重复项的有序集合。该接口不但
能够对列表的一部分进行处理,还添加了面向位置的操作。List 是按对象的进入顺序进行保存对象,而不做排序或编辑操作。它
除了拥有Collection接口的所有的方法外还拥有一些其他的方法。面向位置的操作包括插入某个元素或 Collection 的功能,还
包括获取、除去或更改元素的功能。在 List 中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置。

1、 void add(int index, Object element):添加对象element到位置index上
2、 boolean addAll(int index, Collection collection):在index位置后添加容器collection中所有的元素
3、 Object get(int index) :取出下标为index的位置的元素
4、 int indexOf(Object element) :查找对象element 在List中第一次出现的位置
5、 int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置
6、 Object remove(int index) :删除index位置上的元素
7、 Object set(int index, Object element) :将index位置上的对象替换为element 并返回老的元素。

List(提供基于索引的对成员的随机访问)------ArrayList-----提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好
  成员可为任意Object子类的对象
----------LinkedList-----对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差
  成员可为任意Object子类的对象 
         
在“集合框架”中有两种常规的 List 实现:ArrayList 和 LinkedList。使用两种 List 实现的哪一种取决于您特定的需要。如果要
支持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList 提供了可选的集合。但如果,您要频繁的从列表的中间
位置添加和除去元素,而只要顺序的访问列表元素,那么,LinkedList 实现更好。

LinkedList 来实现一个简单的队列的例子:
import java.util.*;
 
public class ListExample {
  public static void main(String args[]) {
    LinkedList queue = new LinkedList();
    queue.addFirst("Bernadine");
    queue.addFirst("Elizabeth");
    queue.addFirst("Gene");
    queue.addFirst("Elizabeth");
    queue.addFirst("Clara");
    System.out.println(queue);
    queue.removeLast();
    queue.removeLast();
    System.out.println(queue);
  }
}
运行程序产生了以下输出。请注意,与 Set 不同的是 List 允许重复。
[Clara, Elizabeth, Gene, Elizabeth, Bernadine]
[Clara, Elizabeth, Gene]
该的程序演示了具体 List 类的使用。第一部分,创建一个由 ArrayList 支持的 List。填充完列表以后,特定条目就得到了。示例
的 LinkedList 部分把 LinkedList 当作一个队列,从队列头部添加东西,从尾部除去。

List 接口不但以位置友好的方式遍历整个列表,还能处理集合的子集:
ListIterator listIterator() :返回一个ListIterator 跌代器,默认开始位置为0
ListIterator listIterator(int startIndex) :返回一个ListIterator 跌代器,开始位置为startIndex 
List subList(int fromIndex, int toIndex) :返回一个子列表List ,元素存放为从 fromIndex 到toIndex之前的一个元素。
处理 subList() 时,位于 fromIndex 的元素在子列表中,而位于 toIndex 的元素则不是,提醒这一点很重要。

for-loop :
for (int i=fromIndex; i   // process element at position i
}

对子列表的更改(如 add()、remove() 和 set() 调用)对底层 List 也有影响。


我们看一个List的例子:
import java.util.*;
 
public class ListIteratorTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
System.out.println("下标0开始:"+list.listIterator(0).next());//next()
System.out.println("下标1开始:"+list.listIterator(1).next());
System.out.println("子List 1-3:"+list.subList(1,3));//子列表
ListIterator it = list.listIterator();//默认从下标0开始
//隐式光标属性add操作 ,插入到当前的下标的前面
it.add("sss");
while(it.hasNext()){
System.out.println("next Index="+it.nextIndex()+",Object="+it.next());
}
//set属性
ListIterator it1 = list.listIterator();
it1.next();
it1.set("ooo");
ListIterator it2 = list.listIterator(list.size());//下标
while(it2.hasPrevious()){
System.out.println("previous Index="+it2.previousIndex()+",Object="+it2.previous());
}
}
}
程序的执行结果为:
下标0开始:aaa
下标1开始:bbb
子List 1-3:[bbb, ccc]
next Index=1,Object=aaa
next Index=2,Object=bbb
next Index=3,Object=ccc
next Index=4,Object=ddd
previous Index=4,Object=ddd
previous Index=3,Object=ccc
previous Index=2,Object=bbb
previous Index=1,Object=aaa
previous Index=0,Object=ooo
我们还需要稍微再解释一下 add() 操作。添加一个元素会导致新元素立刻被添加到隐式光标的前面。因此,添加元素后调用 
previous() 会返回新元素,而调用 next() 则不起作用,返回添加操作之前的下一个元素。下标的显示方式,如下图所示:

1.3.3实现原理
ArrayList中主要包含2个属性:
private transient Object elementData[];
private int size;
其中数组::elementData[] 是列表的实现核心属性:数组。 我们使用该数组来进行存放集合中的数据。而我们的初始化参数就
是该数组构建时候的长度,即该数组的length属性就是initialCapacity 参数。

Keys:transient 表示被修饰的属性不是对象持久状态的一部分,不会自动的序列化。

如果要判断一个类的一个实例对象是否等于另外一个对象,那么我们就需要自己覆写Object类的public boolean equals(Object obj)
 方法。如果不覆写该方法的话,那么就会调用Object的equals()方法来进行判断。这就相当于比较两个对象的内存应用地址是否相等了。
在集合框架中,不仅仅是List,所有的集合类,如果需要判断里面是否存放了的某个对象,都是调用该对象的equals()方法来进行处理的。

集合的个数用size();数组用length;String用length();

Collection extends Iterable

方法:
增          add();addAll()---------boolean
删          remove();removeAll();------------boolean
                 clear()-------void
查          Iterator()--------Iterator
改          toArray()-----Object   数组
元素数      size()--------------int

List  extends Collection----------有序的Collection,可重复

新增方法:
add(int index, E element)//在指定位置添加---------添加顺序要是连续的
get(int index)//返回指定位置
listIterator(int index)//从指定位置开始迭代

AbstractList extends AbstractCollection implements List

Set
无序的不可重复的Collection

Map
键K不可以重复,值V可以重复

ArrayList------------在查询时快,增删改时慢

例:
import java.util.*;
//注解
//@SuperessWarnings("unchecked")---------

public class Demo{
public static void main(String[] args) {
List alist = new ArrayList();//List是接口,不能被实例化

//增加
alist.add("123");
alist.add(new StringBuffer("1s1"));
alist.add(3.4f);
alist.add(3.01d);
alist.add(1,222);//[123, 222, 323]

alist.add("123");//[123, 222, 323, 123]----------可重复
System.out.println(alist);//相当于toString()
System.out.println("长度为:"+alist.size());
System.out.println("------------------------------");
//删除
alist.remove(2);//角标
System.out.println(alist);
//alist.clear();
alist.remove("123");//移除的是第一次出现的
System.out.println(alist);
System.out.println(alist.isEmpty());
System.out.println("------------------------------");
//遍历
//第一种:
for(int i=0;i Object e = alist.get(i);
if(e instanceof String){//Object inteanceof 类型----判断类型是否是Object的实例
System.out.println(((String)e).length());
}else if(e instanceof Double){
System.out.println(((Double)e).intValue());
}
}

//第二种:
for(Object e:alist){
System.out.println(e);
}
System.out.println("------------------------------");
//List alist1 = new ArrayList();
int size = alist.size();
System.out.println(" size="+size);
boolean flag = alist.isEmpty();//判断是否为空
System.out.println(" flag="+flag);
System.out.println("------------------------------");
//第三种:Iterable-----迭代器输出
//Iterable Iteratoriterator();
Iterator it = alist.iterator();//Iterator与Iterable无关,是两个接口
while(it.hasNext()){
Object i = it.next();
System.out.println(i);
}
//System.out.println(alist.iterator());
System.out.println("--------------------------------");
//第一种:
for(int i=0;i System.out.print(alist.get(i)+",");//按照下标获取
}
System.out.println(" ");
System.out.println("--------------------------------");
//第四种:
for(Iterator it2 = alist.iterator();it2.hasNext();){
System.out.println(it2.next());
}
//转换
//alist.toArray();
//System.out.println(alist);

}
}


LinkedList-----------增删改快,查询慢
例:
import java.util.*;
public class  Demo1{
public static void main(String[] args) {
Queue link = new LinkedList();
//Queue是单端队列----------单链表
link.add(21);
link.offer(111);//队尾添加========>add
link.poll();//队头删除
System.out.println(link.remove());
link.poll();//为空时返回null==========>remove
System.out.println(link.poll());
link.peek();//访问=========>get
//link.remove();为空时异常
System.out.println(link.size());
System.out.println("-------------------------------------");

Deque dl = new LinkedList();
//Deque是双端队列--------双向链表
-------------------------------------------------------------------------------
第一个元素(头部)             最后一个元素(尾部)

               抛出异常     特殊值          抛出异常       特殊值

插入 addFirst(e)   offerFirst(e)   addLast(e)     offerLast(e) 
移除 removeFirst() pollFirst()     removeLast()   pollLast() 
检查 getFirst()    peekFirst()     getLast()      peekLast() 
-------------------------------------------------------------------------------
//add、offer默认在尾部增加 
//remove、poll默认从第一个开始删除

dl.add(123);//默认在尾部增加
dl.addFirst("sss");
dl.offerFirst(231);
dl.addLast(2212);
dl.offerLast(654);
System.out.println(dl);

System.out.println("-------------------1---------------");
//dl.removeFirst();
//System.out.println(dl);
//System.out.println("------------------2----------------");
dl.pollLast();
System.out.println(dl);
System.out.println("-----------------3-----------------");

        System.out.println(dl.getFirst());

System.out.println("-----------------4-----------------");
dl.peek();
System.out.println(dl);
}
}


注意:所有的集合框架都位于java.util包中,使用前必须导入该包中的类
熟悉并记忆以下接口之间的关系和相关方法
Iterable--------->接口(java.lang)
        常见方法1:Iterator iterator()
 Iterator--------->接口
        常见方法1:boolean hasNext()
        常见方法2:E   next()
 Collection------->Iterable-------------->接口 
         常见方法1:int size()
         常见方法2:boolean isEmpty()
 常见方法3:void clear()
         常见方法4:boolean  add(E e)
 常见方法5:remove()
 List(线性表)----->Collection------->Iterable-------------->接口
         常见方法1:add(int index,E e)
 常见方法2:remove(int index,E e)
   常见方法3:E get(int index)
 Queue(队列)----->Collection------->Iterable-------------->接口
         常见方法1:offer(E e)  
 常见方法2:poll()
   常见方法3:E peek()
 Deque(双端队列)----->Queue----->Collection------->Iterable-------------->接口
         常见方法1:offerFirst(E e)和offerLast(E e)
 常见方法2:pollFirst()和pollLast
   常见方法3:E peekFirst()和peekLast
ArrayList-->AbstractList-->List--->Collection--->Iterator--------->类
LinkedList--->AbstractList-->List--->Collection--->Iterator--------->类
                    --->Deque---->Queue----->
Vector--->AbstractList-->List--->Collection--->Iterator--------->类
Stack-->Vector--->AbstractList-->List--->Collection--->Iterator--------->类
         常见方法1:E pop()
 常见方法2:E push(E e)
 常见方法3:E peek()
   常见方法4:boolean empty()
stack-----------后进先出---一端


无序的不可重复的(判断重复的标准是hashCode()+equals()),如果重复定义则会覆盖
LinkedSet---------------重复时保留第一个
TreeSet-------------(String)按照ASCll码进行排序

加载因子:加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希
表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。
通常,默认加载因子 (.75) 在时间和空间成本上寻 求一种折衷。加载因子过高虽然减少
了空间开销,但同时也增加了查询成本(在大多数 Hashtable类的操作中,包括 get 和 
put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加
载因子,以便最大限度地降低 rehash 操作次数。如果初始容量大于最大条目数除以加载
因子,则不会发生 rehash 操作

List默认容量10,HashSet默认容量16,加载因子0.75;

HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量是哈希表中桶的数量,
初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到
多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希
表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。

在比较时可以自定义一个比较方式,此类必须要继承Comparable接口,并实现compareTo( T t){ ----重写toString()输出
   
 return -1|0|1;      //  <|=|>
}

import java.util.*;
public class HashSetTest{
public static void main(String[] args) {
/*Set set1 = new LinkedHashSet();
set1.add("sds");
set1.add("2sa");
set1.add("213");
set1.add("213");
System.out.println(set1);//无序
System.out.println("--------------------------------------");
Set set2 = new HashSet();
set2.add("sds");
set2.add("213");
set2.add("2sa");
set2.add("213");
System.out.println(set2);//按插入顺序输出
System.out.println("--------------------------------------");

Set set3 = new TreeSet();
set3.add("sds");
set3.add("213");
set3.add("2sa");
set3.add("213");
System.out.println(set3); //排序
System.out.println("--------------------------------------");
*/
Set set=new TreeSet();
Cat c1=new Cat(2,"red");
Cat c2=new Cat(1,"black");
Cat c3=new Cat(3,"white");
set.add(c1);
set.add(c2);
set.add(c3);
System.out.println(set.toString());
}
}

class Cat implements Comparable{
private int age;
private String color;
public Cat(int age,String color){
this.age=age;
this.color=color;
}
public String toString(){
return "{age="+age+" , color="+color+"}";
}
    public int compareTo(Cat o){
  if(this.age>o.age){
            return 1;
  }else{
    return -1;
  }
   }
}
//---------- java ----------
//[{age=1 , color=black}, {age=2 , color=red}, {age=3 , color=white}]

LinkedHashSet--->HashSet----->AbstractSet----->Set--->Collection------>Iterable
                                TreeSet------>AbstractSet----->Set--->Collection------>Iterable
                                TreeSet------>SortedSet------>Set---->Collection------>Iterable

 

Map

 泛型擦除----------类型擦除
     类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字
节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再
必要的时候添加类型检查和类型转换的方法。
     类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java
代码直接转换成普通java字节码。
     
   类型擦除的主要过程如下:
     1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
     2.移除所有的类型参数,如:
interface Comparable
  public int compareTo( A that); 

final class NumericValue implements Comparable
  priva te byte value;  
  public  NumericValue (byte value) { this.value = value; }  
  public  byte getValue() { return value; }  
  public  int compareTo( NumericValue t hat) { return this.value - that.value; } 

-----------------
class Collections {  
  public static
>A max(Collection xs) { 
    Iterator
xi = xs.iterator(); 
    A w = xi.next(); 
    while (xi.hasNext()) { 
      A x = xi.next(); 
      if (w.compareTo(x) < 0) w = x; 
    } 
    return w; 
  } 

final class Test { 
  public static void main (String[ ] args) { 
    LinkedList numberList = new LinkedList (); 
    numberList .add(new NumericValue((byte)0));  
    numberList .add(new NumericValue((byte)1));  
    NumericValue y = Collections.max( numberList );  
  } 
}
经过类型擦除后的类型为
 interface Comparable { 
  public int compareTo( Object that); 

final class NumericValue implements Comparable { 
  priva te byte value;  
  public  NumericValue (byte value) { this.value = value; }  
  public  byte getValue() { return value; }  
  public  int compareTo( NumericValue t hat)   { return this.value - that.value; } 
  public  int compareTo(Object that) { return this.compareTo((NumericValue)that);  } 

-------------
class Collections {  
  public static Comparable max(Collection xs) { 
    Iterator xi = xs.iterator(); 
    Comparable w = (Comparable) xi.next(); 
    while (xi.hasNext()) { 
      Comparable x = (Comparable) xi.next(); 
      if (w.compareTo(x) < 0) w = x; 
    } 
    return w; 
  } 

final class Test { 
  public static void main (String[ ] args) { 
    LinkedList numberList = new LinkedList(); 
    numberList .add(new NumericValue((byte)0));  ,
    numberList .add(new NumericValue((byte)1));  
    NumericValue y = (NumericValue) Collections.max( numberList );  
  } 
}
第一个泛型类Comparable
擦除后 A被替换为最左边界Object。Comparable的类
型参数NumericValue被擦除掉,但是这直 接导致NumericValue没有实现接口Comparable的compareTo(Object that)
方法,于是编译器充当好人,添加了一个桥接方法。
第二个示例中限定了类型参数的边界
>A,A必须为Comparable的子类
,按照类型擦除的过程,先讲所有的类型参数 ti换为最左边界Comparable
,然后去掉参数类型A,
得到最终的擦除后结果。

 

Collection 和 Collections的区别。

Collection是个java.util下的接口,它是各种集合结构的父接口。继承与他的接口主要有Set 和List.
Collections是个java.util下的专用静态类,它包含有各种有关集合操作的静态方法。提供一系列静态
方法实现对各种集合的搜索、排序、线程安全化等操作。

Array与Arrays的区别。

1.数组类Array,是Java中最基本的一个存储结构。提供了动态创建和访问 Java 数组的方法。其中的
元素的类型必须相同。效率高,但容量固定且无法动态改变。 它无法判断其中实际存有多少元素,
length只是告诉我们array的容量。
2、Arrays类,此静态类专门用来操作array ,提供搜索、排序、复制等静态方法。equals():比较两个
array是否相等。array拥有相同元素个数,且所有对应元素两两相等。 sort():用来对array进行排序。
 binarySearch():在排好序的array中寻找元素。

collections
例:
import java.util.*;
public class CollectionsDemo {
public static void main(String[] args) {
List sl = new ArrayList();
sl.add("jhn");
sl.add("ncgcxs");
sl.add("rgd");
sl.add("ceaz");
sl.add("vfe");
sl.add("byt");
sl.add("fe");
Collections.sort(sl);
System.out.println(sl);
//Collections.binarySearch(1);
//Collections.copy(sl);
System.out.println(Collections.max(sl));//max
System.out.println(Collections.min(sl));//min
Collections.reverse(sl);//反转
System.out.println(sl);
Collections.shuffle(sl);//打散
System.out.println(sl);
}


HashMap遍历的两种方式

第一种: 
Map map = new HashMap(); 
Iterator iter = map.entrySet().iterator(); 
while (iter.hasNext()) { 
    Map.Entry entry = (Map.Entry) iter.next(); 
    Object key = entry.getKey(); 
    Object val = entry.getValue(); 

效率高,以后一定要使用此种方式! 
第二种: 
Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
    Object key = iter.next(); 
    Object val = map.get(key); 

效率低,以后尽量少使用!

HashMap 与 TreeMap的区别
    集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。在Map 
中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那
么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和equals()的实现。这个TreeMap
没有调优选项,因为该树总处于平衡状态。

TreeMap
(http://www.cnblogs.com/hzmark/archive/2013/01/02/TreeMap-Base.html)
Java 集合系列目录(Category)
(http://www.cnblogs.com/skywang12345/p/3323085.html)

----------------------------------------------------------------------|----------------------------------------------------------------------|
----------------------------------------------------------------------|----------------------------------------------------------------------|
----------------------------------------------------------------------|----------------------------------------------------------------------|
                                                                                                                                                 

四、I/O流、File

File--------java.io.File--------文件和目录路径名的抽象表示形式

常用方法:
createNewFile(" ")---------创建文件
delete(" ")
exists()-----------测试是否存在
getName()---------获得文件名

例:
String path = File.separator;//与系统有关的默认名称分隔符
File f = new File("c:"+path+"c.txt");
ystem.out.println(f.createNewFile());

 

例:import java.io.*;
public class FileDemo {
public static void main(String[] args) throws IOException{
/*
File f = new File("c:\\Users\\Rainlate\\Desktop\\123.txt");//注意\的转义字符
//构建实例不代表创建文件
boolean b =f.createNewFile();//创建文件
f.mkdirs();//创建前不必有父目录
//f.createTempFile(sd,jsp);//使用给定前缀和后缀生成其名称创建空文件
//f.createTempFile(23,txt, null);//使用给定前缀和后缀生成其名称
//boolean d1 = f.delete();//删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除
System.out.println(f.exists());//是否存在文件
System.out.println(f.getName());//123.txt
String path = File.separator;
File f = new File("c:"+path+"c.txt");
System.out.println(f.createNewFile());
String a = File.separator;
String path="c:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"1";
File f = new File(path);
File[] files = new listFiles(f);
for(String file:files){
System.out.println(file);
}
*/
File x= new File("c:\\Users\\Rainlate\\Desktop\\1");
show(x);
}

public static void show(File f){//递归输出源目录下的所有文件
if(f.isDirectory()){//判断是否为目录
File[] files =f.listFiles();
for(int i=0;i show(files[i]);
}
}else{
System.out.println(f.getPath());
}
}
}


IO流:
第一,确定方向-----------输入输出是以程序为中心
第二,确定是字节还是字符【若是字符型文本使用字符流,其他使用字节流】
第三,确定是否需要缓冲【autoFlush、Flush】----------缓冲流是用空间换时间
第四,所有操作必须关闭【在finally关闭】

例1;
import java.io.*;
public class  FileInputStreamDemo{//文本复制
public static void main(String[] args) {
String a = File.separator;//与系统有关的默认名称分隔符
FileInputStream fin = null;
//FileOutputStream fo = null;
BufferedOutputStream fo = null;
try{
fin = new FileInputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"123.docx");
byte[] b = new byte[512];//存储读取数据的缓冲区
long start = System.currentTimeMillis();
int size = fin.read(b,0,b.length);
//fo = new FileOutputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"12.java");
fo = new BufferedOutputStream (new FileOutputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"12.docx"));
while(size != -1){
fo.write(b,0,size);//文件的实际大小
fo.flush();
size = fin.read(b,0,b.length);
}
long late = System.currentTimeMillis();
System.out.println(late-start);
}catch (FileNotFoundException e){
System.out.println(e.getMessage());
}catch(IOException e){
System.out.println(e.getMessage());
}finally{
try{
fin.close();//关闭输入流
        fo.close();//关闭输出流
}catch (IOException e){
System.exit(1);//异常退出
}
}
}
}

例2:
import java.io.*;
public class ObjectSerializable {
public static void main(String[] args) {
Person p = new Person(32,"huhu");
String a = File.separator;
ObjectOutputStream ou =null;//序列化
ObjectInputStream oin = null;//反序列化
try{
ou = new ObjectOutputStream(new FileOutputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"1.txt"));
ou.writeObject(p);//对象序列化
ou.flush();

//反序列化
oin = new ObjectInputStream(new FileInputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"1.txt"));
Object obj = oin.readObject();
Person as = (Person)obj;
System.out.println(as);
out.flush();
}catch (FileNotFoundException e){
System.out.println(e.getMessage());
}catch(IOException e){
System.out.println(e.getMessage());
}catch(ClassNotFoundException e){
System.out.println(e.getMessage());
}finally{
try{
out.close();
}catch (IOException e){
System.exit(1);
}
}
}
}

class Person implements Serializable {
private int age;
private String name;
public Person(int age,String name){
this.age=age;
this.name=name;
}
public String toString(){
return "name="+this.name+",age="+this.age;
}
}


序列化的版本号(serialVersionUID=1L)?
作用:就是确保了不同版本之间的兼容性,不仅能够向前兼容,还能够向后兼容,即在版本升级时反序列化仍保持对象的唯一性。
它有两种生成方式:       
       一个是默认的1L,比如:private static final long serialVersionUID = 1L;
       一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:  private static final long serialVersionUID = xxxxL 


类图结构
  ┌BufferedReader
  ├InputStream──FileReader
  ├StringReader
┌Reader─┤
│   ├PipedReader
│   ├ByteArrayReader
│   └FileReader──PushbackReader
字符流─┤
│   ┌BufferedWriter
│   ├OutputStreamWriter──FileWriter
│   ├PrinterWriter
└Writer─┼StringWriter
  ├PipedWriter
  ├CharArrayWriter
  └FileWriter


┌FileInputStream
│ ┌BufferedInputStream
├FilterInputStream ──┼DataInputStream
│ └PushbackInputStream
┌InputStream ─┼ObjectInputStream
│ ├PipedInputStream
│ ├SequenceInputStream
│ ├StringBufferInputStream
│ └ByteArrayInoutStream
字节流─┤

│  ┌FileOutputStream
│  │   ┌BufferedOutputStream
│  ├FilterOutputStream ──┼DataOutputStream
└OutputStream ─┤   └PrintStream
 ├ObjectOutputStream
 ├PipedOutputStream

 

IO流------(http://developer.51cto.com/art/201309/410913.htm)

----------------------------------------------------------------------|----------------------------------------------------------------------|
----------------------------------------------------------------------|----------------------------------------------------------------------|
----------------------------------------------------------------------|----------------------------------------------------------------------|
                                                                                                                                                 

五、html

  定义文档类型。
定义 HTML 文档。
定义文档的主体。

to

定义 HTML 标题。

定义段落。

定义简单的折行。


定义水平线。
定义注释。

定义粗体文本。
不赞成使用。定义文本的字体、尺寸和颜色
定义斜体文本。
定义强调文本。
定义大号文本。
定义语气更为强烈的强调文本。
定义小号文本。
定义上标文本。
定义下标文本。
定义文本的方向。
不赞成使用。定义下划线文本。

 定义预格式文本
定义计算机代码文本。
定义打字机文本。
定义键盘文本。
定义文本的变量部分。
定义定义项目。
定义计算机代码样本。
不赞成使用。定义预格式文本。 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <acronym> 定义只取首字母的缩写。<br style="background-color:inherit"> <abbr> 定义缩写。<br style="background-color:inherit"> <address> 定义文档作者或拥有者的联系信息。<br style="background-color:inherit"> <blockquote> 定义块引用。<br style="background-color:inherit"> <center> 不赞成使用。定义居中文本。<br style="background-color:inherit"> <q> 定义短的引用。<br style="background-color:inherit"> <cite> 定义引用(citation)。<br style="background-color:inherit"> <ins> 定义被插入文本。<br style="background-color:inherit"> <del> 定义被删除文本。<br style="background-color:inherit"> <s> 不赞成使用。定义加删除线的文本。<br style="background-color:inherit"> <strike> 不赞成使用。定义加删除线的文本。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <a> 定义锚。<br style="background-color:inherit"> <link> 定义文档与外部资源的关系。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <frame> 定义框架集的窗口或框架。<br style="background-color:inherit"> <frameset> 定义框架集。<br style="background-color:inherit"> <noframes> 定义针对不支持框架的用户的替代内容。<br style="background-color:inherit"> <iframe> 定义内联框架。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <form> 定义供用户输入的 HTML 表单。<br style="background-color:inherit"> <input> 定义输入控件。<br style="background-color:inherit"> <textarea> 定义多行的文本输入控件。<br style="background-color:inherit"> <button> 定义按钮。<br style="background-color:inherit"> <select> 定义选择列表(下拉列表)。<br style="background-color:inherit"> <optgroup> 定义选择列表中相关选项的组合。<br style="background-color:inherit"> <option> 定义选择列表中的选项。<br style="background-color:inherit"> <label> 定义 input 元素的标注。<br style="background-color:inherit"> <fieldset> 定义围绕表单中元素的边框。<br style="background-color:inherit"> <legend> 定义 fieldset 元素的标题。<br style="background-color:inherit"> <isindex> 不赞成使用。定义与文档相关的可搜索索引。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <ul> 定义无序列表。<br style="background-color:inherit"> <ol> 定义有序列表。<br style="background-color:inherit"> <li> 定义列表的项目。<br style="background-color:inherit"> <dir> 不赞成使用。定义目录列表。<br style="background-color:inherit"> <dl> 定义定义列表。<br style="background-color:inherit"> <dt> 定义定义列表中的项目。<br style="background-color:inherit"> <dd> 定义定义列表中项目的描述。<br style="background-color:inherit"> <menu> 不赞成使用。定义菜单列表。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <img> 定义图像。<br style="background-color:inherit"> <map> 定义图像映射。<br style="background-color:inherit"> <area> 定义图像地图内部的区域。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <table> 定义表格<br style="background-color:inherit"> <caption> 定义表格标题。<br style="background-color:inherit"> <th> 定义表格中的表头单元格。<br style="background-color:inherit"> <tr> 定义表格中的行。<br style="background-color:inherit"> <td> 定义表格中的单元。<br style="background-color:inherit"> <thead> 定义表格中的表头内容。<br style="background-color:inherit"> <tbody> 定义表格中的主体内容。<br style="background-color:inherit"> <tfoot> 定义表格中的表注内容(脚注)。<br style="background-color:inherit"> <col> 定义表格中一个或多个列的属性值。<br style="background-color:inherit"> <colgroup> 定义表格中供格式化的列组。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <style> 定义文档的样式信息。<br style="background-color:inherit"> <div> 定义文档中的节。<br style="background-color:inherit"> <span> 定义文档中的节。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <head> 定义关于文档的信息。<br style="background-color:inherit"> <title> 定义文档的标题。<br style="background-color:inherit"> <meta> 定义关于 HTML 文档的元信息。<br style="background-color:inherit"> <base> 定义页面中所有链接的默认地址或默认目标。<br style="background-color:inherit"> <basefont> 不赞成使用。定义页面中文本的默认字体、颜色或尺寸。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <script> 定义客户端脚本。<br style="background-color:inherit"> <noscript> 定义针对不支持客户端脚本的用户的替代内容。<br style="background-color:inherit"> <applet> 不赞成使用。定义嵌入的 applet。<br style="background-color:inherit"> <object> 定义嵌入的对象。<br style="background-color:inherit"> <param> 定义对象的参数。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit">                                                                                                                                                   <br style="background-color:inherit"> 六、CSS</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 背景属性(Background)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> background 在一个声明中设置所有的背景属性。 1<br style="background-color:inherit"> background-attachment 设置背景图像是否固定或者随着页面的其余部分滚动。 1<br style="background-color:inherit"> background-color 设置元素的背景颜色。 1<br style="background-color:inherit"> background-image 设置元素的背景图像。 1<br style="background-color:inherit"> background-position 设置背景图像的开始位置。 1<br style="background-color:inherit"> background-repeat 设置是否及如何重复背景图像。 1</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 边框属性(Border 和 Outline)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> border 在一个声明中设置所有的边框属性。 1<br style="background-color:inherit"> border-bottom 在一个声明中设置所有的下边框属性。 1<br style="background-color:inherit"> border-bottom-color 设置下边框的颜色。 2<br style="background-color:inherit"> border-bottom-style 设置下边框的样式。 2<br style="background-color:inherit"> border-bottom-width 设置下边框的宽度。 1<br style="background-color:inherit"> border-color 设置四条边框的颜色。 1<br style="background-color:inherit"> border-left 在一个声明中设置所有的左边框属性。 1<br style="background-color:inherit"> border-left-color 设置左边框的颜色。 2<br style="background-color:inherit"> border-left-style 设置左边框的样式。 2<br style="background-color:inherit"> border-left-width 设置左边框的宽度。 1<br style="background-color:inherit"> border-right 在一个声明中设置所有的右边框属性。 1<br style="background-color:inherit"> border-right-color 设置右边框的颜色。 2<br style="background-color:inherit"> border-right-style 设置右边框的样式。 2<br style="background-color:inherit"> border-right-width 设置右边框的宽度。 1<br style="background-color:inherit"> border-style 设置四条边框的样式。 1<br style="background-color:inherit"> border-top 在一个声明中设置所有的上边框属性。 1<br style="background-color:inherit"> border-top-color 设置上边框的颜色。 2<br style="background-color:inherit"> border-top-style 设置上边框的样式。 2<br style="background-color:inherit"> border-top-width 设置上边框的宽度。 1<br style="background-color:inherit"> border-width 设置四条边框的宽度。 1<br style="background-color:inherit"> outline 在一个声明中设置所有的轮廓属性。 2<br style="background-color:inherit"> outline-color 设置轮廓的颜色。 2<br style="background-color:inherit"> outline-style 设置轮廓的样式。 2<br style="background-color:inherit"> outline-width 设置轮廓的宽度。 2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 文本属性(Text)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> color 设置文本的颜色。 1<br style="background-color:inherit"> direction 规定文本的方向 / 书写方向。 2<br style="background-color:inherit"> letter-spacing 设置字符间距。 1<br style="background-color:inherit"> line-height 设置行高。 1<br style="background-color:inherit"> text-align 规定文本的水平对齐方式。 1<br style="background-color:inherit"> text-decoration 规定添加到文本的装饰效果。 1<br style="background-color:inherit"> text-indent 规定文本块首行的缩进。 1<br style="background-color:inherit"> text-shadow 规定添加到文本的阴影效果。 2<br style="background-color:inherit"> text-transform 控制文本的大小写。 1<br style="background-color:inherit"> unicode-bidi 设置文本方向。 2<br style="background-color:inherit"> white-space 规定如何处理元素中的空白。 1<br style="background-color:inherit"> word-spacing 设置单词间距。 1</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 字体属性(Font)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> font 在一个声明中设置所有字体属性。 1<br style="background-color:inherit"> font-family 规定文本的字体系列。 1<br style="background-color:inherit"> font-size 规定文本的字体尺寸。 1<br style="background-color:inherit"> font-size-adjust 为元素规定 aspect 值。 2<br style="background-color:inherit"> font-stretch 收缩或拉伸当前的字体系列。 2<br style="background-color:inherit"> font-style 规定文本的字体样式。 1<br style="background-color:inherit"> font-variant 规定是否以小型大写字母的字体显示文本。 1<br style="background-color:inherit"> font-weight 规定字体的粗细。 1</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 外边距属性(Margin)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> margin 在一个声明中设置所有外边距属性。 1<br style="background-color:inherit"> margin-bottom 设置元素的下外边距。 1<br style="background-color:inherit"> margin-left 设置元素的左外边距。 1<br style="background-color:inherit"> margin-right 设置元素的右外边距。 1<br style="background-color:inherit"> margin-top 设置元素的上外边距。 1</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 内边距属性(Padding)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> padding 在一个声明中设置所有内边距属性。 1<br style="background-color:inherit"> padding-bottom 设置元素的下内边距。 1<br style="background-color:inherit"> padding-left 设置元素的左内边距。 1<br style="background-color:inherit"> padding-right 设置元素的右内边距。 1<br style="background-color:inherit"> padding-top 设置元素的上内边距。 1</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 列表属性(List)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> list-style 在一个声明中设置所有的列表属性。 1<br style="background-color:inherit"> list-style-image 将图象设置为列表项标记。 1<br style="background-color:inherit"> list-style-position 设置列表项标记的放置位置。 1<br style="background-color:inherit"> list-style-type 设置列表项标记的类型。 1<br style="background-color:inherit"> marker-offset   2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 内容生成(Generated Content)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> content 与 :before 以及 :after 伪元素配合使用,来插入生成内容。 2<br style="background-color:inherit"> counter-increment 递增或递减一个或多个计数器。 2<br style="background-color:inherit"> counter-reset 创建或重置一个或多个计数器。 2<br style="background-color:inherit"> quotes 设置嵌套引用的引号类型。 2<br style="background-color:inherit"> CSS 尺寸属性(Dimension)</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 属性 描述 CSS<br style="background-color:inherit"> height 设置元素高度。 1<br style="background-color:inherit"> max-height 设置元素的最大高度。 2<br style="background-color:inherit"> max-width 设置元素的最大宽度。 2<br style="background-color:inherit"> min-height 设置元素的最小高度。 2<br style="background-color:inherit"> min-width 设置元素的最小宽度。 2<br style="background-color:inherit"> width 设置元素的宽度。 1</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 定位属性(Positioning)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> bottom 设置定位元素下外边距边界与其包含块下边界之间的偏移。 2<br style="background-color:inherit"> clear 规定元素的哪一侧不允许其他浮动元素。 1<br style="background-color:inherit"> clip 剪裁绝对定位元素。 2<br style="background-color:inherit"> cursor 规定要显示的光标的类型(形状)。 2<br style="background-color:inherit"> display 规定元素应该生成的框的类型。 1<br style="background-color:inherit"> float 规定框是否应该浮动。 1<br style="background-color:inherit"> left 设置定位元素左外边距边界与其包含块左边界之间的偏移。 2<br style="background-color:inherit"> overflow 规定当内容溢出元素框时发生的事情。 2<br style="background-color:inherit"> position 规定元素的定位类型。 2<br style="background-color:inherit"> right 设置定位元素右外边距边界与其包含块右边界之间的偏移。 2<br style="background-color:inherit"> top 设置定位元素的上外边距边界与其包含块上边界之间的偏移。 2<br style="background-color:inherit"> vertical-align 设置元素的垂直对齐方式。 1<br style="background-color:inherit"> visibility 规定元素是否可见。 2<br style="background-color:inherit"> z-index 设置元素的堆叠顺序。 2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 打印属性(Print)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> orphans 设置当元素内部发生分页时必须在页面底部保留的最少行数。 2<br style="background-color:inherit"> page-break-after 设置元素后的分页行为。 2<br style="background-color:inherit"> page-break-before 设置元素前的分页行为。 2<br style="background-color:inherit"> page-break-inside 设置元素内部的分页行为。 2<br style="background-color:inherit"> widows 设置当元素内部发生分页时必须在页面顶部保留的最少行数。 2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 表格属性(Table)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> border-collapse 规定是否合并表格边框。 2<br style="background-color:inherit"> border-spacing 规定相邻单元格边框之间的距离。 2<br style="background-color:inherit"> caption-side 规定表格标题的位置。 2<br style="background-color:inherit"> empty-cells 规定是否显示表格中的空单元格上的边框和背景。 2<br style="background-color:inherit"> table-layout 设置用于表格的布局算法。 2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 伪类(Pseudo-classes)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> :active 向被激活的元素添加样式。 1<br style="background-color:inherit"> :focus 向拥有键盘输入焦点的元素添加样式。 2<br style="background-color:inherit"> :hover 当鼠标悬浮在元素上方时,向元素添加样式。 1<br style="background-color:inherit"> :link 向未被访问的链接添加样式。 1<br style="background-color:inherit"> :visited 向已被访问的链接添加样式。 1<br style="background-color:inherit"> :first-child 向元素的第一个子元素添加样式。 2<br style="background-color:inherit"> :lang 向带有指定 lang 属性的元素添加样式。 2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> CSS 伪元素(Pseudo elements)<br style="background-color:inherit"> 属性 描述 CSS<br style="background-color:inherit"> :first-letter 向文本的第一个字母添加特殊样式。 1<br style="background-color:inherit"> :first-line 向文本的首行添加特殊样式。 1<br style="background-color:inherit"> :before 在元素之前添加内容。 2<br style="background-color:inherit"> :after 在元素之后添加内容。 2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit">                                                                                                                                                  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> JDK1.5新特性:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 七、枚举<br style="background-color:inherit"> 枚举是一个类类型,是JDK1.5的新特性</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举的关键字是enum</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java中所有的枚举类都是java.lang.Enum的子类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 注意:枚举类中可以包含成员有【字段(常量)、方法(构造方法、普通方法)】</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举中不能有number;不能赋值------------类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  只有顺序可以比较-----------</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 语法:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> enum 枚举名{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          枚举体</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> enum Direction{//枚举体</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          EAST,SOUTH,WEST,NORTH//后面可以有分号也可以没有</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 调用:枚举名.成员</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举名 name =枚举名.成员;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Direction dir = Direction.EAST;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Enum的方法使用:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Javap---------------查看字节码文件</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 代码:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> enum Direction{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> EAST('e'),SOUTH('s'),NORTH('n'),WEST('w');</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     protected char a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> private Direction(char a){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> this.a = a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public String toString(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> return a+"";</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 字节码:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> ---------- javap ----------</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Compiled from "Direction.java"</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> final class Direction extends java.lang.Enum<Direction> {//不能被实例化</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static final Direction EAST;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static final Direction SOUTH;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static final Direction NORTH;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static final Direction WEST;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   protected char a;//默认是private,但可以使用4P</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static Direction[] values();//默认方法,用来遍历打印枚举成员</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static Direction valueOf(java.lang.String);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public java.lang.String toString();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   static {};//静态初始化块</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 由上面可以知道枚举继承java.lang.Enum类,参数的默认修饰符public static final,在枚举中可以使用4p</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum A{BLUE,RED,BLACK};//声明并定义一个枚举,初始化为。。。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 在一个类中定义一个enum成员,enum默认是静态的-------------相当于类变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举的用法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一、常量-----------枚举出来之前都是通过接口</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 在JDK1.5 之前,我们定义常量都是: public static fianl,现在可以把相关的常量分组到一个枚举类型里,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum Color {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   RED, GREEN, BLANK, YELLOW</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 二、Switch</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> JDK1.5之后的switch语句支持Byte,short,int,char,enum类型,使用枚举,能让我们的代码可读性更强,JDK1.7之后开始支持String类型,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> enum Signal {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          GREEN, YELLOW, RED</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class TrafficLight {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          Signal color = Signal.RED;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void change() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    switch (color) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    case RED:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             color = Signal.GREEN;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             break;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    case YELLOW:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             color = Signal.RED;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             break;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    case GREEN:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             color = Signal.YELLOW;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             break;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 三、向枚举中添加新方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 要自定义方法,必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum实例,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum Color {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 成员变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private String name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private int index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 构造方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private Color(String name, int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.name = name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.index = index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 普通方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public static String getName(int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    for (Color c : Color.values()) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             if (c.getIndex() == index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                                      return c.name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return null;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // get set 方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public String getName() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void setName(String name) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.name = name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public int getIndex() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void setIndex(int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.index = index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 四、覆盖枚举的方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例如覆盖toString()</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum Color {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 成员变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private String name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private int index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 构造方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private Color(String name, int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.name = name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.index = index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          //覆盖方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          @Override</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public String toString() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return this.index+"_"+this.name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 五、实现接口------所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public interface Behaviour {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          void print();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          String getInfo();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum Color implements Behaviour{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 成员变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private String name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private int index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 构造方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private Color(String name, int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.name = name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.index = index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //接口方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          @Override</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public String getInfo() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return this.name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          //接口方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          @Override</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void print() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    System.out.println(this.index+":"+this.name);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 六、使用接口组织枚举</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public interface Food {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          enum Coffee implements Food{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          enum Dessert implements Food{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    FRUIT, CAKE, GELATO</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 七、枚举集合</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举和普通类的区别与联系;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、枚举与类都可以实现多接口;访问控制符都可以使用(4p),但枚举中默认的是private,类中默认的是package;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、枚举直接继承java.lang.Enum类,普通类是继承java.lang.Object;其中java.long.Enum类实现了java.long.Serializable和java.long.Comparable两个接口。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3、使用enum定义、非抽象的枚举默认修饰符为public final,因此枚举不能派生子类。<br style="background-color:inherit"> 4、枚举的构造器只能使用private访问控制符,如果省略了枚举的访问修饰符其默认为private修饰;因为枚举的字段不能初始化,对象类型的必须调用构造方法,所有有多少个成员构造方法就会运行多少次;<br style="background-color:inherit"> 5、枚举的所有实例必须在枚举的第一行显示列出,否则这个枚举永远都不能生产实例,列出这些实例时系统会自动添加public static final修饰,无需程序员显式添加</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6、所有的枚举类都提供了一个values方法,该方法可以很方便的遍历所有的枚举值</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7、关键字:枚举是enum,类是class</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8、枚举是类类型,类是引用类型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> instanceof关键字:<br style="background-color:inherit"> public class FX {<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> boolean b = ("1" instanceof String);//判断某个对象是不是某个类的实例    Result = Object instanceof Class/interface<br style="background-color:inherit"> //Result:布尔类型。<br style="background-color:inherit">    //Object:必选项。任意对象表达式。<br style="background-color:inherit"> //Class:必选项。任意已定义的对象类。<br style="background-color:inherit"> System.out.println(b);<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 注解---JDK1.5的新特性<br style="background-color:inherit"> 使用位置:类上、方法上、语句上</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 八、协变与泛型<br style="background-color:inherit"> 协变-------可以用在数组、重写,不可以用在枚举中</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 可变参数:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> int… a-------------代表一个没有长度限制的数组----------JDK1.5之后有的</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 输入的必须是数组</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。注意:可变参数必须位于最后一项。只支持有一个可变参数。因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 可变参数的特点:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> (1)、只能出现在参数列表的最后;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> (2)、... 位于变量类型和变量名之间,前后有无空格都可以;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> (3)、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Varable {<br style="background-color:inherit">      public static void main(String [] args){<br style="background-color:inherit">          System.out.println(add(2,3));<br style="background-color:inherit">          System.out.println(add(2,3,5));<br style="background-color:inherit">      }<br style="background-color:inherit">      public static int add(int x,int ...args){<br style="background-color:inherit">          int sum=x;<br style="background-color:inherit">          for(int i=0;i<args.length;i++){<br style="background-color:inherit">              sum+=args[i];<br style="background-color:inherit">          }<br style="background-color:inherit">          return sum;<br style="background-color:inherit">      }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  协变的作用范围</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、数组:如果 A 是 B 的超类,则 A[] 也是 B[] 的超类,所有需要 A[] 的地方都可以用 B[] 代替,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Test2 {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public static void main(String[] args){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         Integer[] ints=new Integer[1];</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         ints[0]=99;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         show(ints);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     static void show(Number[] ns){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         System.out.println(Arrays.toString(ns));</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、重写</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Test2 {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public static void main(String[] args){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         P p=new C();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         System.out.println(p.get());</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class P{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public Number get(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         return new Integer(0);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class C extends P{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public Integer get(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         return new Integer(1);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3、泛型不能协变:如果 A 是 B 的超类,则 List<A> 和 List<B> 无关,需要 List<A> 的地方不可以用 List<B> 代替,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Test2 {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public static void main(String[] args) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         List<Integer> ints = new ArrayList<Integer>();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         //incompatible type--类型不兼容</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         show(ints);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     static void show(List<Number> ns) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         System.out.println(ns);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 泛型(Generic)的本质是类型参数化</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> -------------是JDK1.5提供的新技术,它的本质是类型参数化,类似C++中的模板,它根据应用主要分为泛型方法,泛型接口,泛型类,协变不适用于泛型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 泛型-------------泛型类class Demo<T>{},泛型接口interface Inter<T>{},泛型方法public<T> T show(T a) {}</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例1:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class  GenericDemo{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public static void main(String[] args) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               C c1 = new C(new A("aaa"));</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               C c2 = new C(new B(3.4));//包装成double---自动装箱</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               Object obj = c1.getObj();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               A obj = (A)(c1.getObj());//强制转换</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               System.out.println(obj);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class A{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        private String x;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public A(String x){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               this.x=x;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public String getX(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return x;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class B{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        private Double d;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public B(Double d){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               this.d=d ;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public Double getD(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return d;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class C{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        private Object obj;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public C(Object obj){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               this.obj=obj ;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public Object  getObj(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return obj;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 泛型的使用:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一、泛型类:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Demo1 {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public static void main(String[] args) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               Generic<String> c = new Generic<String>("asad");</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               System.out.println(c.getA());</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               //Generic<int> c1 = new Generic<int>(12);必须要是包装类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class Generic<T>{//泛型类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        private T a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public Generic(T a){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               this.a = a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public T getA(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 二、泛型方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public static <T> T getX(T t){//泛型方法----------<  >--表声明</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return t;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">      </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public static <T,K> T getX(K t){//泛型方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return t;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 三、泛型接口</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class GenericDemo3{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public static void main(String[] args) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> D<int[][]> d = new D<int[][]>();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> d.show(new int[][]{{1,4},{2,3}});</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> interface IA<T>{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> void show(T t);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class D<T> implements IA<T>{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public void show(T t){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> System.out.println(t.getClass().getName());</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 有界类型:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 上界:extends 默认上界为Object</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Class G <T extends Number,K extends Object,H super Integer>{}</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 下界:super----------只有通配符有下限</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> super关键字声明了类型的下界,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 规则和限制</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3、泛型的类型参数可以有多个。<T,K></p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4、泛型的参数类型可以使用extends关键字,例如<T extends superclass>。习惯上称为“有界类型”。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String")</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6、如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7、通配符泛型不但可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一个普通static方法,无法访问泛型类的类型参数,所以,若普通static方法需要使用泛型参数,必须使其成为泛型方法。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> java 泛型详解</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 普通泛型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Point<T>{       // 此处可以随便写标识符号 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ; // var的类型由T指定,即:由外部指定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public T getVar(){  // 返回值的类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          return var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public void setVar(T var){  // 设置的类型也由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.  } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10. public class GenericsDemo06{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     public static void main(String[] args){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.         Point<String> p = new Point<String>() ; // 里面的var类型为String类型  --------指定数据类型—必须是引用数据类型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.         p.setVar("it") ;        // 设置字符串 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.         System.out.println(p.getVar().length()) ;   // 取得字符串的长度 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16. }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17. //2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18. ---------------------------------------------------------- </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19. class Notepad<K,V>{       // 此处指定了两个泛型类型-----再类上进行声明泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.     private K key ;     // 此变量的类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     private V value ;   // 此变量的类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.     public K getKey(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23.         return this.key ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 24.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 25.     public V getValue(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 26.         return this.value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 27.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 28.     public void setKey(K key){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 29.         this.key = key ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 30.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 31.     public void setValue(V value){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 32.         this.value = value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 33.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 34. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 35. public class GenericsDemo09{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 36.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 37.         Notepad<String,Integer> t = null ;        // 定义两个泛型类型的对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 38.         t = new Notepad<String,Integer>() ;       // 里面的key为String,value为Integer </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 39.         t.setKey("汤姆") ;        // 设置第一个内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 40.         t.setValue(20) ;            // 设置第二个内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 41.         System.out.print("姓名;" + t.getKey()) ;      // 取得信息 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 42.         System.out.print(",年龄;" + t.getValue()) ;       // 取得信息 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 43.       } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 44. }  //汤姆</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 45.       20</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  通配符</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 定义泛型变量 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){   // 直接打印 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo14{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<String> i = new Info<String>() ;       // 使用String为泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         i.setVar("it") ;                            // 设置内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.         fun(i) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.     public static void fun(Info<?> temp){     // 可以接收任意的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.         System.out.println("内容:" + temp) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22. }//  内容:it</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  受限泛型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 定义泛型变量 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){   // 直接打印 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo17{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<Integer> i1 = new Info<Integer>() ;   // 声明Integer的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         Info<Float> i2 = new Info<Float>() ;         // 声明Float的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.         i1.setVar(30) ;                              // 设置整数,自动装箱 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.         i2.setVar(30.1f) ;                           // 设置小数,自动装箱 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.         fun(i1) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.         fun(i2) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.     public static void fun(Info<? extends Number> temp){ // 只能接收Number及其Number的子类 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23.         System.out.print(temp + "、") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 24.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 25. }//  30、30.1、</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 26. ---------------------------------------------------------- </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 27. class Info<T>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 28.     private T var ;     // 定义泛型变量 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 29.     public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 30.         this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 31.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 32.     public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 33.         return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 34.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 35.     public String toString(){   // 直接打印 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 36.         return this.var.toString() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 37.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 38. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 39. public class GenericsDemo21{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 40.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 41.         Info<String> i1 = new Info<String>() ;      // 声明String的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 42.         Info<Object> i2 = new Info<Object>() ;      // 声明Object的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 43.         i1.setVar("hello") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 44.         i2.setVar(new Object()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 45.         fun(i1) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 46.         fun(i2) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 47.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 48.     public static void fun(Info<? super String> temp){   // 只能接收String或Object类型的泛型  ----上限为String</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 49.         System.out.print(temp + "、") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 50.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 51. }//  hello、java.lang.Object@1ffc686、</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型无法向上转型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 定义泛型变量 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){   // 直接打印 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo23{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<String> i1 = new Info<String>() ;      // 泛型类型为String </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         Info<Object> i2 = null ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.         i2 = i1 ;                           //这句会出错 incompatible types </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19. }//  编译失败</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型接口</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  interface Info<T>{        // 在接口上定义泛型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.  } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.  class InfoImpl<T> implements Info<T>{   // 定义泛型接口的子类 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      private T var ;             // 定义属性 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public InfoImpl(T var){     // 通过构造方法设置属性内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          this.setVar(var) ;   </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.     public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.         return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16. public class GenericsDemo24{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.     public static void main(String arsg[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.         Info<String> i = null;        // 声明接口对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.         i = new InfoImpl<String>("汤姆") ;  // 通过子类实例化对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.         System.out.println("内容:" + i.getVar()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22. }//  内容:汤姆</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Demo{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      public <T> T fun(T t){            // 可以接收任意类型的数据 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.          return t ;                  // 直接把参数返回 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.  } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.  public class GenericsDemo26{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.      public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.          Demo d = new Demo() ;   // 实例化Demo对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.          String str = d.fun("汤姆") ; //   传递字符串 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         int i = d.fun(30) ;     // 传递数字,自动装箱 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.         System.out.println(str) ;   // 输出内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.         System.out.println(i) ;     // 输出内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14. }//  汤姆  30</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  通过泛型方法返回泛型类型实例</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T extends Number>{ // 指定上限,只能是数字类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 此类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          return this.var ;    </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){       // 覆写Object类中的toString()方法 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ;     </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo27{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<Integer> i = fun(30) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         System.out.println(i.getVar()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.     public static <T extends Number> Info<T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.         Info<T> temp = new Info<T>() ;      // 根据传入的数据类型实例化Info </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.         temp.setVar(param) ;     // 将传递的内容设置到Info对象的var属性之中 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.         return temp ;   // 返回实例化对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23. }//  30</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  使用泛型统一传入的参数类型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T>{    // 指定上限,只能是数字类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 此类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          return this.var ;    </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){       // 覆写Object类中的toString()方法 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ;     </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo28{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<String> i1 = new Info<String>() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         Info<String> i2 = new Info<String>() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.         i1.setVar("HELLO") ;        // 设置内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.         i2.setVar("汤姆") ;       // 设置内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.         add(i1,i2) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     public static <T> void add(Info<T> i1,Info<T> i2){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.         System.out.println(i1.getVar() + " " + i2.getVar()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 24. }// HELLO 汤姆</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型数组</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  public class GenericsDemo30{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.          Integer i[] = fun1(1,2,3,4,5,6) ;   // 返回泛型数组 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          fun2(i) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public static <T> T[] fun1(T...arg){  // 接收可变参数 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          return arg ;            // 返回泛型数组 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public static <T> void fun2(T param[]){   // 输出 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         System.out.print("接收泛型数组:") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.         for(T t:param){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.             System.out.print(t + "、") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.         } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15. }//  接收泛型数组:1、2、3、4、5、6、</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型的嵌套设置</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T,V>{      // 接收两个泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      private V value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.      public Info(T var,V value){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.          this.setVar(var) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.          this.setValue(value) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     public void setValue(V value){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.         this.value = value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.     public V getValue(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.         return this.value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21. class Demo<S>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.     private S info ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23.     public Demo(S info){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 24.         this.setInfo(info) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 25.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 26.     public void setInfo(S info){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 27.         this.info = info ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 28.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 29.     public S getInfo(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 30.         return this.info ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 31.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 32. }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 33. public class GenericsDemo31{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 34.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 35.         Demo<Info<String,Integer>> d = null ;  // 将Info作为Demo的泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 36.         Info<String,Integer> i = null ;   // Info指定两个泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 37.         i = new Info<String,Integer>("汤姆",30) ;    // 实例化Info对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 38.         d = new Demo<Info<String,Integer>>(i);//在Demo类中设置Info类的对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 39.         System.out.println("内容一:" + d.getInfo().getVar()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 40.         System.out.println("内容二:" + d.getInfo().getValue()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 41.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 42. } // 内容一:汤姆 内容二:30</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   泛型方法不一定要通过参数来确定泛型准确类型,可以只通过返回值,比如:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  public static <E> ArrayList<E> newArrayList() {<br style="background-color:inherit">          return new ArrayList<E>();<br style="background-color:inherit">  }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  public List<PrepaidHistory> queryHistories(Long skyid,PrepaidHistoryType type, Date from, Date end) { </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          return Lists.newArrayList();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  这样Lists.newArrayList();<br style="background-color:inherit"> 智能的知道返回类型为PrepaidHistory</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一、内部类(局部内部类、成员内部类、匿名内部类)</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、定义:内部类就是在类的内部定义一个类,它的分类有成员内部类、局部内部类、匿名内部类,<br style="background-color:inherit"> 它可以定义在类中方法外,也可以定义在类中方法内,内部类的好处是可以访问外部类的私有成员,但外部类无法访问内部类的私有成员<br style="background-color:inherit"> 通过使用内部类可以确保程序的结构清晰和代码精炼</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 编译后的内部类名称:InnerTest$A.class</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、分类:成员内部类(静态成员内部类)、局部内部类、匿名内部类<br style="background-color:inherit"> a、成员内部类(非静态内部类):与外部类的属性和方法并列,成员内部类可以看作是外部类的实例变量<br style="background-color:inherit"> 在内部类中访问实例变量:this.字段;<br style="background-color:inherit"> 在内部类中访问外部类的实例变量:外部类名.this.字段<br style="background-color:inherit"> 成员内部类中不能有静态字段或方法(final修饰的常量除外),因为Static在加载时就创建,此时内部类可能还没被实例化<br style="background-color:inherit"> 在外部类的外部实例化对象:<br style="background-color:inherit"> Foo foo = new Foo();<br style="background-color:inherit"> Koo koo = foo.new Koo();<br style="background-color:inherit"> Foo.Koo koo = new Foo().new Koo();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> b、静态内部类<br style="background-color:inherit"> 静态内部类可以直接访问外部类的静态成员,不能访问外部类的实例成员,但可以通过外部类的实例(new 对象)来访问<br style="background-color:inherit"> 静态内部类里面可以定义静态成员(其他内部类不可以)<br style="background-color:inherit"> 静态内部类不可以使用private修饰<br style="background-color:inherit"> 静态内部类的对象可以直接生成<br style="background-color:inherit"> Foo.Koo koo = new Foo().new Koo();<br style="background-color:inherit"> c、局部内部类<br style="background-color:inherit"> 在方法中定义的内部类称为局部内部类,类似局部变量,不可以加修饰符public、protected、private,其范围为定义它的代码块<br style="background-color:inherit"> 可以访问外部类的所有成员,还可以访问所在方法中的final修饰的参数和变量,但不能访问方法体中的局部变量<br style="background-color:inherit"> d、匿名内部类<br style="background-color:inherit"> 匿名内部类没有类名,它必须继承一个类或者实现一个接口,并且不能显示的extends或implements关键字<br style="background-color:inherit"> 匿名内部类不能有构造方法,因为它没有类名。可以通过new<父类名>的方法创建实例对象,匿名类的创建与定义同时进行<br style="background-color:inherit"> 匿名内部类只能一次性的创建其对象<br style="background-color:inherit"> 匿名内部类既可以在方法体中,也可以在参数列表中<br style="background-color:inherit"> 注意:匿名内部类一定是在new的后面隐含实现一个接口或继承一个类,匿名内部类不是抽象类<br style="background-color:inherit">       匿名内部类必须实现他的父类抽象接口或接口里的所有的抽象方法<br style="background-color:inherit"> new 父类的构造器(实参列表)|实现接口(){<br style="background-color:inherit"> //类体<br style="background-color:inherit"> }<br style="background-color:inherit"> new Object(){<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3、内部类的访问规则:内部类可以直接访问外部类中的成员,包括私有<br style="background-color:inherit">                     最近的外部类要访问内部类必须建立内部类对象new Inner().fumction()来访问内部类中的成员<br style="background-color:inherit">                如: Outer.Inner in = new Outer().new Inner();<br style="background-color:inherit">                     in.function();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4、使用:当描述事物时,事物的内部还有事物,该事物用内部类来描述,因为内部事物在使用外部事物的内容。<br style="background-color:inherit"> 内部类定义在局部时,不能使用成员修饰符、static修饰,使用时需要new—<br style="background-color:inherit"> 可以直接访问外部类中的成员,但不可访问它所在的局部中的变量,只能访问被final修饰的局部变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5、代码分析:例1:----分类<br style="background-color:inherit"> public class Demo2 {<br style="background-color:inherit"> class B{//成员内部类------Demo2$B.class<br style="background-color:inherit"> }<br style="background-color:inherit"> static class A{//静态成员内部类------Demo2$A.class<br style="background-color:inherit"> }<br style="background-color:inherit"> void show(){<br style="background-color:inherit"> class C{//局部内部类-------Demo2$1C.class<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> class C{//局部内部类----Demo2$2C.class<br style="background-color:inherit"> }<br style="background-color:inherit"> System.out.println();<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例2:-----匿名内部类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、  匿名内部类其实就是内部类的简写格式<br style="background-color:inherit"> 2、  定义前题必须继承一个类或实现一个接口<br style="background-color:inherit"> 3、  匿名内部类的格式: new 父类或接口(){定义子类的内容}<br style="background-color:inherit"> 4、  匿名内部类定义的方法最好不要超过三个</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Test{<br style="background-color:inherit">        public static void main(String[] agrs){<br style="background-color:inherit">               Test t=new Test();   //new了 一个Test对象<br style="background-color:inherit">               t.te(new A(){                //调用实例方法并且声明一个匿名内部类类作为一个参数传入<br style="background-color:inherit">                             public void as(){<br style="background-color:inherit">                                    System.out.println("我是实现了接口A的匿名类");<br style="background-color:inherit">                             }<br style="background-color:inherit">                      }<br style="background-color:inherit">               );<br style="background-color:inherit">       }         <br style="background-color:inherit">       void te(A a){    //实例方法<br style="background-color:inherit">               a.as();<br style="background-color:inherit">       }<br style="background-color:inherit"> }<br style="background-color:inherit"> interface A{    //声明了一个接口类<br style="background-color:inherit">        void as();    //抽象方法<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例3:<br style="background-color:inherit"> class A{<br style="background-color:inherit">        void as(){<br style="background-color:inherit">               System.out.println("我是内部类A");<br style="background-color:inherit">        }<br style="background-color:inherit"> }<br style="background-color:inherit"> class B{<br style="background-color:inherit">        void bs(){<br style="background-color:inherit">               System.out.println("我是内部类B");<br style="background-color:inherit">        }<br style="background-color:inherit"> }<br style="background-color:inherit"> public class MultipleExtends {<br style="background-color:inherit">        private class C extends A{}<br style="background-color:inherit">        private class D extends B{}<br style="background-color:inherit">        public static void main(String[] args) {<br style="background-color:inherit">               MultipleExtends m=new MultipleExtends(); //声明一个外部类的对象<br style="background-color:inherit">               MultipleExtends.C c=m.new C(); //让外部类对象持有一个<br style="background-color:inherit">               MultipleExtends.D d=m.new D();//内部类对象的引用<br style="background-color:inherit">               c.as();                                                                                                                          <br style="background-color:inherit">               d.bs();                                                                                                                          <br style="background-color:inherit">        }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 例4:-----内部类是可以被私有的<br style="background-color:inherit"> public class MemberClass {<br style="background-color:inherit">    private int i=10;  //定义一个私有字段<br style="background-color:inherit">     private static int j=20;      <br style="background-color:inherit">     public static void main(String[] args) {<br style="background-color:inherit"> MemberClass mc=new MemberClass();//new 一个外部类的对象<br style="background-color:inherit"> A a=mc.new A();//A a=new MemberClass().new A();//new 一个内部类的对象<br style="background-color:inherit"> a.as();//调用内部类的实例方法<br style="background-color:inherit">     }<br style="background-color:inherit"> private class A{<br style="background-color:inherit"> //static int j=6;<br style="background-color:inherit"> //int i=5;              //定义一个内部类的实例字段    <br style="background-color:inherit"> void as(){     //定义一个内部类的实例方法<br style="background-color:inherit"> System.out.println("这里是内部类A");   <br style="background-color:inherit"> System.out.println("调用外部类私有实例字段i:"+i);<br style="background-color:inherit"> System.out.print("调用外部类私有静态字段j:"+j);<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //---------- java ----------<br style="background-color:inherit"> //这里是内部类A<br style="background-color:inherit"> //调用外部类私有实例字段i:10<br style="background-color:inherit"> //调用外部类私有静态字段j:20</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 例5:----静态内部类<br style="background-color:inherit"> public class StaticClass {         <br style="background-color:inherit">        private static int i=10; //定义一个私有静态字段<br style="background-color:inherit">        //private int j=7;<br style="background-color:inherit">        public static void main(String[] args) {<br style="background-color:inherit">               StaticClass sc=new StaticClass();//new 一个外部类的对象<br style="background-color:inherit">               A a=new StaticClass.A(); //new 一个静态内部类<br style="background-color:inherit">               a.as();            //调用静态内部类的实例方法<br style="background-color:inherit">               A.at        //调用静态内部类的静态方法<br style="background-color:inherit">        }<br style="background-color:inherit">        static class A{       <br style="background-color:inherit">               int i=5;<br style="background-color:inherit">               static at(){   //定义静态内部类的静态方法<br style="background-color:inherit">                      System.out.println("这里是静态内部类的静态方法");<br style="background-color:inherit">               }<br style="background-color:inherit">               void as(){                 //定义静态内部类的实例方法<br style="background-color:inherit">                      System.out.println("这里是内部类A");<br style="background-color:inherit">                      System.out.print("调用外部类私有静态字段i:"+i);<br style="background-color:inherit">               }<br style="background-color:inherit">        }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  <br style="background-color:inherit"> 例6:------局部内部类<br style="background-color:inherit"> public class InteriorClass {<br style="background-color:inherit">          private int i=5;<br style="background-color:inherit">          public static void main(String[] args) {<br style="background-color:inherit">                    InteriorClass ic=new InteriorClass();   //new 一个对象<br style="background-color:inherit">                    ic.as();             //调用实例方法<br style="background-color:inherit">                    //      B b=ic.new B();<br style="background-color:inherit">          }<br style="background-color:inherit">          void as(){<br style="background-color:inherit">                    final int y=5;        //常量       <br style="background-color:inherit">                    int u=1;            //局部变量<br style="background-color:inherit">                    class B{<br style="background-color:inherit">                             void bs(){<br style="background-color:inherit">                                      System.out.println("这里是内部类B");        <br style="background-color:inherit">                                      System.out.println("调用i"+i);<br style="background-color:inherit">                                      System.out.println("常量"+y);<br style="background-color:inherit">                             }                          <br style="background-color:inherit">                    }<br style="background-color:inherit">                    new B().bs();<br style="background-color:inherit">          }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 二、异常(try\catch\fainlly\throw\throws)<br style="background-color:inherit"> i、 异常的含义和分类<br style="background-color:inherit">   a)含义:异常是对问题的描述,将问题进行问题的封装<br style="background-color:inherit">   b)分类:java.lang.Object-----Throwable(java中所有错误和异常的超类)-----Error(无法通过代码来处理的错误)        <br style="background-color:inherit">                                             |---------------Exception(可处理的异常,并能恢复运行)<br style="background-color:inherit">      |---RuntimeException(运行时异常)---可以不捕获也可以不处理<br style="background-color:inherit">      |----CheckedException(已检查时异常)----必须捕获或处理不然编译失败---IOException\SQLException<br style="background-color:inherit">  标签(Marker)接口:既无字段又无方法---Cloneable/Serializable/EventListener</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  Error----如:JVM硬件错误----OutOfMemoryError—内存不足、不断的创建实例、StackOverflowError---递归导致的堆异常<br style="background-color:inherit">  <br style="background-color:inherit">  2、异常分类(Throwable)<br style="background-color:inherit">   1、编译时被检测的异常<br style="background-color:inherit">      throws 需要处理<br style="background-color:inherit">   2、编译时不被检测的异常---运行时异常(RuntimeException或其子类)<br style="background-color:inherit">     函数内throw,函数外不需要声明,--------无法处理,需要修改代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ii、 异常处理<br style="background-color:inherit"> a)RuntimeEception及其子类异常,不需要程序员处理,其后语句不编译<br style="background-color:inherit"> b)非运行时异常必须处理<br style="background-color:inherit"> c)Exeception中有一个特殊的子类异常RuntimeException,如果在方法内抛出该异常,方法上可以不用声明,编译可以通过;如果在方法上声明了该异常,调用者可以不用处理,编译可以通过。之所以不在函数声明,是因为不希望让使用者处理,当异常发生时,希望程序停止,程序员修正程序代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 异常的捕获和处理</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 第一种格式:<br style="background-color:inherit"> try{<br style="background-color:inherit">          //可能抛出异常的语句<br style="background-color:inherit"> }catch(异常类型 e){<br style="background-color:inherit">          //处理语句1<br style="background-color:inherit"> } catch(异常类型 e){<br style="background-color:inherit">          //处理语句2<br style="background-color:inherit"> }finally{<br style="background-color:inherit">          //一定执行的语句<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> finally只要用于异常处理,修饰异常块,无论异常是否处理都会执行<br style="background-color:inherit"> finally在return、throw前输出,不管return是在try还是catch中<br style="background-color:inherit"> finally定义一定执行的代码,通常用于关闭资源------如:数据库关闭连接</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> finally块在以下情况将不会被执行:<br style="background-color:inherit"> (1)finally块中发生了异常;<br style="background-color:inherit"> (2)程序所在线程死亡;<br style="background-color:inherit"> (3)在前面的代码中用了System.exit(0);<br style="background-color:inherit"> (4)关闭CPU。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 第二种格式:<br style="background-color:inherit"> try{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }finally{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 第三种格式:<br style="background-color:inherit"> try{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }catch(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  <br style="background-color:inherit"> iii.在多个catch时只执行一个,自上而下遇到的第一个异常所对应的catch,如果没有对应的catch,则先执<br style="background-color:inherit"> 行finally后在抛出,没有finally则直接抛出,定义多个catch可精确地定位异常。如果为子类的异常定<br style="background-color:inherit"> 义了特殊的catch块,而父类的异常则放在另外一个catch块中,此时,必须满足以下规则:子类异常的处<br style="background-color:inherit"> 理块必须在父类异常处理块的前面,否则会发生编译错误。所以,越特殊的异常越在前面处理,越普遍的<br style="background-color:inherit"> 异常越在后面处理。这类似于制订防火墙的规则次序:较特殊的规则在前,较普通的规则在后。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> throws--------声明方法抛出异常<br style="background-color:inherit"> 1、说明:当不知道在当前代码中如何处理的时候,可以选择用throws将异常交给上层调用者处理<br style="background-color:inherit"> 2、基本格式:<br style="background-color:inherit"> 类型 方法名(形参列表)throws 异常列表(逗号隔开){<br style="background-color:inherit">           //代码<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例:<br style="background-color:inherit"> //手工抛出异常实例<br style="background-color:inherit"> public class JavaThrow1{<br style="background-color:inherit">          public static void main(String[] args){<br style="background-color:inherit">                    System.out.print(" Now");<br style="background-color:inherit">                    try{<br style="background-color:inherit">                             System.out.print(" is");<br style="background-color:inherit">                             throw new NullPointerException();//直接抛出异常转到catch进行处理<br style="background-color:inherit">                             //System.out.println("This will not excute!");//有throw这句执行不到<br style="background-color:inherit">                    }catch (NullPointerException e){<br style="background-color:inherit">                             System.out.print(" the");<br style="background-color:inherit">                    }<br style="background-color:inherit">                    System.out.print(" time.\n");<br style="background-color:inherit">          }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //自动抛异常<br style="background-color:inherit"> public class ExTest {<br style="background-color:inherit"> public static void main(String[] args){<br style="background-color:inherit"> String s=null;<br style="background-color:inherit"> try{<br style="background-color:inherit"> System.out.println("0");<br style="background-color:inherit"> int i=s.length();//自动抛异常--空指针异常<br style="background-color:inherit"> System.out.println("2");<br style="background-color:inherit"> }finally{<br style="background-color:inherit"> System.out.println("1");<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例:--------throws<br style="background-color:inherit"> public class ExceptionTest4{<br style="background-color:inherit"> public static void p() throws ArithmeticException{<br style="background-color:inherit"> //间接抛出异常,自己并未处理,让方法的调用者来处理<br style="background-color:inherit"> int i;<br style="background-color:inherit"> i=4/0;//可能发生异常<br style="background-color:inherit"> System.out.println("8");<br style="background-color:inherit"> }<br style="background-color:inherit">   public static void main(String[] args){    <br style="background-color:inherit"> try{ <br style="background-color:inherit"> try{<br style="background-color:inherit">                 p();//方法的直接调用调用者捕获异常处理<br style="background-color:inherit"> }catch(ArithmeticException e){<br style="background-color:inherit"> System.out.println("Divider is zero !");<br style="background-color:inherit"> }<br style="background-color:inherit"> }catch(RuntimeException  e){<br style="background-color:inherit">               System.out.println("4");<br style="background-color:inherit"> }<br style="background-color:inherit">   }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> v.java异常处理机制</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 答:程序出现想数组角标越界,空指针等错误时,JAVA就会用异常Throwable<br style="background-color:inherit"> 来描述这些错误,Throwable继承了Object类,同时实现了Serializable接口,<br style="background-color:inherit"> 根据出现的问题是否可以通过程序来解决。把Throwable分为Error错误和Exception异常,Exception根据编译时是否会被检<br style="background-color:inherit"> 测分为运行时异常RuntimeException和已检测异常CheckedException。异常的处理方<br style="background-color:inherit"> 式有两种,在发生异常的地方直接使用catch处理,或者将异常抛出给调用者,让调用者来处理。<br style="background-color:inherit"> <br style="background-color:inherit">  1、检查性异常------程序正确,但因为外在的环境条件不满足引发。例如:用<br style="background-color:inherit"> 户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序<br style="background-color:inherit"> 本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,<br style="background-color:inherit"> 程序开发者必须考虑并处理这个问题。JAVA编译器强制要求处理这类异常,如果不<br style="background-color:inherit"> 捕获这类异常,程序将不能被编译。<br style="background-color:inherit">   2、运行期异常------这意味着程序存在bug,如数组越界,0被除,入参不满足规<br style="background-color:inherit"> 范.....这类异常需要更改程序来避免,JAVA编译器强制要求处理这类异常。<br style="background-color:inherit">   3、错误------一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般<br style="background-color:inherit"> 更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 三、 自定义异常<br style="background-color:inherit"> 当jdk内置异常类型不能满足系统需求时,我们需要自定义异常,如:<br style="background-color:inherit"> public class MyExceptionTest {<br style="background-color:inherit">          public static void main(String[] args) {<br style="background-color:inherit">                   MyExceptionTest mt = new MyExceptionTest();<br style="background-color:inherit">                   mt.manager();<br style="background-color:inherit">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void registe(int num) throws MyException{<br style="background-color:inherit">                   if(num<0){<br style="background-color:inherit">                            throw new MyException("人数为负数",3);<br style="background-color:inherit">                   }<br style="background-color:inherit">                   System.out.println(" 登记人数为:"+num);<br style="background-color:inherit">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void manager(){<br style="background-color:inherit">                   try{<br style="background-color:inherit">                            registe(-100);<br style="background-color:inherit">                   }catch (MyException e){<br style="background-color:inherit">                            System.out.println("登记类型出错:"+e.getId());<br style="background-color:inherit">                            e.printStackTrace();<br style="background-color:inherit">                   }       <br style="background-color:inherit">                   System.out.println(" 操作结束!");<br style="background-color:inherit">          }<br style="background-color:inherit"> }<br style="background-color:inherit"> class MyException extends Exception{<br style="background-color:inherit">          private int id;<br style="background-color:inherit">          public MyException(){}<br style="background-color:inherit">          public MyException(String message,int id){<br style="background-color:inherit">                   super(message);//调用父类的getMessage()<br style="background-color:inherit">                   //父类中已经定义了getMessage()可以直接使用-----------该方法为Exception继承Throwable的<br style="background-color:inherit">                   this.id=id;<br style="background-color:inherit">          }<br style="background-color:inherit">          public int getId(){<br style="background-color:inherit">                   return id;<br style="background-color:inherit">          }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 自定义异常类必须要继承Exception/RuntimeException,如果该异常的发生无法再继续进行运算,就让它继承RuntimeException <br style="background-color:inherit"> 继承的原因是为了让该类自定义类具备可抛型,让该类具备操作异常的共性方法<br style="background-color:inherit"> 自定义异常:按照JAVA的OO思想,将程序中出现的特有问题进行封装</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 四、常见异常<br style="background-color:inherit"> IOException--------------------输入输出异常<br style="background-color:inherit"> ClassNotFoundException-------找不到类异常<br style="background-color:inherit"> NumberFormatException---------字符串到数字格式的异常<br style="background-color:inherit"> FileNotfoundException-----------文件找不到异常<br style="background-color:inherit"> NoSuchMethodException---------------请求方法异常</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 运行时异常:RuntimeException<br style="background-color:inherit"> SecurityException-----------试图违反安全性异常<br style="background-color:inherit"> NullPointerException----没有实例化却调用其属性和方法--------------空指针异常<br style="background-color:inherit"> ArrayIndexOfBoundsException---------数组越界异常<br style="background-color:inherit"> StringIndexOfBoundsException---------字符串越界异常<br style="background-color:inherit"> ArithmeticException--------------算数异常/除数为零异常<br style="background-color:inherit"> NullPointerException-------试图查找null异常</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> Main方法通常情况下不能把异常抛给JVM</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Super a = new subclass();//向上转型----<br style="background-color:inherit"> ---overload看左边,override看右边<br style="background-color:inherit"> -----------------------------------多态针对的是方法<br style="background-color:inherit">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 异常的好处:1、将问题进行封装<br style="background-color:inherit">             2、将正常流程代码和问题代码进行分离,方便阅读</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 处理原则:<br style="background-color:inherit"> 1、处理方式有:try或者throws<br style="background-color:inherit"> 2、调用到抛出异常的功能时,抛出几个处理几个(一个try对应多个catch)<br style="background-color:inherit"> 3、多个catch,父类的catch放到最后<br style="background-color:inherit"> 4、Catch内,需要定义针对性的处理方式,不要简单的定义printStackTrace输出语句,也不要不写<br style="background-color:inherit"> 5、当铺获到的异常,本功能处理不了时,可以继续在catch中抛出</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6、  例:<br style="background-color:inherit"> try{<br style="background-color:inherit"> throw new AException();<br style="background-color:inherit"> }catch(AException e){<br style="background-color:inherit"> throw e;<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7、如果异常在内部被处理(catch),外部则不需要抛出</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 基本格式:catch用来处理异常,如果该异常为检测时异常时,必须要处理或者抛出<br style="background-color:inherit"> 异常继承时,子类只能抛出父类的异常或者该异常的子类/子集异常,也可以不抛出异常</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 异常的注意事项<br style="background-color:inherit"> 1、在子父类覆盖时,<br style="background-color:inherit"> a)子类抛出的异常必须是父类异常的子类或子集<br style="background-color:inherit"> b)如果父类或接口没有异常抛出时,子类覆盖出现异常,只能try不能抛<br style="background-color:inherit"> c)如果父类中是RuntimeException时,子类可以不用抛出异常,反之,子类为RuntimeException异常,父类为其异常的子类或自己都可以编译通过</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、throw 与throws<br style="background-color:inherit"> throw 后跟异常对象(只能有一个),throws后跟异常类(多个时用逗号隔开);<br style="background-color:inherit"> 位置:throw用在方法体中,代表手工抛异常,throws用在方法声明上,代表该方法可能发生异常</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、RuntimeException和CheckedException的区别<br style="background-color:inherit"> 前者可以不在方法上声明也可以不处理,后者必须要处理或者抛出</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit">                                                                                                                                                                                                                                                                                                                                                                                                                      <br style="background-color:inherit"> 三、集合(collection、set、list、map)</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一、定义:<br style="background-color:inherit"> 集合是Java里面最常用的,也是最重要的一部分。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。<br style="background-color:inherit"> 容器:用来存储数据,不同的容器集合以不同的格式保存对象,它能够自动的改变这个容器的所能存放的数据数量的大小。这一点上,如果使用数组来存储的话,就显得十分的笨拙。<br style="background-color:inherit"> 对于对象集合,必须执行的操作主要以下三种:<br style="background-color:inherit"> ?       添加新的对象<br style="background-color:inherit"> ?       删除对象<br style="background-color:inherit"> ?       查找对象<br style="background-color:inherit"> Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:<br style="background-color:inherit"> 1)  Collection 。 一组对立的元素,通常这些元素都服从某种规则。List必须保持元素特定的顺序,而Set 不能有重复元素。<br style="background-color:inherit"> 2)  Map 。 一组 成对的“键值对”对象。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ? Collection – 对象之间没有指定的顺序,允许重复元素。<br style="background-color:inherit"> ? Set –  对象之间没有指定的顺序,不允许重复元素<br style="background-color:inherit"> ? List–  对象之间有指定的顺序,允许重复元素,并引入位置下标。 <br style="background-color:inherit"> ? Map –  接口用于保存关键字(Key)和数值(Value)的集合,集合中的每个对象加入时都提供数值和关键字。Map 接口既不继承 Set 也不继承 Collection。 <br style="background-color:inherit"> List、Set、Map共同的实现基础是Object数组</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> Collection<br style="background-color:inherit"> 1.2.1常用方法<br style="background-color:inherit"> Collection 接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。Collection 在前面的大图也可以看出,它是List和Set 的父类。并且它本身也是一个接口。它定义了作为集合所应该拥有的一些方法。如下:<br style="background-color:inherit"> 注意:<br style="background-color:inherit"> 集合必须只有对象,集合中的元素不能是基本数据类型。<br style="background-color:inherit"> Collection接口支持如添加和除去等基本操作。设法除去一个元素时,如果这个元素存在,除去的仅仅是集合中此元素的一个实例。<br style="background-color:inherit"> ?     boolean add(Object element) <br style="background-color:inherit"> ?     boolean remove(Object element) <br style="background-color:inherit"> Collection 接口还支持查询操作:<br style="background-color:inherit"> ?     int size() <br style="background-color:inherit"> ?     boolean isEmpty() <br style="background-color:inherit"> ?     boolean contains(Object element) <br style="background-color:inherit"> ?     Iterator iterator() <br style="background-color:inherit"> 组操作 :Collection 接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于整个集合的任务。<br style="background-color:inherit"> ?     boolean containsAll(Collection collection) <br style="background-color:inherit"> ?     boolean addAll(Collection collection) <br style="background-color:inherit"> ?     void clear() <br style="background-color:inherit"> ?     void removeAll(Collection collection) <br style="background-color:inherit"> ?     void retainAll(Collection collection) <br style="background-color:inherit"> containsAll() 方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集合是否是当前集合的子集。其余方法是可选的,因为特定的集合可能不支持集合更改。 addAll() 方法确保另一个集合中的所有元素都被添加到当前的集合中,通常称为并。 clear() 方法从当前集合中除去所有元素。 removeAll() 方法类似于 clear() ,但只除去了元素的一个子集。 retainAll() 方法类似于 removeAll() 方法,不过可能感到它所做的与前面正好相反:它从当前集合中除去不属于另一个集合的元素,即交。<br style="background-color:inherit">  <br style="background-color:inherit"> 集合类的基本方法的使用:<br style="background-color:inherit"> import java.util.*;<br style="background-color:inherit"> public class CollectionToArray {<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> Collection collection1=new ArrayList();//创建一个集合对象<br style="background-color:inherit"> collection1.add("000");//添加对象到Collection集合中<br style="background-color:inherit"> collection1.add("111");<br style="background-color:inherit"> collection1.add("222");<br style="background-color:inherit"> System.out.println("集合collection1的大小:"+collection1.size());<br style="background-color:inherit"> System.out.println("集合collection1的内容:"+collection1);<br style="background-color:inherit"> collection1.remove("000");//从集合collection1中移除掉 "000" 这个对象<br style="background-color:inherit"> System.out.println("集合collection1移除 000 后的内容:"+collection1);<br style="background-color:inherit"> System.out.println("集合collection1中是否包含000 :"+collection1.contains("000"));<br style="background-color:inherit"> System.out.println("集合collection1中是否包含111 :"+collection1.contains("111"));<br style="background-color:inherit"> Collection collection2=new ArrayList();<br style="background-color:inherit"> collection2.addAll(collection1);//将collection1 集合中的元素全部都加到collection2中<br style="background-color:inherit"> System.out.println("集合collection2的内容:"+collection2);<br style="background-color:inherit"> collection2.clear();//清空集合 collection1 中的元素<br style="background-color:inherit"> System.out.println("集合collection2是否为空 :"+collection2.isEmpty());<br style="background-color:inherit"> //将集合collection1转化为数组<br style="background-color:inherit"> Object s[]= collection1.toArray();<br style="background-color:inherit"> for(int i=0;i<s.length;i++){<br style="background-color:inherit"> System.out.println(s[i]);<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> 运行结果为:<br style="background-color:inherit"> 集合collection1的大小:3<br style="background-color:inherit"> 集合collection1的内容:[000, 111, 222]<br style="background-color:inherit"> 集合collection1移除 000 后的内容:[111, 222]<br style="background-color:inherit"> 集合collection1中是否包含000 :false<br style="background-color:inherit"> 集合collection1中是否包含111 :true<br style="background-color:inherit"> 集合collection2的内容:[111, 222]<br style="background-color:inherit"> 集合collection2是否为空 :true<br style="background-color:inherit"> 111<br style="background-color:inherit"> 222<br style="background-color:inherit"> 这里需要注意的是,Collection 它仅仅只是一个接口,而真正使用的时候,却是创建该接口的一个实现类。作为集合的接口,它定义了所有属于集合的类所都应该具有的一些方法。<br style="background-color:inherit"> 而ArrayList (列表)类是集合类的一种实现方式。<br style="background-color:inherit">  <br style="background-color:inherit"> Collection的实现基础是数组,所以有转换为Object数组的方法: <br style="background-color:inherit"> ?     Object[] toArray() <br style="background-color:inherit"> ?     Object[] toArray(Object[] a)<br style="background-color:inherit"> 其中第二个方法Object[] toArray(Object[] a) 的参数 a 应该是集合中所有存放的对象的类的父类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.2.2  迭代器(Iterator)<br style="background-color:inherit"> 迭代器(Iterator)本身就是一个对象,它的工作就是遍历并选择集合序列中的对象,而客户端的程序员不必知道或关心该序列底层的结构。此外,迭代器通常被称为“轻量级”对象,创建它的代价小。但是,它也有一些限制,例如,某些迭代器只能单向移动。<br style="background-color:inherit"> Collection 接口的 iterator() 方法返回一个 Iterator。Iterator 和Enumeration 接口类似。使用 Iterator 接口方法,可以从头至尾遍历集合,并安全的从底层 Collection 中除去元素。<br style="background-color:inherit"> 迭代器的使用:<br style="background-color:inherit"> import java.util.ArrayList;<br style="background-color:inherit"> import java.util.Collection;<br style="background-color:inherit"> import java.util.Iterator;<br style="background-color:inherit">  <br style="background-color:inherit"> public class IteratorDemo {<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> Collection collection = new ArrayList();<br style="background-color:inherit"> collection.add("s1");<br style="background-color:inherit"> collection.add("s2");<br style="background-color:inherit"> collection.add("s3");<br style="background-color:inherit"> Iterator iterator = collection.iterator();//得到一个迭代器<br style="background-color:inherit"> while (iterator.hasNext()) {//遍历<br style="background-color:inherit"> Object element = iterator.next();<br style="background-color:inherit"> System.out.println("iterator = " + element);<br style="background-color:inherit"> }<br style="background-color:inherit"> if(collection.isEmpty())<br style="background-color:inherit"> System.out.println("collection is Empty!");<br style="background-color:inherit"> else<br style="background-color:inherit"> System.out.println("collection is not Empty! size="+collection.size());<br style="background-color:inherit"> Iterator iterator2 = collection.iterator();<br style="background-color:inherit"> while (iterator2.hasNext()) {//移除元素<br style="background-color:inherit"> Object element = iterator2.next();<br style="background-color:inherit"> System.out.println("remove: "+element);<br style="background-color:inherit"> iterator2.remove();<br style="background-color:inherit"> }<br style="background-color:inherit"> Iterator iterator3 = collection.iterator();<br style="background-color:inherit"> if (!iterator3.hasNext()) {//察看是否还有元素<br style="background-color:inherit"> System.out.println("还有元素");<br style="background-color:inherit"> }<br style="background-color:inherit"> if(collection.isEmpty())<br style="background-color:inherit"> System.out.println("collection is Empty!");<br style="background-color:inherit"> //使用collection.isEmpty()方法来判断<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> 程序的运行结果为:<br style="background-color:inherit"> iterator = s1<br style="background-color:inherit"> iterator = s2<br style="background-color:inherit"> iterator = s3<br style="background-color:inherit"> collection is not Empty! size=3<br style="background-color:inherit"> remove: s1<br style="background-color:inherit"> remove: s2<br style="background-color:inherit"> remove: s3<br style="background-color:inherit"> 还有元素<br style="background-color:inherit"> collection is Empty!<br style="background-color:inherit"> 可以看到,Java的Collection的Iterator 能够用来,:<br style="background-color:inherit"> 1)使用方法 iterator() 要求容器返回一个Iterator .第一次调用Iterator 的next() 方法时,它返回集合序列的第一个元素。<br style="background-color:inherit"> 2)使用next() 获得集合序列的中的下一个元素。<br style="background-color:inherit"> 3)使用hasNext()检查序列中是否元素。<br style="background-color:inherit"> 4)使用remove()将迭代器新返回的元素删除。<br style="background-color:inherit"> 需要注意的是:方法删除由next方法返回的最后一个元素,在每次调用next时,remove方法只能被调用一次 。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.3 List<br style="background-color:inherit"> 1.3.1概述<br style="background-color:inherit"> Collection接口实际上并没有直接的实现类。而List是容器的一种,表示列表的意思。当我们不知道存储的数据有多少的情况,<br style="background-color:inherit"> 我们就可以使用List 来完成存储数据的工作。例如保存一个应用系统当前的在线用户的信息。List的最大的特点就是能够自动<br style="background-color:inherit"> 的根据插入的数据量来动态改变容器的大小。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.3.2  常用方法<br style="background-color:inherit"> List 就是列表的意思,它是Collection 的一种,即继承了 Collection 接口,又定义一个允许重复项的有序集合。该接口不但<br style="background-color:inherit"> 能够对列表的一部分进行处理,还添加了面向位置的操作。List 是按对象的进入顺序进行保存对象,而不做排序或编辑操作。它<br style="background-color:inherit"> 除了拥有Collection接口的所有的方法外还拥有一些其他的方法。面向位置的操作包括插入某个元素或 Collection 的功能,还<br style="background-color:inherit"> 包括获取、除去或更改元素的功能。在 List 中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、 void add(int index, Object element):添加对象element到位置index上<br style="background-color:inherit"> 2、 boolean addAll(int index, Collection collection):在index位置后添加容器collection中所有的元素<br style="background-color:inherit"> 3、 Object get(int index) :取出下标为index的位置的元素<br style="background-color:inherit"> 4、 int indexOf(Object element) :查找对象element 在List中第一次出现的位置<br style="background-color:inherit"> 5、 int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置<br style="background-color:inherit"> 6、 Object remove(int index) :删除index位置上的元素<br style="background-color:inherit"> 7、 Object set(int index, Object element) :将index位置上的对象替换为element 并返回老的元素。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> List(提供基于索引的对成员的随机访问)------ArrayList-----提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好<br style="background-color:inherit">   成员可为任意Object子类的对象<br style="background-color:inherit"> ----------LinkedList-----对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差<br style="background-color:inherit">   成员可为任意Object子类的对象 <br style="background-color:inherit">          <br style="background-color:inherit"> 在“集合框架”中有两种常规的 List 实现:ArrayList 和 LinkedList。使用两种 List 实现的哪一种取决于您特定的需要。如果要<br style="background-color:inherit"> 支持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList 提供了可选的集合。但如果,您要频繁的从列表的中间<br style="background-color:inherit"> 位置添加和除去元素,而只要顺序的访问列表元素,那么,LinkedList 实现更好。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> LinkedList 来实现一个简单的队列的例子:<br style="background-color:inherit"> import java.util.*;<br style="background-color:inherit">  <br style="background-color:inherit"> public class ListExample {<br style="background-color:inherit">   public static void main(String args[]) {<br style="background-color:inherit">     LinkedList queue = new LinkedList();<br style="background-color:inherit">     queue.addFirst("Bernadine");<br style="background-color:inherit">     queue.addFirst("Elizabeth");<br style="background-color:inherit">     queue.addFirst("Gene");<br style="background-color:inherit">     queue.addFirst("Elizabeth");<br style="background-color:inherit">     queue.addFirst("Clara");<br style="background-color:inherit">     System.out.println(queue);<br style="background-color:inherit">     queue.removeLast();<br style="background-color:inherit">     queue.removeLast();<br style="background-color:inherit">     System.out.println(queue);<br style="background-color:inherit">   }<br style="background-color:inherit"> }<br style="background-color:inherit"> 运行程序产生了以下输出。请注意,与 Set 不同的是 List 允许重复。<br style="background-color:inherit"> [Clara, Elizabeth, Gene, Elizabeth, Bernadine]<br style="background-color:inherit"> [Clara, Elizabeth, Gene]<br style="background-color:inherit"> 该的程序演示了具体 List 类的使用。第一部分,创建一个由 ArrayList 支持的 List。填充完列表以后,特定条目就得到了。示例<br style="background-color:inherit"> 的 LinkedList 部分把 LinkedList 当作一个队列,从队列头部添加东西,从尾部除去。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> List 接口不但以位置友好的方式遍历整个列表,还能处理集合的子集:<br style="background-color:inherit"> ListIterator listIterator() :返回一个ListIterator 跌代器,默认开始位置为0<br style="background-color:inherit"> ListIterator listIterator(int startIndex) :返回一个ListIterator 跌代器,开始位置为startIndex <br style="background-color:inherit"> List subList(int fromIndex, int toIndex) :返回一个子列表List ,元素存放为从 fromIndex 到toIndex之前的一个元素。<br style="background-color:inherit"> 处理 subList() 时,位于 fromIndex 的元素在子列表中,而位于 toIndex 的元素则不是,提醒这一点很重要。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> for-loop :<br style="background-color:inherit"> for (int i=fromIndex; i<toIndex; i++) {<br style="background-color:inherit">   // process element at position i<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 对子列表的更改(如 add()、remove() 和 set() 调用)对底层 List 也有影响。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 我们看一个List的例子:<br style="background-color:inherit"> import java.util.*;<br style="background-color:inherit">  <br style="background-color:inherit"> public class ListIteratorTest {<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> List list = new ArrayList();<br style="background-color:inherit"> list.add("aaa");<br style="background-color:inherit"> list.add("bbb");<br style="background-color:inherit"> list.add("ccc");<br style="background-color:inherit"> list.add("ddd");<br style="background-color:inherit"> System.out.println("下标0开始:"+list.listIterator(0).next());//next()<br style="background-color:inherit"> System.out.println("下标1开始:"+list.listIterator(1).next());<br style="background-color:inherit"> System.out.println("子List 1-3:"+list.subList(1,3));//子列表<br style="background-color:inherit"> ListIterator it = list.listIterator();//默认从下标0开始<br style="background-color:inherit"> //隐式光标属性add操作 ,插入到当前的下标的前面<br style="background-color:inherit"> it.add("sss");<br style="background-color:inherit"> while(it.hasNext()){<br style="background-color:inherit"> System.out.println("next Index="+it.nextIndex()+",Object="+it.next());<br style="background-color:inherit"> }<br style="background-color:inherit"> //set属性<br style="background-color:inherit"> ListIterator it1 = list.listIterator();<br style="background-color:inherit"> it1.next();<br style="background-color:inherit"> it1.set("ooo");<br style="background-color:inherit"> ListIterator it2 = list.listIterator(list.size());//下标<br style="background-color:inherit"> while(it2.hasPrevious()){<br style="background-color:inherit"> System.out.println("previous Index="+it2.previousIndex()+",Object="+it2.previous());<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> 程序的执行结果为:<br style="background-color:inherit"> 下标0开始:aaa<br style="background-color:inherit"> 下标1开始:bbb<br style="background-color:inherit"> 子List 1-3:[bbb, ccc]<br style="background-color:inherit"> next Index=1,Object=aaa<br style="background-color:inherit"> next Index=2,Object=bbb<br style="background-color:inherit"> next Index=3,Object=ccc<br style="background-color:inherit"> next Index=4,Object=ddd<br style="background-color:inherit"> previous Index=4,Object=ddd<br style="background-color:inherit"> previous Index=3,Object=ccc<br style="background-color:inherit"> previous Index=2,Object=bbb<br style="background-color:inherit"> previous Index=1,Object=aaa<br style="background-color:inherit"> previous Index=0,Object=ooo<br style="background-color:inherit"> 我们还需要稍微再解释一下 add() 操作。添加一个元素会导致新元素立刻被添加到隐式光标的前面。因此,添加元素后调用 <br style="background-color:inherit"> previous() 会返回新元素,而调用 next() 则不起作用,返回添加操作之前的下一个元素。下标的显示方式,如下图所示:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.3.3实现原理<br style="background-color:inherit"> ArrayList中主要包含2个属性:<br style="background-color:inherit"> private transient Object elementData[];<br style="background-color:inherit"> private int size;<br style="background-color:inherit"> 其中数组::elementData[] 是列表的实现核心属性:数组。 我们使用该数组来进行存放集合中的数据。而我们的初始化参数就<br style="background-color:inherit"> 是该数组构建时候的长度,即该数组的length属性就是initialCapacity 参数。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Keys:transient 表示被修饰的属性不是对象持久状态的一部分,不会自动的序列化。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 如果要判断一个类的一个实例对象是否等于另外一个对象,那么我们就需要自己覆写Object类的public boolean equals(Object obj)<br style="background-color:inherit">  方法。如果不覆写该方法的话,那么就会调用Object的equals()方法来进行判断。这就相当于比较两个对象的内存应用地址是否相等了。<br style="background-color:inherit"> 在集合框架中,不仅仅是List,所有的集合类,如果需要判断里面是否存放了的某个对象,都是调用该对象的equals()方法来进行处理的。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 集合的个数用size();数组用length;String用length();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Collection<E> extends Iterable</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 方法:<br style="background-color:inherit"> 增          add();addAll()---------boolean<br style="background-color:inherit"> 删          remove();removeAll();------------boolean<br style="background-color:inherit">                  clear()-------void<br style="background-color:inherit"> 查          Iterator<E>()--------Iterator<br style="background-color:inherit"> 改          toArray()-----Object   数组<br style="background-color:inherit"> 元素数      size()--------------int</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> List<E>  extends Collection<E>----------有序的Collection,可重复</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 新增方法:<br style="background-color:inherit"> add(int index, E element)//在指定位置添加---------添加顺序要是连续的<br style="background-color:inherit"> get(int index)//返回指定位置<br style="background-color:inherit"> listIterator(int index)//从指定位置开始迭代</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> AbstractList<E> extends AbstractCollection<E> implements List<E></p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Set<E><br style="background-color:inherit"> 无序的不可重复的Collection</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Map<K,V><br style="background-color:inherit"> 键K不可以重复,值V可以重复</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ArrayList------------在查询时快,增删改时慢</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例:<br style="background-color:inherit"> import java.util.*;<br style="background-color:inherit"> //注解<br style="background-color:inherit"> //@SuperessWarnings("unchecked")---------</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Demo{<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> List<Object> alist = new ArrayList<Object>();//List是接口,不能被实例化</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //增加<br style="background-color:inherit"> alist.add("123");<br style="background-color:inherit"> alist.add(new StringBuffer("1s1"));<br style="background-color:inherit"> alist.add(3.4f);<br style="background-color:inherit"> alist.add(3.01d);<br style="background-color:inherit"> alist.add(1,222);//[123, 222, 323]</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> alist.add("123");//[123, 222, 323, 123]----------可重复<br style="background-color:inherit"> System.out.println(alist);//相当于toString()<br style="background-color:inherit"> System.out.println("长度为:"+alist.size());<br style="background-color:inherit"> System.out.println("------------------------------");<br style="background-color:inherit"> //删除<br style="background-color:inherit"> alist.remove(2);//角标<br style="background-color:inherit"> System.out.println(alist);<br style="background-color:inherit"> //alist.clear();<br style="background-color:inherit"> alist.remove("123");//移除的是第一次出现的<br style="background-color:inherit"> System.out.println(alist);<br style="background-color:inherit"> System.out.println(alist.isEmpty());<br style="background-color:inherit"> System.out.println("------------------------------");<br style="background-color:inherit"> //遍历<br style="background-color:inherit"> //第一种:<br style="background-color:inherit"> for(int i=0;i<alist.size();i++){<br style="background-color:inherit"> Object e = alist.get(i);<br style="background-color:inherit"> if(e instanceof String){//Object inteanceof 类型----判断类型是否是Object的实例<br style="background-color:inherit"> System.out.println(((String)e).length());<br style="background-color:inherit"> }else if(e instanceof Double){<br style="background-color:inherit"> System.out.println(((Double)e).intValue());<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //第二种:<br style="background-color:inherit"> for(Object e:alist){<br style="background-color:inherit"> System.out.println(e);<br style="background-color:inherit"> }<br style="background-color:inherit"> System.out.println("------------------------------");<br style="background-color:inherit"> //List<Integer> alist1 = new ArrayList<Integer>();<br style="background-color:inherit"> int size = alist.size();<br style="background-color:inherit"> System.out.println(" size="+size);<br style="background-color:inherit"> boolean flag = alist.isEmpty();//判断是否为空<br style="background-color:inherit"> System.out.println(" flag="+flag);<br style="background-color:inherit"> System.out.println("------------------------------");<br style="background-color:inherit"> //第三种:Iterable-----迭代器输出<br style="background-color:inherit"> //Iterable Iterator<T>iterator();<br style="background-color:inherit"> Iterator<Object> it = alist.iterator();//Iterator与Iterable无关,是两个接口<br style="background-color:inherit"> while(it.hasNext()){<br style="background-color:inherit"> Object i = it.next();<br style="background-color:inherit"> System.out.println(i);<br style="background-color:inherit"> }<br style="background-color:inherit"> //System.out.println(alist.iterator());<br style="background-color:inherit"> System.out.println("--------------------------------");<br style="background-color:inherit"> //第一种:<br style="background-color:inherit"> for(int i=0;i<alist.size();i++){//注意:size()是动态变化的<br style="background-color:inherit"> System.out.print(alist.get(i)+",");//按照下标获取<br style="background-color:inherit"> }<br style="background-color:inherit"> System.out.println(" ");<br style="background-color:inherit"> System.out.println("--------------------------------");<br style="background-color:inherit"> //第四种:<br style="background-color:inherit"> for(Iterator it2 = alist.iterator();it2.hasNext();){<br style="background-color:inherit"> System.out.println(it2.next());<br style="background-color:inherit"> }<br style="background-color:inherit"> //转换<br style="background-color:inherit"> //alist.toArray();<br style="background-color:inherit"> //System.out.println(alist);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> LinkedList-----------增删改快,查询慢<br style="background-color:inherit"> 例:<br style="background-color:inherit"> import java.util.*;<br style="background-color:inherit"> public class  Demo1{<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> Queue<Integer> link = new LinkedList<Integer>();<br style="background-color:inherit"> //Queue是单端队列----------单链表<br style="background-color:inherit"> link.add(21);<br style="background-color:inherit"> link.offer(111);//队尾添加========>add<br style="background-color:inherit"> link.poll();//队头删除<br style="background-color:inherit"> System.out.println(link.remove());<br style="background-color:inherit"> link.poll();//为空时返回null==========>remove<br style="background-color:inherit"> System.out.println(link.poll());<br style="background-color:inherit"> link.peek();//访问=========>get<br style="background-color:inherit"> //link.remove();为空时异常<br style="background-color:inherit"> System.out.println(link.size());<br style="background-color:inherit"> System.out.println("-------------------------------------");</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Deque<Object> dl = new LinkedList<Object>();<br style="background-color:inherit"> //Deque是双端队列--------双向链表<br style="background-color:inherit"> -------------------------------------------------------------------------------<br style="background-color:inherit"> 第一个元素(头部)             最后一个元素(尾部)</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                抛出异常     特殊值          抛出异常       特殊值</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 插入 addFirst(e)   offerFirst(e)   addLast(e)     offerLast(e) <br style="background-color:inherit"> 移除 removeFirst() pollFirst()     removeLast()   pollLast() <br style="background-color:inherit"> 检查 getFirst()    peekFirst()     getLast()      peekLast() <br style="background-color:inherit"> -------------------------------------------------------------------------------<br style="background-color:inherit"> //add、offer默认在尾部增加 <br style="background-color:inherit"> //remove、poll默认从第一个开始删除</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> dl.add(123);//默认在尾部增加<br style="background-color:inherit"> dl.addFirst("sss");<br style="background-color:inherit"> dl.offerFirst(231);<br style="background-color:inherit"> dl.addLast(2212);<br style="background-color:inherit"> dl.offerLast(654);<br style="background-color:inherit"> System.out.println(dl);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> System.out.println("-------------------1---------------");<br style="background-color:inherit"> //dl.removeFirst();<br style="background-color:inherit"> //System.out.println(dl);<br style="background-color:inherit"> //System.out.println("------------------2----------------");<br style="background-color:inherit"> dl.pollLast();<br style="background-color:inherit"> System.out.println(dl);<br style="background-color:inherit"> System.out.println("-----------------3-----------------");</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         System.out.println(dl.getFirst());</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> System.out.println("-----------------4-----------------");<br style="background-color:inherit"> dl.peek();<br style="background-color:inherit"> System.out.println(dl);<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 注意:所有的集合框架都位于java.util包中,使用前必须导入该包中的类<br style="background-color:inherit"> 熟悉并记忆以下接口之间的关系和相关方法<br style="background-color:inherit"> Iterable--------->接口(java.lang)<br style="background-color:inherit">         常见方法1:Iterator<T> iterator()<br style="background-color:inherit">  Iterator--------->接口<br style="background-color:inherit">         常见方法1:boolean hasNext()<br style="background-color:inherit">         常见方法2:E   next()<br style="background-color:inherit">  Collection------->Iterable-------------->接口 <br style="background-color:inherit">          常见方法1:int size()<br style="background-color:inherit">          常见方法2:boolean isEmpty()<br style="background-color:inherit">  常见方法3:void clear()<br style="background-color:inherit">          常见方法4:boolean  add(E e)<br style="background-color:inherit">  常见方法5:remove()<br style="background-color:inherit">  List(线性表)----->Collection------->Iterable-------------->接口<br style="background-color:inherit">          常见方法1:add(int index,E e)<br style="background-color:inherit">  常见方法2:remove(int index,E e)<br style="background-color:inherit">    常见方法3:E get(int index)<br style="background-color:inherit">  Queue(队列)----->Collection------->Iterable-------------->接口<br style="background-color:inherit">          常见方法1:offer(E e)  <br style="background-color:inherit">  常见方法2:poll()<br style="background-color:inherit">    常见方法3:E peek()<br style="background-color:inherit">  Deque(双端队列)----->Queue----->Collection------->Iterable-------------->接口<br style="background-color:inherit">          常见方法1:offerFirst(E e)和offerLast(E e)<br style="background-color:inherit">  常见方法2:pollFirst()和pollLast<br style="background-color:inherit">    常见方法3:E peekFirst()和peekLast<br style="background-color:inherit"> ArrayList-->AbstractList-->List--->Collection--->Iterator--------->类<br style="background-color:inherit"> LinkedList--->AbstractList-->List--->Collection--->Iterator--------->类<br style="background-color:inherit">                     --->Deque---->Queue-----><br style="background-color:inherit"> Vector--->AbstractList-->List--->Collection--->Iterator--------->类<br style="background-color:inherit"> Stack-->Vector--->AbstractList-->List--->Collection--->Iterator--------->类<br style="background-color:inherit">          常见方法1:E pop()<br style="background-color:inherit">  常见方法2:E push(E e)<br style="background-color:inherit">  常见方法3:E peek()<br style="background-color:inherit">    常见方法4:boolean empty()<br style="background-color:inherit"> stack-----------后进先出---一端</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 无序的不可重复的(判断重复的标准是hashCode()+equals()),如果重复定义则会覆盖<br style="background-color:inherit"> LinkedSet---------------重复时保留第一个<br style="background-color:inherit"> TreeSet-------------(String)按照ASCll码进行排序</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 加载因子:加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希<br style="background-color:inherit"> 表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。<br style="background-color:inherit"> 通常,默认加载因子 (.75) 在时间和空间成本上寻 求一种折衷。加载因子过高虽然减少<br style="background-color:inherit"> 了空间开销,但同时也增加了查询成本(在大多数 Hashtable类的操作中,包括 get 和 <br style="background-color:inherit"> put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加<br style="background-color:inherit"> 载因子,以便最大限度地降低 rehash 操作次数。如果初始容量大于最大条目数除以加载<br style="background-color:inherit"> 因子,则不会发生 rehash 操作</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> List默认容量10,HashSet默认容量16,加载因子0.75;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量是哈希表中桶的数量,<br style="background-color:inherit"> 初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到<br style="background-color:inherit"> 多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希<br style="background-color:inherit"> 表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 在比较时可以自定义一个比较方式,此类必须要继承Comparable<T>接口,并实现compareTo( T t){ ----重写toString()输出<br style="background-color:inherit">    <br style="background-color:inherit">  return -1|0|1;      //  <|=|><br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> import java.util.*;<br style="background-color:inherit"> public class HashSetTest{<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> /*Set<String> set1 = new LinkedHashSet<String>();<br style="background-color:inherit"> set1.add("sds");<br style="background-color:inherit"> set1.add("2sa");<br style="background-color:inherit"> set1.add("213");<br style="background-color:inherit"> set1.add("213");<br style="background-color:inherit"> System.out.println(set1);//无序<br style="background-color:inherit"> System.out.println("--------------------------------------");<br style="background-color:inherit"> Set<String> set2 = new HashSet<String>();<br style="background-color:inherit"> set2.add("sds");<br style="background-color:inherit"> set2.add("213");<br style="background-color:inherit"> set2.add("2sa");<br style="background-color:inherit"> set2.add("213");<br style="background-color:inherit"> System.out.println(set2);//按插入顺序输出<br style="background-color:inherit"> System.out.println("--------------------------------------");</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Set<String> set3 = new TreeSet<String>();<br style="background-color:inherit"> set3.add("sds");<br style="background-color:inherit"> set3.add("213");<br style="background-color:inherit"> set3.add("2sa");<br style="background-color:inherit"> set3.add("213");<br style="background-color:inherit"> System.out.println(set3); //排序<br style="background-color:inherit"> System.out.println("--------------------------------------");<br style="background-color:inherit"> */<br style="background-color:inherit"> Set<Cat> set=new TreeSet<Cat>();<br style="background-color:inherit"> Cat c1=new Cat(2,"red");<br style="background-color:inherit"> Cat c2=new Cat(1,"black");<br style="background-color:inherit"> Cat c3=new Cat(3,"white");<br style="background-color:inherit"> set.add(c1);<br style="background-color:inherit"> set.add(c2);<br style="background-color:inherit"> set.add(c3);<br style="background-color:inherit"> System.out.println(set.toString());<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class Cat implements Comparable<Cat>{<br style="background-color:inherit"> private int age;<br style="background-color:inherit"> private String color;<br style="background-color:inherit"> public Cat(int age,String color){<br style="background-color:inherit"> this.age=age;<br style="background-color:inherit"> this.color=color;<br style="background-color:inherit"> }<br style="background-color:inherit"> public String toString(){<br style="background-color:inherit"> return "{age="+age+" , color="+color+"}";<br style="background-color:inherit"> }<br style="background-color:inherit">     public int compareTo(Cat o){<br style="background-color:inherit">   if(this.age>o.age){<br style="background-color:inherit">             return 1;<br style="background-color:inherit">   }else{<br style="background-color:inherit">     return -1;<br style="background-color:inherit">   }<br style="background-color:inherit">    }<br style="background-color:inherit"> }<br style="background-color:inherit"> //---------- java ----------<br style="background-color:inherit"> //[{age=1 , color=black}, {age=2 , color=red}, {age=3 , color=white}]</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> LinkedHashSet--->HashSet----->AbstractSet----->Set--->Collection------>Iterable<br style="background-color:inherit">                                 TreeSet------>AbstractSet----->Set--->Collection------>Iterable<br style="background-color:inherit">                                 TreeSet------>SortedSet------>Set---->Collection------>Iterable</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Map</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型擦除----------类型擦除<br style="background-color:inherit">      类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字<br style="background-color:inherit"> 节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再<br style="background-color:inherit"> 必要的时候添加类型检查和类型转换的方法。<br style="background-color:inherit">      类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java<br style="background-color:inherit"> 代码直接转换成普通java字节码。<br style="background-color:inherit">      <br style="background-color:inherit">    类型擦除的主要过程如下:<br style="background-color:inherit">      1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。<br style="background-color:inherit">      2.移除所有的类型参数,如:<br style="background-color:inherit"> interface Comparable <A> { <br style="background-color:inherit">   public int compareTo( A that); <br style="background-color:inherit"> } <br style="background-color:inherit"> final class NumericValue implements Comparable <NumericValue> { <br style="background-color:inherit">   priva te byte value;  <br style="background-color:inherit">   public  NumericValue (byte value) { this.value = value; }  <br style="background-color:inherit">   public  byte getValue() { return value; }  <br style="background-color:inherit">   public  int compareTo( NumericValue t hat) { return this.value - that.value; } <br style="background-color:inherit"> } <br style="background-color:inherit"> -----------------<br style="background-color:inherit"> class Collections {  <br style="background-color:inherit">   public static <A extends Comparable<A>>A max(Collection <A> xs) { <br style="background-color:inherit">     Iterator <A> xi = xs.iterator(); <br style="background-color:inherit">     A w = xi.next(); <br style="background-color:inherit">     while (xi.hasNext()) { <br style="background-color:inherit">       A x = xi.next(); <br style="background-color:inherit">       if (w.compareTo(x) < 0) w = x; <br style="background-color:inherit">     } <br style="background-color:inherit">     return w; <br style="background-color:inherit">   } <br style="background-color:inherit"> } <br style="background-color:inherit"> final class Test { <br style="background-color:inherit">   public static void main (String[ ] args) { <br style="background-color:inherit">     LinkedList <NumericValue> numberList = new LinkedList <NumericValue> (); <br style="background-color:inherit">     numberList .add(new NumericValue((byte)0));  <br style="background-color:inherit">     numberList .add(new NumericValue((byte)1));  <br style="background-color:inherit">     NumericValue y = Collections.max( numberList );  <br style="background-color:inherit">   } <br style="background-color:inherit"> }<br style="background-color:inherit"> 经过类型擦除后的类型为<br style="background-color:inherit">  interface Comparable { <br style="background-color:inherit">   public int compareTo( Object that); <br style="background-color:inherit"> } <br style="background-color:inherit"> final class NumericValue implements Comparable { <br style="background-color:inherit">   priva te byte value;  <br style="background-color:inherit">   public  NumericValue (byte value) { this.value = value; }  <br style="background-color:inherit">   public  byte getValue() { return value; }  <br style="background-color:inherit">   public  int compareTo( NumericValue t hat)   { return this.value - that.value; } <br style="background-color:inherit">   public  int compareTo(Object that) { return this.compareTo((NumericValue)that);  } <br style="background-color:inherit"> } <br style="background-color:inherit"> -------------<br style="background-color:inherit"> class Collections {  <br style="background-color:inherit">   public static Comparable max(Collection xs) { <br style="background-color:inherit">     Iterator xi = xs.iterator(); <br style="background-color:inherit">     Comparable w = (Comparable) xi.next(); <br style="background-color:inherit">     while (xi.hasNext()) { <br style="background-color:inherit">       Comparable x = (Comparable) xi.next(); <br style="background-color:inherit">       if (w.compareTo(x) < 0) w = x; <br style="background-color:inherit">     } <br style="background-color:inherit">     return w; <br style="background-color:inherit">   } <br style="background-color:inherit"> } <br style="background-color:inherit"> final class Test { <br style="background-color:inherit">   public static void main (String[ ] args) { <br style="background-color:inherit">     LinkedList numberList = new LinkedList(); <br style="background-color:inherit">     numberList .add(new NumericValue((byte)0));  ,<br style="background-color:inherit">     numberList .add(new NumericValue((byte)1));  <br style="background-color:inherit">     NumericValue y = (NumericValue) Collections.max( numberList );  <br style="background-color:inherit">   } <br style="background-color:inherit"> }<br style="background-color:inherit"> 第一个泛型类Comparable <A>擦除后 A被替换为最左边界Object。Comparable<NumericValue>的类<br style="background-color:inherit"> 型参数NumericValue被擦除掉,但是这直 接导致NumericValue没有实现接口Comparable的compareTo(Object that)<br style="background-color:inherit"> 方法,于是编译器充当好人,添加了一个桥接方法。<br style="background-color:inherit"> 第二个示例中限定了类型参数的边界<A extends Comparable<A>>A,A必须为Comparable<A>的子类<br style="background-color:inherit"> ,按照类型擦除的过程,先讲所有的类型参数 ti换为最左边界Comparable<A>,然后去掉参数类型A,<br style="background-color:inherit"> 得到最终的擦除后结果。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Collection 和 Collections的区别。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Collection是个java.util下的接口,它是各种集合结构的父接口。继承与他的接口主要有Set 和List.<br style="background-color:inherit"> Collections是个java.util下的专用静态类,它包含有各种有关集合操作的静态方法。提供一系列静态<br style="background-color:inherit"> 方法实现对各种集合的搜索、排序、线程安全化等操作。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Array与Arrays的区别。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.数组类Array,是Java中最基本的一个存储结构。提供了动态创建和访问 Java 数组的方法。其中的<br style="background-color:inherit"> 元素的类型必须相同。效率高,但容量固定且无法动态改变。 它无法判断其中实际存有多少元素,<br style="background-color:inherit"> length只是告诉我们array的容量。<br style="background-color:inherit"> 2、Arrays类,此静态类专门用来操作array ,提供搜索、排序、复制等静态方法。equals():比较两个<br style="background-color:inherit"> array是否相等。array拥有相同元素个数,且所有对应元素两两相等。 sort():用来对array进行排序。<br style="background-color:inherit">  binarySearch():在排好序的array中寻找元素。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> collections<br style="background-color:inherit"> 例:<br style="background-color:inherit"> import java.util.*;<br style="background-color:inherit"> public class CollectionsDemo {<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> List<String> sl = new ArrayList<String>();<br style="background-color:inherit"> sl.add("jhn");<br style="background-color:inherit"> sl.add("ncgcxs");<br style="background-color:inherit"> sl.add("rgd");<br style="background-color:inherit"> sl.add("ceaz");<br style="background-color:inherit"> sl.add("vfe");<br style="background-color:inherit"> sl.add("byt");<br style="background-color:inherit"> sl.add("fe");<br style="background-color:inherit"> Collections.sort(sl);<br style="background-color:inherit"> System.out.println(sl);<br style="background-color:inherit"> //Collections.binarySearch(1);<br style="background-color:inherit"> //Collections.copy(sl);<br style="background-color:inherit"> System.out.println(Collections.max(sl));//max<br style="background-color:inherit"> System.out.println(Collections.min(sl));//min<br style="background-color:inherit"> Collections.reverse(sl);//反转<br style="background-color:inherit"> System.out.println(sl);<br style="background-color:inherit"> Collections.shuffle(sl);//打散<br style="background-color:inherit"> System.out.println(sl);<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> HashMap遍历的两种方式</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 第一种: <br style="background-color:inherit"> Map map = new HashMap(); <br style="background-color:inherit"> Iterator iter = map.entrySet().iterator(); <br style="background-color:inherit"> while (iter.hasNext()) { <br style="background-color:inherit">     Map.Entry entry = (Map.Entry) iter.next(); <br style="background-color:inherit">     Object key = entry.getKey(); <br style="background-color:inherit">     Object val = entry.getValue(); <br style="background-color:inherit"> } <br style="background-color:inherit"> 效率高,以后一定要使用此种方式! <br style="background-color:inherit"> 第二种: <br style="background-color:inherit"> Map map = new HashMap(); <br style="background-color:inherit"> Iterator iter = map.keySet().iterator(); <br style="background-color:inherit"> while (iter.hasNext()) { <br style="background-color:inherit">     Object key = iter.next(); <br style="background-color:inherit">     Object val = map.get(key); <br style="background-color:inherit"> } <br style="background-color:inherit"> 效率低,以后尽量少使用!</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> HashMap 与 TreeMap的区别<br style="background-color:inherit">     集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。在Map <br style="background-color:inherit"> 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那<br style="background-color:inherit"> 么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和equals()的实现。这个TreeMap<br style="background-color:inherit"> 没有调优选项,因为该树总处于平衡状态。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> TreeMap<br style="background-color:inherit"> (http://www.cnblogs.com/hzmark/archive/2013/01/02/TreeMap-Base.html)<br style="background-color:inherit"> Java 集合系列目录(Category)<br style="background-color:inherit"> (http://www.cnblogs.com/skywang12345/p/3323085.html)</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit">                                                                                                                                                  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 四、I/O流、File</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> File--------java.io.File--------文件和目录路径名的抽象表示形式</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 常用方法:<br style="background-color:inherit"> createNewFile(" ")---------创建文件<br style="background-color:inherit"> delete(" ")<br style="background-color:inherit"> exists()-----------测试是否存在<br style="background-color:inherit"> getName()---------获得文件名</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例:<br style="background-color:inherit"> String path = File.separator;//与系统有关的默认名称分隔符<br style="background-color:inherit"> File f = new File("c:"+path+"c.txt");<br style="background-color:inherit"> ystem.out.println(f.createNewFile());</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例:import java.io.*;<br style="background-color:inherit"> public class FileDemo {<br style="background-color:inherit"> public static void main(String[] args) throws IOException{<br style="background-color:inherit"> /*<br style="background-color:inherit"> File f = new File("c:\\Users\\Rainlate\\Desktop\\123.txt");//注意\的转义字符<br style="background-color:inherit"> //构建实例不代表创建文件<br style="background-color:inherit"> boolean b =f.createNewFile();//创建文件<br style="background-color:inherit"> f.mkdirs();//创建前不必有父目录<br style="background-color:inherit"> //f.createTempFile(sd,jsp);//使用给定前缀和后缀生成其名称创建空文件<br style="background-color:inherit"> //f.createTempFile(23,txt, null);//使用给定前缀和后缀生成其名称<br style="background-color:inherit"> //boolean d1 = f.delete();//删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除<br style="background-color:inherit"> System.out.println(f.exists());//是否存在文件<br style="background-color:inherit"> System.out.println(f.getName());//123.txt<br style="background-color:inherit"> String path = File.separator;<br style="background-color:inherit"> File f = new File("c:"+path+"c.txt");<br style="background-color:inherit"> System.out.println(f.createNewFile());<br style="background-color:inherit"> String a = File.separator;<br style="background-color:inherit"> String path="c:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"1";<br style="background-color:inherit"> File f = new File(path);<br style="background-color:inherit"> File[] files = new listFiles(f);<br style="background-color:inherit"> for(String file:files){<br style="background-color:inherit"> System.out.println(file);<br style="background-color:inherit"> }<br style="background-color:inherit"> */<br style="background-color:inherit"> File x= new File("c:\\Users\\Rainlate\\Desktop\\1");<br style="background-color:inherit"> show(x);<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public static void show(File f){//递归输出源目录下的所有文件<br style="background-color:inherit"> if(f.isDirectory()){//判断是否为目录<br style="background-color:inherit"> File[] files =f.listFiles();<br style="background-color:inherit"> for(int i=0;i<files.length;i++){<br style="background-color:inherit"> show(files[i]);<br style="background-color:inherit"> }<br style="background-color:inherit"> }else{<br style="background-color:inherit"> System.out.println(f.getPath());<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> IO流:<br style="background-color:inherit"> 第一,确定方向-----------输入输出是以程序为中心<br style="background-color:inherit"> 第二,确定是字节还是字符【若是字符型文本使用字符流,其他使用字节流】<br style="background-color:inherit"> 第三,确定是否需要缓冲【autoFlush、Flush】----------缓冲流是用空间换时间<br style="background-color:inherit"> 第四,所有操作必须关闭【在finally关闭】</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例1;<br style="background-color:inherit"> import java.io.*;<br style="background-color:inherit"> public class  FileInputStreamDemo{//文本复制<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> String a = File.separator;//与系统有关的默认名称分隔符<br style="background-color:inherit"> FileInputStream fin = null;<br style="background-color:inherit"> //FileOutputStream fo = null;<br style="background-color:inherit"> BufferedOutputStream fo = null;<br style="background-color:inherit"> try{<br style="background-color:inherit"> fin = new FileInputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"123.docx");<br style="background-color:inherit"> byte[] b = new byte[512];//存储读取数据的缓冲区<br style="background-color:inherit"> long start = System.currentTimeMillis();<br style="background-color:inherit"> int size = fin.read(b,0,b.length);<br style="background-color:inherit"> //fo = new FileOutputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"12.java");<br style="background-color:inherit"> fo = new BufferedOutputStream (new FileOutputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"12.docx"));<br style="background-color:inherit"> while(size != -1){<br style="background-color:inherit"> fo.write(b,0,size);//文件的实际大小<br style="background-color:inherit"> fo.flush();<br style="background-color:inherit"> size = fin.read(b,0,b.length);<br style="background-color:inherit"> }<br style="background-color:inherit"> long late = System.currentTimeMillis();<br style="background-color:inherit"> System.out.println(late-start);<br style="background-color:inherit"> }catch (FileNotFoundException e){<br style="background-color:inherit"> System.out.println(e.getMessage());<br style="background-color:inherit"> }catch(IOException e){<br style="background-color:inherit"> System.out.println(e.getMessage());<br style="background-color:inherit"> }finally{<br style="background-color:inherit"> try{<br style="background-color:inherit"> fin.close();//关闭输入流<br style="background-color:inherit">         fo.close();//关闭输出流<br style="background-color:inherit"> }catch (IOException e){<br style="background-color:inherit"> System.exit(1);//异常退出<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例2:<br style="background-color:inherit"> import java.io.*;<br style="background-color:inherit"> public class ObjectSerializable {<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> Person p = new Person(32,"huhu");<br style="background-color:inherit"> String a = File.separator;<br style="background-color:inherit"> ObjectOutputStream ou =null;//序列化<br style="background-color:inherit"> ObjectInputStream oin = null;//反序列化<br style="background-color:inherit"> try{<br style="background-color:inherit"> ou = new ObjectOutputStream(new FileOutputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"1.txt"));<br style="background-color:inherit"> ou.writeObject(p);//对象序列化<br style="background-color:inherit"> ou.flush();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //反序列化<br style="background-color:inherit"> oin = new ObjectInputStream(new FileInputStream("C:"+a+"Users"+a+"Rainlate"+a+"Desktop"+a+"1.txt"));<br style="background-color:inherit"> Object obj = oin.readObject();<br style="background-color:inherit"> Person as = (Person)obj;<br style="background-color:inherit"> System.out.println(as);<br style="background-color:inherit"> out.flush();<br style="background-color:inherit"> }catch (FileNotFoundException e){<br style="background-color:inherit"> System.out.println(e.getMessage());<br style="background-color:inherit"> }catch(IOException e){<br style="background-color:inherit"> System.out.println(e.getMessage());<br style="background-color:inherit"> }catch(ClassNotFoundException e){<br style="background-color:inherit"> System.out.println(e.getMessage());<br style="background-color:inherit"> }finally{<br style="background-color:inherit"> try{<br style="background-color:inherit"> out.close();<br style="background-color:inherit"> }catch (IOException e){<br style="background-color:inherit"> System.exit(1);<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class Person implements Serializable {<br style="background-color:inherit"> private int age;<br style="background-color:inherit"> private String name;<br style="background-color:inherit"> public Person(int age,String name){<br style="background-color:inherit"> this.age=age;<br style="background-color:inherit"> this.name=name;<br style="background-color:inherit"> }<br style="background-color:inherit"> public String toString(){<br style="background-color:inherit"> return "name="+this.name+",age="+this.age;<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 序列化的版本号(serialVersionUID=1L)?<br style="background-color:inherit"> 作用:就是确保了不同版本之间的兼容性,不仅能够向前兼容,还能够向后兼容,即在版本升级时反序列化仍保持对象的唯一性。<br style="background-color:inherit"> 它有两种生成方式:       <br style="background-color:inherit">        一个是默认的1L,比如:private static final long serialVersionUID = 1L;<br style="background-color:inherit">        一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:  private static final long serialVersionUID = xxxxL </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 类图结构<br style="background-color:inherit">   ┌BufferedReader<br style="background-color:inherit">   ├InputStream──FileReader<br style="background-color:inherit">   ├StringReader<br style="background-color:inherit"> ┌Reader─┤<br style="background-color:inherit"> │   ├PipedReader<br style="background-color:inherit"> │   ├ByteArrayReader<br style="background-color:inherit"> │   └FileReader──PushbackReader<br style="background-color:inherit"> 字符流─┤<br style="background-color:inherit"> │   ┌BufferedWriter<br style="background-color:inherit"> │   ├OutputStreamWriter──FileWriter<br style="background-color:inherit"> │   ├PrinterWriter<br style="background-color:inherit"> └Writer─┼StringWriter<br style="background-color:inherit">   ├PipedWriter<br style="background-color:inherit">   ├CharArrayWriter<br style="background-color:inherit">   └FileWriter</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> ┌FileInputStream<br style="background-color:inherit"> │ ┌BufferedInputStream<br style="background-color:inherit"> ├FilterInputStream ──┼DataInputStream<br style="background-color:inherit"> │ └PushbackInputStream<br style="background-color:inherit"> ┌InputStream ─┼ObjectInputStream<br style="background-color:inherit"> │ ├PipedInputStream<br style="background-color:inherit"> │ ├SequenceInputStream<br style="background-color:inherit"> │ ├StringBufferInputStream<br style="background-color:inherit"> │ └ByteArrayInoutStream<br style="background-color:inherit"> 字节流─┤<br style="background-color:inherit"> │<br style="background-color:inherit"> │  ┌FileOutputStream<br style="background-color:inherit"> │  │   ┌BufferedOutputStream<br style="background-color:inherit"> │  ├FilterOutputStream ──┼DataOutputStream<br style="background-color:inherit"> └OutputStream ─┤   └PrintStream<br style="background-color:inherit">  ├ObjectOutputStream<br style="background-color:inherit">  ├PipedOutputStream</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> IO流------(http://developer.51cto.com/art/201309/410913.htm)</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit">                                                                                                                                                  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> JDK1.5新特性:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 七、枚举<br style="background-color:inherit"> 枚举是一个类类型,是JDK1.5的新特性</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举的关键字是enum</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java中所有的枚举类都是java.lang.Enum的子类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 注意:枚举类中可以包含成员有【字段(常量)、方法(构造方法、普通方法)】</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举中不能有number;不能赋值------------类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  只有顺序可以比较-----------</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 语法:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> enum 枚举名{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          枚举体</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> enum Direction{//枚举体</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          EAST,SOUTH,WEST,NORTH//后面可以有分号也可以没有</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 调用:枚举名.成员</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举名 name =枚举名.成员;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Direction dir = Direction.EAST;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Enum的方法使用:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Javap---------------查看字节码文件</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 代码:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> enum Direction{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> EAST('e'),SOUTH('s'),NORTH('n'),WEST('w');</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     protected char a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> private Direction(char a){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> this.a = a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public String toString(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> return a+"";</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 字节码:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> ---------- javap ----------</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Compiled from "Direction.java"</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> final class Direction extends java.lang.Enum<Direction> {//不能被实例化</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static final Direction EAST;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static final Direction SOUTH;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static final Direction NORTH;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static final Direction WEST;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   protected char a;//默认是private,但可以使用4P</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static Direction[] values();//默认方法,用来遍历打印枚举成员</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public static Direction valueOf(java.lang.String);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   public java.lang.String toString();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   static {};//静态初始化块</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 由上面可以知道枚举继承java.lang.Enum类,参数的默认修饰符public static final,在枚举中可以使用4p</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum A{BLUE,RED,BLACK};//声明并定义一个枚举,初始化为。。。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 在一个类中定义一个enum成员,enum默认是静态的-------------相当于类变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举的用法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一、常量-----------枚举出来之前都是通过接口</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 在JDK1.5 之前,我们定义常量都是: public static fianl,现在可以把相关的常量分组到一个枚举类型里,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum Color {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   RED, GREEN, BLANK, YELLOW</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 二、Switch</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> JDK1.5之后的switch语句支持Byte,short,int,char,enum类型,使用枚举,能让我们的代码可读性更强,JDK1.7之后开始支持String类型,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> enum Signal {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          GREEN, YELLOW, RED</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class TrafficLight {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          Signal color = Signal.RED;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void change() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    switch (color) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    case RED:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             color = Signal.GREEN;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             break;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    case YELLOW:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             color = Signal.RED;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             break;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    case GREEN:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             color = Signal.YELLOW;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             break;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 三、向枚举中添加新方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 要自定义方法,必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum实例,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum Color {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 成员变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private String name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private int index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 构造方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private Color(String name, int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.name = name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.index = index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 普通方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public static String getName(int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    for (Color c : Color.values()) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             if (c.getIndex() == index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                                      return c.name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                             }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return null;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // get set 方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public String getName() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void setName(String name) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.name = name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public int getIndex() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void setIndex(int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.index = index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 四、覆盖枚举的方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例如覆盖toString()</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum Color {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 成员变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private String name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private int index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 构造方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private Color(String name, int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.name = name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.index = index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          //覆盖方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          @Override</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public String toString() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return this.index+"_"+this.name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 五、实现接口------所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public interface Behaviour {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          void print();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          String getInfo();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public enum Color implements Behaviour{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 成员变量</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private String name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private int index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          // 构造方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          private Color(String name, int index) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.name = name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    this.index = index;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //接口方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          @Override</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public String getInfo() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    return this.name;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          //接口方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          @Override</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          public void print() {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    System.out.println(this.index+":"+this.name);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 六、使用接口组织枚举</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public interface Food {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          enum Coffee implements Food{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          enum Dessert implements Food{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">                    FRUIT, CAKE, GELATO</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 七、枚举集合</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 枚举和普通类的区别与联系;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、枚举与类都可以实现多接口;访问控制符都可以使用(4p),但枚举中默认的是private,类中默认的是package;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、枚举直接继承java.lang.Enum类,普通类是继承java.lang.Object;其中java.long.Enum类实现了java.long.Serializable和java.long.Comparable两个接口。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3、使用enum定义、非抽象的枚举默认修饰符为public final,因此枚举不能派生子类。<br style="background-color:inherit"> 4、枚举的构造器只能使用private访问控制符,如果省略了枚举的访问修饰符其默认为private修饰;因为枚举的字段不能初始化,对象类型的必须调用构造方法,所有有多少个成员构造方法就会运行多少次;<br style="background-color:inherit"> 5、枚举的所有实例必须在枚举的第一行显示列出,否则这个枚举永远都不能生产实例,列出这些实例时系统会自动添加public static final修饰,无需程序员显式添加</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6、所有的枚举类都提供了一个values方法,该方法可以很方便的遍历所有的枚举值</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7、关键字:枚举是enum,类是class</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8、枚举是类类型,类是引用类型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> instanceof关键字:<br style="background-color:inherit"> public class FX {<br style="background-color:inherit"> public static void main(String[] args) {<br style="background-color:inherit"> boolean b = ("1" instanceof String);//判断某个对象是不是某个类的实例    Result = Object instanceof Class/interface<br style="background-color:inherit"> //Result:布尔类型。<br style="background-color:inherit">    //Object:必选项。任意对象表达式。<br style="background-color:inherit"> //Class:必选项。任意已定义的对象类。<br style="background-color:inherit"> System.out.println(b);<br style="background-color:inherit"> }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 注解---JDK1.5的新特性<br style="background-color:inherit"> 使用位置:类上、方法上、语句上</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|<br style="background-color:inherit"> ----------------------------------------------------------------------|----------------------------------------------------------------------|</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 八、协变与泛型<br style="background-color:inherit"> 协变-------可以用在数组、重写,不可以用在枚举中</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 可变参数:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> int… a-------------代表一个没有长度限制的数组----------JDK1.5之后有的</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 输入的必须是数组</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。注意:可变参数必须位于最后一项。只支持有一个可变参数。因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 可变参数的特点:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> (1)、只能出现在参数列表的最后;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> (2)、... 位于变量类型和变量名之间,前后有无空格都可以;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> (3)、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Varable {<br style="background-color:inherit">      public static void main(String [] args){<br style="background-color:inherit">          System.out.println(add(2,3));<br style="background-color:inherit">          System.out.println(add(2,3,5));<br style="background-color:inherit">      }<br style="background-color:inherit">      public static int add(int x,int ...args){<br style="background-color:inherit">          int sum=x;<br style="background-color:inherit">          for(int i=0;i<args.length;i++){<br style="background-color:inherit">              sum+=args[i];<br style="background-color:inherit">          }<br style="background-color:inherit">          return sum;<br style="background-color:inherit">      }<br style="background-color:inherit"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  协变的作用范围</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、数组:如果 A 是 B 的超类,则 A[] 也是 B[] 的超类,所有需要 A[] 的地方都可以用 B[] 代替,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Test2 {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public static void main(String[] args){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         Integer[] ints=new Integer[1];</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         ints[0]=99;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         show(ints);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     static void show(Number[] ns){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         System.out.println(Arrays.toString(ns));</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、重写</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Test2 {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public static void main(String[] args){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         P p=new C();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         System.out.println(p.get());</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class P{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public Number get(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         return new Integer(0);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class C extends P{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public Integer get(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         return new Integer(1);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3、泛型不能协变:如果 A 是 B 的超类,则 List<A> 和 List<B> 无关,需要 List<A> 的地方不可以用 List<B> 代替,例:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Test2 {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     public static void main(String[] args) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         List<Integer> ints = new ArrayList<Integer>();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         //incompatible type--类型不兼容</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         show(ints);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     static void show(List<Number> ns) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         System.out.println(ns);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 泛型(Generic)的本质是类型参数化</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> -------------是JDK1.5提供的新技术,它的本质是类型参数化,类似C++中的模板,它根据应用主要分为泛型方法,泛型接口,泛型类,协变不适用于泛型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 泛型-------------泛型类class Demo<T>{},泛型接口interface Inter<T>{},泛型方法public<T> T show(T a) {}</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例1:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class  GenericDemo{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public static void main(String[] args) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               C c1 = new C(new A("aaa"));</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               C c2 = new C(new B(3.4));//包装成double---自动装箱</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               Object obj = c1.getObj();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               A obj = (A)(c1.getObj());//强制转换</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               System.out.println(obj);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class A{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        private String x;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public A(String x){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               this.x=x;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public String getX(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return x;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class B{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        private Double d;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public B(Double d){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               this.d=d ;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public Double getD(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return d;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class C{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        private Object obj;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public C(Object obj){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               this.obj=obj ;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public Object  getObj(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return obj;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 泛型的使用:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一、泛型类:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class Demo1 {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public static void main(String[] args) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               Generic<String> c = new Generic<String>("asad");</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               System.out.println(c.getA());</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               //Generic<int> c1 = new Generic<int>(12);必须要是包装类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class Generic<T>{//泛型类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        private T a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public Generic(T a){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               this.a = a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public T getA(){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return a;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 二、泛型方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        public static <T> T getX(T t){//泛型方法----------<  >--表声明</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return t;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">      </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public static <T,K> T getX(K t){//泛型方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">               return t;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">        }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 三、泛型接口</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public class GenericDemo3{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public static void main(String[] args) {</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> D<int[][]> d = new D<int[][]>();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> d.show(new int[][]{{1,4},{2,3}});</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> interface IA<T>{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> void show(T t);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> class D<T> implements IA<T>{</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> public void show(T t){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> System.out.println(t.getClass().getName());</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 有界类型:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 上界:extends 默认上界为Object</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Class G <T extends Number,K extends Object,H super Integer>{}</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 下界:super----------只有通配符有下限</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> super关键字声明了类型的下界,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 规则和限制</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3、泛型的类型参数可以有多个。<T,K></p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4、泛型的参数类型可以使用extends关键字,例如<T extends superclass>。习惯上称为“有界类型”。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String")</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6、如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7、通配符泛型不但可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一个普通static方法,无法访问泛型类的类型参数,所以,若普通static方法需要使用泛型参数,必须使其成为泛型方法。</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> java 泛型详解</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 普通泛型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Point<T>{       // 此处可以随便写标识符号 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ; // var的类型由T指定,即:由外部指定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public T getVar(){  // 返回值的类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          return var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public void setVar(T var){  // 设置的类型也由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.  } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10. public class GenericsDemo06{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     public static void main(String[] args){</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.         Point<String> p = new Point<String>() ; // 里面的var类型为String类型  --------指定数据类型—必须是引用数据类型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.         p.setVar("it") ;        // 设置字符串 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.         System.out.println(p.getVar().length()) ;   // 取得字符串的长度 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16. }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17. //2</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18. ---------------------------------------------------------- </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19. class Notepad<K,V>{       // 此处指定了两个泛型类型-----再类上进行声明泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.     private K key ;     // 此变量的类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     private V value ;   // 此变量的类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.     public K getKey(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23.         return this.key ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 24.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 25.     public V getValue(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 26.         return this.value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 27.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 28.     public void setKey(K key){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 29.         this.key = key ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 30.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 31.     public void setValue(V value){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 32.         this.value = value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 33.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 34. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 35. public class GenericsDemo09{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 36.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 37.         Notepad<String,Integer> t = null ;        // 定义两个泛型类型的对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 38.         t = new Notepad<String,Integer>() ;       // 里面的key为String,value为Integer </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 39.         t.setKey("汤姆") ;        // 设置第一个内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 40.         t.setValue(20) ;            // 设置第二个内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 41.         System.out.print("姓名;" + t.getKey()) ;      // 取得信息 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 42.         System.out.print(",年龄;" + t.getValue()) ;       // 取得信息 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 43.       } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 44. }  //汤姆</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 45.       20</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  通配符</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 定义泛型变量 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){   // 直接打印 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo14{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<String> i = new Info<String>() ;       // 使用String为泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         i.setVar("it") ;                            // 设置内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.         fun(i) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.     public static void fun(Info<?> temp){     // 可以接收任意的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.         System.out.println("内容:" + temp) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22. }//  内容:it</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  受限泛型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 定义泛型变量 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){   // 直接打印 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo17{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<Integer> i1 = new Info<Integer>() ;   // 声明Integer的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         Info<Float> i2 = new Info<Float>() ;         // 声明Float的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.         i1.setVar(30) ;                              // 设置整数,自动装箱 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.         i2.setVar(30.1f) ;                           // 设置小数,自动装箱 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.         fun(i1) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.         fun(i2) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.     public static void fun(Info<? extends Number> temp){ // 只能接收Number及其Number的子类 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23.         System.out.print(temp + "、") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 24.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 25. }//  30、30.1、</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 26. ---------------------------------------------------------- </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 27. class Info<T>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 28.     private T var ;     // 定义泛型变量 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 29.     public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 30.         this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 31.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 32.     public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 33.         return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 34.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 35.     public String toString(){   // 直接打印 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 36.         return this.var.toString() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 37.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 38. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 39. public class GenericsDemo21{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 40.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 41.         Info<String> i1 = new Info<String>() ;      // 声明String的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 42.         Info<Object> i2 = new Info<Object>() ;      // 声明Object的泛型对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 43.         i1.setVar("hello") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 44.         i2.setVar(new Object()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 45.         fun(i1) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 46.         fun(i2) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 47.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 48.     public static void fun(Info<? super String> temp){   // 只能接收String或Object类型的泛型  ----上限为String</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 49.         System.out.print(temp + "、") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 50.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 51. }//  hello、java.lang.Object@1ffc686、</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型无法向上转型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 定义泛型变量 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){   // 直接打印 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo23{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<String> i1 = new Info<String>() ;      // 泛型类型为String </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         Info<Object> i2 = null ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.         i2 = i1 ;                           //这句会出错 incompatible types </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19. }//  编译失败</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型接口</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  interface Info<T>{        // 在接口上定义泛型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.  } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.  class InfoImpl<T> implements Info<T>{   // 定义泛型接口的子类 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      private T var ;             // 定义属性 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public InfoImpl(T var){     // 通过构造方法设置属性内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          this.setVar(var) ;   </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.     public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.         return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16. public class GenericsDemo24{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.     public static void main(String arsg[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.         Info<String> i = null;        // 声明接口对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.         i = new InfoImpl<String>("汤姆") ;  // 通过子类实例化对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.         System.out.println("内容:" + i.getVar()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22. }//  内容:汤姆</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型方法</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Demo{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      public <T> T fun(T t){            // 可以接收任意类型的数据 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.          return t ;                  // 直接把参数返回 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.  } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.  public class GenericsDemo26{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.      public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.          Demo d = new Demo() ;   // 实例化Demo对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.          String str = d.fun("汤姆") ; //   传递字符串 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         int i = d.fun(30) ;     // 传递数字,自动装箱 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.         System.out.println(str) ;   // 输出内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.         System.out.println(i) ;     // 输出内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14. }//  汤姆  30</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  通过泛型方法返回泛型类型实例</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T extends Number>{ // 指定上限,只能是数字类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 此类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          return this.var ;    </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){       // 覆写Object类中的toString()方法 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ;     </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo27{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<Integer> i = fun(30) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         System.out.println(i.getVar()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.     public static <T extends Number> Info<T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.         Info<T> temp = new Info<T>() ;      // 根据传入的数据类型实例化Info </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.         temp.setVar(param) ;     // 将传递的内容设置到Info对象的var属性之中 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.         return temp ;   // 返回实例化对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23. }//  30</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  使用泛型统一传入的参数类型</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T>{    // 指定上限,只能是数字类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ;     // 此类型由外部决定 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          return this.var ;    </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public String toString(){       // 覆写Object类中的toString()方法 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         return this.var.toString() ;     </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12. }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13. public class GenericsDemo28{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         Info<String> i1 = new Info<String>() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.         Info<String> i2 = new Info<String>() ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.         i1.setVar("HELLO") ;        // 设置内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.         i2.setVar("汤姆") ;       // 设置内容 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.         add(i1,i2) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21.     public static <T> void add(Info<T> i1,Info<T> i2){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.         System.out.println(i1.getVar() + " " + i2.getVar()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 24. }// HELLO 汤姆</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型数组</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  public class GenericsDemo30{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.          Integer i[] = fun1(1,2,3,4,5,6) ;   // 返回泛型数组 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.          fun2(i) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.      public static <T> T[] fun1(T...arg){  // 接收可变参数 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.          return arg ;            // 返回泛型数组 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.      public static <T> void fun2(T param[]){   // 输出 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.         System.out.print("接收泛型数组:") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.         for(T t:param){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.             System.out.print(t + "、") ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.         } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15. }//  接收泛型数组:1、2、3、4、5、6、</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  泛型的嵌套设置</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Java代码</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1.  class Info<T,V>{      // 接收两个泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2.      private T var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3.      private V value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 4.      public Info(T var,V value){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 5.          this.setVar(var) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 6.          this.setValue(value) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 7.      } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 8.      public void setVar(T var){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 9.          this.var = var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 10.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 11.     public void setValue(V value){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12.         this.value = value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 13.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14.     public T getVar(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 15.         return this.var ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 16.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 17.     public V getValue(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 18.         return this.value ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 19.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 20. } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 21. class Demo<S>{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 22.     private S info ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 23.     public Demo(S info){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 24.         this.setInfo(info) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 25.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 26.     public void setInfo(S info){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 27.         this.info = info ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 28.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 29.     public S getInfo(){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 30.         return this.info ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 31.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 32. }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 33. public class GenericsDemo31{ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 34.     public static void main(String args[]){ </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 35.         Demo<Info<String,Integer>> d = null ;  // 将Info作为Demo的泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 36.         Info<String,Integer> i = null ;   // Info指定两个泛型类型 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 37.         i = new Info<String,Integer>("汤姆",30) ;    // 实例化Info对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 38.         d = new Demo<Info<String,Integer>>(i);//在Demo类中设置Info类的对象 </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 39.         System.out.println("内容一:" + d.getInfo().getVar()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 40.         System.out.println("内容二:" + d.getInfo().getValue()) ; </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 41.     } </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 42. } // 内容一:汤姆 内容二:30</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   泛型方法不一定要通过参数来确定泛型准确类型,可以只通过返回值,比如:</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  public static <E> ArrayList<E> newArrayList() {<br style="background-color:inherit">          return new ArrayList<E>();<br style="background-color:inherit">  }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  public List<PrepaidHistory> queryHistories(Long skyid,PrepaidHistoryType type, Date from, Date end) { </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">          return Lists.newArrayList();</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  这样Lists.newArrayList();<br style="background-color:inherit"> 智能的知道返回类型为PrepaidHistory</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 一、 Oracle的安装(windowXP、win7、Linux)和卸载<br style="background-color:inherit">   1.1 Oracle的安装<br style="background-color:inherit">     1.1.1 在WindowsXP、Win7下安装<br style="background-color:inherit">       第一:解压win32_11gR2_database_1of2、win32_11gR2_database_2of2,生成detabase目录<br style="background-color:inherit">       第二:安装oracle<br style="background-color:inherit">            A、点击setup图标即可,注意:安装目录不要含有中文<br style="background-color:inherit">            B、在弹出的第一个界面中取消更新选择项,点击下一步<br style="background-color:inherit">            C、在弹出的警告框中选择是<br style="background-color:inherit">            D、选择创建和配置数据库选项,下一步<br style="background-color:inherit">            E、选择桌面类安装,点击下一步<br style="background-color:inherit">            F、弹出的窗口中输入全局数据库名:orcl<br style="background-color:inherit">                  输入管理口令:bluedot<br style="background-color:inherit">                  默认的管理员是:sys和system<br style="background-color:inherit">            G、点完成,开始安装数据库,出现进度条<br style="background-color:inherit">            H、口令管理<br style="background-color:inherit">            I、设置口令<br style="background-color:inherit">            J、完成安装<br style="background-color:inherit">   1.2 Oracle的卸载:<br style="background-color:inherit">     1、 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务。<br style="background-color:inherit">     2、 开始->程序->Oracle - OraHome81->Oracle Installation Products-> Universal Installer,单击“卸载产品”-“全部展开”,选中除“OraDb11g_home1”外的全部目录,删除。<br style="background-color:inherit">     3、 运行regedit,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删除这个入口。<br style="background-color:inherit">     4、 运行regedit,选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滚动这个列表,删除所有Oracle入口(以oracle或OraWeb开头的键)。<br style="background-color:inherit">     5、 运行refedit,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,删除所有Oracle入口。e<br style="background-color:inherit">     6、 删除HKEY_CLASSES_ROOT目录下所有以Ora、Oracle、Orcl或EnumOra为前缀的键。<br style="background-color:inherit">     7、 删除HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs中所有以oracle开头的键。<br style="background-color:inherit">     8、删除HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI中除Microsoft ODBC for Oracle注册表键以外的所有含有Oracle的键。<br style="background-color:inherit">     9、我的电脑-->属性-->高级-->环境变量,删除环境变量CLASSPATH和PATH中有关Oracle的设定。<br style="background-color:inherit">     10、从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标。<br style="background-color:inherit">     11、删除所有与Oracle相关的目录(如果删不掉,重启计算机后再删就可以了)包括:<br style="background-color:inherit">          1.C:\Program file\Oracle目录。<br style="background-color:inherit">          2.ORACLE_BASE目录(oracle的安装目录)。<br style="background-color:inherit">          3.C:\WINDOWS\system32\config\systemprofile\Oracle目录。<br style="background-color:inherit">          4.C:\Users\Administrator\Oracle或C:\Documents and Settings\Administrator\Oracle目录。<br style="background-color:inherit">          5.C:\WINDOWS下删除以下文件ORACLE.INI、oradim73.INI、oradim80.INI、oraodbc.ini等等。<br style="background-color:inherit">          6.C:\WINDOWS下的WIN.INI文件中若有[ORACLE]的标记段,删除该段。<br style="background-color:inherit">     12、如有必要,删除所有Oracle相关的ODBC的DSN<br style="background-color:inherit">     13、到事件查看器中,删除Oracle相关的日志 说明: 如果有个别DLL文件无法删除的情况,则不用理会,重新启动,开始新的安装,安装时,选择一个新的目录,则,安装完毕并重新启动后,老的目录及文件就可以删除掉了。<br style="background-color:inherit">  <br style="background-color:inherit"> 二、 用户管理<br style="background-color:inherit">    2.1 创建用户<br style="background-color:inherit">        注:创建用户只能在管理员下完成<br style="background-color:inherit">        CREATE USER 用户名 IDENTIFIED BY 密码。<br style="background-color:inherit">        |-CREATE USER demo IDENTIFIED BY 123456;<br style="background-color:inherit">    2.2 用户分类<br style="background-color:inherit">      |-管理员和普通用户<br style="background-color:inherit">         |-管理员<br style="background-color:inherit">           |-超级管理员:sys/bluedot<br style="background-color:inherit">           |-管理员:system/bluedot<br style="background-color:inherit">         |-普通用户:scott/tiger<br style="background-color:inherit">                        hr/hr<br style="background-color:inherit">      |--常见角色:sysdba、sysoper<br style="background-color:inherit">    2.3 用户登录<br style="background-color:inherit">      2.3.1 在命令行窗口登录[c/s]<br style="background-color:inherit">         步骤:<br style="background-color:inherit">            运行 sqlplus /nolog<br style="background-color:inherit">            conn demo/123456<br style="background-color:inherit">       2.3.2 另外的一种登录方式【B/S】<br style="background-color:inherit">            输入网址----https://localhost:1158/em<br style="background-color:inherit">   输入用户名密码进入主界面<br style="background-color:inherit">    2.4 修改用户密码<br style="background-color:inherit">       注:修改密码必须要在级别高的用户下进行修改<br style="background-color:inherit">      ALTER USER 用户名 IDENTIFIED BY 密码;<br style="background-color:inherit">      <br style="background-color:inherit">      conn sys/bluedot as sysdba<br style="background-color:inherit">      ALTER USER demo IDENTIFIED BY 654321;<br style="background-color:inherit">    2.5 查询用户<br style="background-color:inherit">        2.5.1查看用户信息<br style="background-color:inherit">          1、SELECT * FROM DBA_USERS;--------查看所有用户的详细信息<br style="background-color:inherit">          2、SELECT * FROM ALL_USERS;-------查看所有用户简要信息<br style="background-color:inherit">          3、SELECT * FROM USER_USERS;------------查看当前用户的所用信息<br style="background-color:inherit">       2.5.2 查看用户或角色系统权限(直接赋值给用户或角色的系统权限)<br style="background-color:inherit">          SELECT * FROM DBA_SYS_PRIVS;----------全部<br style="background-color:inherit">          SELECT * FROM USER_SYS_PRIVS; ---------当前用户<br style="background-color:inherit">       2.5.3 查看角色(登录用户拥有的角色)所包含的的权限<br style="background-color:inherit">          SELECT * FROM ROLE_SYS_PRIVS;<br style="background-color:inherit">       2.5.4 查看用户对象权限<br style="background-color:inherit">          SELECT * FROM DBA_TAB_PRIVS;<br style="background-color:inherit">          SELECT * FROM ALL_TAB_PRIVS;<br style="background-color:inherit">          SELECT * FROM USER_TAB_PRIVS;<br style="background-color:inherit">       2.5.5 查看所有角色<br style="background-color:inherit">          SELECT * FROM DBA_ROLES;<br style="background-color:inherit">          SELECT * FROM DBA_ROLE_PRIVS;<br style="background-color:inherit">          SELECT * FROM USER_ROLE_PRIVS;<br style="background-color:inherit">  <br style="background-color:inherit">       2.5.6 查看哪些用户有sysdba或sysoper系统权限(查询时需要相应权限)<br style="background-color:inherit">          SELECT * FROM V$PWFILE_USERS;<br style="background-color:inherit">  <br style="background-color:inherit">       2.5.7 查看Oracle提供的系统权限<br style="background-color:inherit">          SELECT name FROM SYS.SYSTEM_PRIVSILEGE_MAP;<br style="background-color:inherit">    2.6 密码失效<br style="background-color:inherit">       提示用户第一次连接的时候需要修改密码,让用户的密码到期<br style="background-color:inherit">         |- ALTER USER 用户名 PASSWORD expire ;<br style="background-color:inherit">    2.7 授权<br style="background-color:inherit">        GRANT 权限/角色 TO 用户<br style="background-color:inherit">        给 demo 用户以创建 session 的权限:GRANT create session TO demo;<br style="background-color:inherit">        角色:-------------角色就是一堆权限的集合<br style="background-color:inherit">        Create role myrole;<br style="background-color:inherit">        Grant create table to myrole;<br style="background-color:inherit">        Drop role myrole; 删除角色<br style="background-color:inherit">       1.CONNECT, RESOURCE, DBA<br style="background-color:inherit">       这些预定义角色主要是为了向后兼容。其主要是用于数据库管理。oracle建议用户自己设计数据库管理和安全的权限规划,而不要简单的使用这些预定角色。将来的版本中这些角色可能不会作为预定义角色。<br style="background-color:inherit">       2.DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE, SELECT_CATALOG_ROLE 这些角色主要用于访问数据字典视图和包。<br style="background-color:inherit">       3.EXP_FULL_DATABASE, IMP_FULL_DATABASE 这两个角色用于数据导入导出工具的使用。<br style="background-color:inherit">         GRANT 权限(select、update、insert、delete) ON schema.table TO 用户<br style="background-color:inherit">           |- GRANT select ON scott.emp TO test ;<br style="background-color:inherit">           |- Grant all on scott.emp to test; --将表相关的所有权限付给 test<br style="background-color:inherit">           |- Grant update(ename) on emp to test; 可以控制到列(还有 insert)<br style="background-color:inherit">    2.8 收权<br style="background-color:inherit">       REVOKE 权限/角色 ON schema.table FROM 用户<br style="background-color:inherit">        |- REVOKE select ON scott.emp FROM test ;<br style="background-color:inherit">    2.9 锁住一个用户<br style="background-color:inherit">        ALTER USER 用户名 ACCOUNT LOCK|UNLOCK<br style="background-color:inherit">          |- ALTER USER test ACCOUNT LOCK ;<br style="background-color:inherit">          |- ALTER USER test ACCOUNT UNLOCK ;<br style="background-color:inherit">     2.10 删除用户<br style="background-color:inherit">             |-DROP USER 用户名;<br style="background-color:inherit">                   |-Drop user demo;<br style="background-color:inherit">            如果该用户下面已经存在表等一些数据库对象。则必须用级联删除<br style="background-color:inherit">            |-DROP USER 用户名 CASCADE;<br style="background-color:inherit">                    |-Drop user demo cascade;<br style="background-color:inherit">     备注:帮助<br style="background-color:inherit">         help index<br style="background-color:inherit">         help conn --------显示具体的<br style="background-color:inherit">         eidt---------------进入编辑文档<br style="background-color:inherit"> 三、 Oracle的体系结构<br style="background-color:inherit">    3.1 Oracle数据库的整体架构 (DBA)<br style="background-color:inherit">                  ┌──────────────────────────────┐<br style="background-color:inherit"> ┌────┐ │ Instance │<br style="background-color:inherit"> │ User │ │ ┌──────────────────────────┐ │<br style="background-color:inherit"> │ process│ │ │ ┌────────┐ SGA │ │<br style="background-color:inherit"> └────┘ │ │ │ Shared Pool │ │ │<br style="background-color:inherit">     ↓ │ │ │ ┌─────┐ │ ┌────┐ ┌────┐ │ │<br style="background-color:inherit">     ↓ │ │ │ │Library │ │ │Database│ │ Redo │ │ │<br style="background-color:inherit"> ┌────┐ │ │ │ │ Cache │ │ │Buffer │ │ Log │ │ │<br style="background-color:inherit"> │ Server │ │ │ │ └─────┘ │ │Cache │ │ Buffer │ │ │<br style="background-color:inherit"> │process │ │ │ │ ┌─────┐ │ │ │ │ │ │ │<br style="background-color:inherit"> └────┘ │ │ │ │Data Dict │ │ └────┘ └────┘ │ │<br style="background-color:inherit">      ↓ │ │ │ │ Cache │ │ │ │<br style="background-color:inherit">      →→→→→→│ │ │ └─────┘ │ │ │<br style="background-color:inherit">                  │ │ └────────┘ │ │<br style="background-color:inherit">                  │ └──────────────────────────┘ │<br style="background-color:inherit">                  │ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌───┐│<br style="background-color:inherit">    │ │PMON│ │SNON│ │DBWR│ │LGWR│ │CHPT│ │OTHERS││<br style="background-color:inherit">                  │ └──┘ └──┘ └──┘ └──┘ └──┘ └───┘│<br style="background-color:inherit">                  └──────────────────────────────┘<br style="background-color:inherit">                                                  ↑ ↓<br style="background-color:inherit">                ┌─────┐ ┌───────────────────┐<br style="background-color:inherit">                │Parameter │ │┌───┐ ┌────┐ ┌────┐│<br style="background-color:inherit">                │ file │ ││Data │ │control │ │Redo Log││ ┌─────┐<br style="background-color:inherit">                └─────┘ ││files │ │ files │ │ files ││ │Archived │<br style="background-color:inherit">                ┌─────┐ │└───┘ └────┘ └────┘│ │Log files │<br style="background-color:inherit">                │ Password │ │ Database │ └─────┘<br style="background-color:inherit">         │ file │ │ │<br style="background-color:inherit">                └─────┘ └───────────────────┘<br style="background-color:inherit"> 由上图可知,Oracle数据库由实例和数据库组成。<br style="background-color:inherit">    3.2 数据库存储结构<br style="background-color:inherit">       3.2.1 数据库存储结构<br style="background-color:inherit">       Oracle数据库有物理结构和逻辑结构。数据库的物理结构是数据库中的操作系统文件的集合。数据库的物理结构由数据文件、控制文件和重做日志文件组成。<br style="background-color:inherit">       1、数据文件:数据文件是数据的存储仓库。<br style="background-color:inherit">       2、重做日志文件:重做日志文件包含对数据库所做的更改记录,在发生故障时能够恢复数据。重做日志按时间顺序存储应用于数据库的一连串的变更向量。其中仅包含重建(重做)所有已完成工作的最少限度信息。如果数据文件受损,则可以将这些变更向量应用于数据文件备份来重做工作,将它恢复到发生故障的那一刻前的状态。重做日志文件包含联机重做日志文件(对于连续的数据库操作时必须的)和归档日志文件(对于数据库操作是可选的,但对于时间点恢复是必须的)。<br style="background-color:inherit">       3、控制文件:控制文件包含维护和验证数据库完整性的必要的信息。控制文件虽小,但作用非常大。它包含指向数据库其余部分的指针:联机重做日志文件和数据文件的位置,以及更新的归档日志文件的位置。它还存储着维护数据库完整性所需的信息。控制文件不过数MB,却起着至关重要的作用。<br style="background-color:inherit">       除了三个必须的文件外数据库还能有其它非必须的文件如:参数文件、口令文件及归档日志文件。<br style="background-color:inherit">           1、实例参数文件:当启动oracle实例时,SGA结构会根据此参数文件的设置内置到内存,后台进程会据此启动。<br style="background-color:inherit">           2、口令文件:用户通过提交用户名和口令来建立会话。Oracle根据存储在数据字典的用户定义对用户名和口令进行验证。<br style="background-color:inherit">           3、归档重做日志文件:当重做日志文件满时将重做日志文件进行归档以便还原数据文件备份。<br style="background-color:inherit">       3.2.2 Oracle数据库结构的16个要点(表空间-->段-->区-->块)<br style="background-color:inherit">    1、一个数据文件只能归到某一个表空间上,每个表空间可以含一个或多个数据文件。包括系统数据和用户数据。<br style="background-color:inherit">    2、表空间是包括一个或多个数据文件的逻辑结构。用于存放数据库表、索引、回滚段等对象的磁盘逻辑空间<br style="background-color:inherit">    3、数据库文件是存放实际数据的物理文件。包括实例和数据库。<br style="background-color:inherit">    4、数据文件可以在创建表空间时创建,也可以以增加的方式创建。<br style="background-color:inherit">    5、数据文件的大小一般与操作系统限制有关。<br style="background-color:inherit">    6、控制文件是Oracle的重要文件,主要存放数据文件、日志文件和数据库的基本信息,一般在数据打开时访问。<br style="background-color:inherit">    7、日志文件在数据库活动时使用。<br style="background-color:inherit">    8、临时表空间是用于存放排序段的磁间;临时表空间由一个或多个临时文件组成。<br style="background-color:inherit">    9、归档日志文件由归档进程将联机日志文件读出并写到一个路径上的文件。<br style="background-color:inherit">    10、Oracle实例由一组后台进程和内存结构组成。<br style="background-color:inherit">    11、Oracle实例的内存结构常叫系统全局区,简称SGA。<br style="background-color:inherit">    12、DBA_开头的数据字典存放的字符信息都是大写,而V$_开头的视图存放的都是小写。<br style="background-color:inherit">    13、后台进程是一组完成不同功能的程序,主要包括DBWR、LGMR、CKPT等。<br style="background-color:inherit">    14、数据字典是Oracle的重要部分,也就是用于系统内部的一组表。<br style="background-color:inherit">    15、数据字典分为动态和静态两部分,静态主要是DBA_开头的数据字典,而动态则是以V$_开头的视图。<br style="background-color:inherit">    16、SGA分为数据缓冲区、共享池和日志缓冲区。<br style="background-color:inherit">      3.2.3 Oracle逻辑结构及表空间<br style="background-color:inherit">         1.ORACLE逻辑结构<br style="background-color:inherit">              ORACLE将数据逻辑地存放在表空间,物理地存放在数据文件中。<br style="background-color:inherit">              一个表空间任何一个时刻只能属于一个数据库。<br style="background-color:inherit">  <br style="background-color:inherit">              数据库——表空间——段——区——ORACLE块<br style="background-color:inherit">              每个数据库由一个或多个表空间组成,至少一个。<br style="background-color:inherit">              每个表空间基于一个或多个操作系统的数据文件,至少一个,一个操作系统的数据文件只能属于一个表空间。一个表空间可以存放一个或多个段 segment。<br style="background-color:inherit">              每个段由一个或多个区段extent组成。<br style="background-color:inherit">              每个区段由一个或多个连续的ORACLE数据库块组成。<br style="background-color:inherit">              每个ORACLE数据块由一个或多个连续的操作系统数据块组成。<br style="background-color:inherit">              每个操作系统数据文件由一个或多个区段组成,由一个或多个操作系统数据块组成。<br style="background-color:inherit">      <br style="background-color:inherit">          ⑴、表空间(tablespace)<br style="background-color:inherit">              表空间是数据库中最大的逻辑单位,每一个表空间由一个或多个数据文件组成,一个数据文件只能与一个表空间相联系。每一个数据库都有一个SYSTEM表空间,该表空间是在数据库创建或数据库安装时自动创建的,用于存储系统的数据字典表,程序系统单元,过程函数,包和触发器等,也可用于存储用户数据表,索引对象。表空间具有在线(online)和离线(offline)属性,可以将除SYSTME以外的其他任何表空间置为离线。<br style="background-color:inherit">          ⑵、段(segment)<br style="background-color:inherit">              数据库的段可以分为四类:数据段、索引段、回退段和临时段。<br style="background-color:inherit">          ⑶、区<br style="background-color:inherit">              区是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区存储与段中,它由连续的数据块组成。<br style="background-color:inherit">          ⑷、数据块<br style="background-color:inherit">              数据块是数据库中最小的数据组织单位与管理单位,是数据文件磁盘存储空间单位,也是数据库I/O的最小单位,数据块大小由DB_BLOCK_SIZE参数决定,不同的Oracle版本DB_BLOCK_SIZE的默认值是不同的。<br style="background-color:inherit">          ⑸、模式对象<br style="background-color:inherit">              模式对象是一种应用,包括:表、聚簇、视图、索引序列生成器、同义词、哈希、程序单元、数据库链等。<br style="background-color:inherit">              最后,在来说一下Oracle的用户、表空间和数据文件的关系:<br style="background-color:inherit">              一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用。用户和表空间没有隶属关系,表空间是一个用来管理数据存储的逻辑概念,表空间只是和数据文件发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。<br style="background-color:inherit">              总结:解释数据库、表空间、数据文件、表、数据的最好办法就是想象一个装满东西的柜子。数据库其实就是柜子,柜中的抽屉是表空间,抽屉中的文件夹是数据文件,文件夹中的纸是表,写在纸上的信息就是数据。<br style="background-color:inherit">       2.两类表空间:<br style="background-color:inherit">            系统SYSTEM表空间 非系统表空间 NON-SYSTEM表空间<br style="background-color:inherit">            系统SYSTEM表空间与数据库一起建立,在系统表空间中有数据字典,系统还原段。可以存放用户数据但是不建议。<br style="background-color:inherit">            非系统表空间NON-SYSTEM表空间 由管理员创建。可以方便管理。<br style="background-color:inherit">    3.3 实例的整体架构<br style="background-color:inherit">        实例整体架构图:<br style="background-color:inherit">                  ┌──────────────────────────────┐<br style="background-color:inherit">                  │ Instance │<br style="background-color:inherit">                  │ ┌──────────────────────────┐ │<br style="background-color:inherit">                  │ │ ┌────────┐ SGA │ │<br style="background-color:inherit">                  │ │ │ Shared Pool │ │ │<br style="background-color:inherit">                  │ │ │ ┌─────┐ │ ┌────┐ ┌────┐ │ │<br style="background-color:inherit">                  │ │ │ │Library │ │ │Database│ │ Redo │ │ │<br style="background-color:inherit">                  │ │ │ │ Cache │ │ │Buffer │ │ Log │ │ │<br style="background-color:inherit">                  │ │ │ └─────┘ │ │Cache │ │ Buffer │ │ │<br style="background-color:inherit">                  │ │ │ ┌─────┐ │ │ │ │ │ │ │<br style="background-color:inherit">                  │ │ │ │Data Dict │ │ └────┘ └────┘ │ │<br style="background-color:inherit">                  │ │ │ │ Cache │ │ │ │<br style="background-color:inherit">                  │ │ │ └─────┘ │ │ │<br style="background-color:inherit">                  │ │ └────────┘ │ │<br style="background-color:inherit">                  │ └──────────────────────────┘ │<br style="background-color:inherit">                  │ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌───┐│<br style="background-color:inherit">    │ │PMON│ │SNON│ │DBWR│ │LGWR│ │CHPT│ │OTHERS││<br style="background-color:inherit">                  │ └──┘ └──┘ └──┘ └──┘ └──┘ └───┘│<br style="background-color:inherit">                  └──────────────────────────────┘<br style="background-color:inherit">        实例由内存和后台进程组成,它暂时存在于RAM和CPU中。当关闭运行的实例时,实例将随即消失。数据库由磁盘上的物理文件组成,不管在运行状态还是停止状态,这些文件就一直存在。因此,实例的生命周期就是其在内存中存在的时间,可以启动和停止。一旦创建数据库,数据库将永久存在。通俗的讲数据库就相当于平时安装某个程序所生成的安装目录,而实例就是运行某个程序时所需要的进程及消耗的内存。<br style="background-color:inherit">        Oracle的内存架构包含两部分系统全局区(SGA)和程序全局区(PGA)。<br style="background-color:inherit">        3.3.1 程序全局区<br style="background-color:inherit">        3.3.2 系统全局区<br style="background-color:inherit">            在操作系统提供的共享内存段实现的内存结构称为系统全局区(SGA)。SGA在实例启动时分配,在关闭时释放。在一定范围内,可以在实例运行时通过自动方式或响应DBA的指令,重新调整11g实例中的SGA及其中的组件的大小。<br style="background-color:inherit">            由上图可知SGA至少包含三种数据结构:数据库缓冲区缓存、日志缓冲区及共享池。还可能包括:大池、JAVA池。可以使用show sga,查看sga的状态。<br style="background-color:inherit">            1、共享池<br style="background-color:inherit">                 a.库缓存是内存区域,按其已分析的格式存储最近执行的代码。分析就是将编程人员编写的代码转换为可执行的代码,这是oracle根据需要执行的一个过程。通过将代码缓存在共享池,可以在不重新分析的情况下重用,极大地提高性能。<br style="background-color:inherit">                 b.数据字典缓存有时称为“行缓存”,它存储最近使用的对象定义:表、索引、用户和其他元数据定义的描述。<br style="background-color:inherit">                 c.PL/SQL区:存储的PL/SQL对象是过程、函数、打包的过程、打包的函数、对象类型定义和触发器。<br style="background-color:inherit">            2、数据库缓冲区<br style="background-color:inherit">                 数据库缓冲区是oracle用来执行SQL的工作区域。<br style="background-color:inherit">            3、日志缓冲区<br style="background-color:inherit">                 日志缓冲区是小型的、用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域。日志缓冲区在启动实例时分配,如果不重新启动实例,就不能在随后调整其大小。<br style="background-color:inherit">  后台进程有:<br style="background-color:inherit">   1、PMON-----程序监控器<br style="background-color:inherit">   2、SMON-----系统监控区<br style="background-color:inherit">   3、DBWR-----数据写进程<br style="background-color:inherit">   4、LGWR-----日志写进程<br style="background-color:inherit">   5、CKPT-----检查点进程<br style="background-color:inherit">   6、Others---归档进程<br style="background-color:inherit"> 四、SQL语法基础(DDL、DCL、TCL、DML)<br style="background-color:inherit">   SQL 全名是结构化查询语言(Structured Query Language),是用于数据库中的标准数据查询语言,IBM 公司最早使用在其开发的数据库系统中。1986 年 10 月,美国 ANSI 对 SQL 进行规范后,以此作为关系式数据库管理系统的标准语言 (ANSI X3. 135-1986),1987 年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对 SQL 规范作了某些编改和扩充。所以,实际上不同数据库系统之间的 SQL 语言不能完全相互通用<br style="background-color:inherit">         DML 语句(数据操作语言)Insert、Update、 Delete、Select<br style="background-color:inherit">         DDL 语句(数据定义语言)Create、Alter、 Drop<br style="background-color:inherit">         DCL 语句(数据控制语言)Grant、Revoke<br style="background-color:inherit">         TCL 事务控制语句 Commit 、Rollback、Savepoint<br style="background-color:inherit">   4.1 入门语句<br style="background-color:inherit">       普通用户连接: Conn scott/tiger<br style="background-color:inherit">       超级管理员连接: Conn “sys/bluesot as sysdba”<br style="background-color:inherit">       Disconnect; 断开连接-------------disc<br style="background-color:inherit">       Save c:\1.txt 把 SQL 存到文件<br style="background-color:inherit">       Ed c:\1.txt 编辑 SQL 语句<br style="background-color:inherit">       @ c:\1.txt 运行 SQL 语句<br style="background-color:inherit">       Desc emp; 描述 Emp 结构<br style="background-color:inherit">       Select * from tab; 查看该用户下的所有对象<br style="background-color:inherit">       Show user; 显示当前用户<br style="background-color:inherit">       如果在 sys 用户下: 查询 Select * from emp; 会报错,原因:emp 是属于 scott,所以此时必须使用:select * from scott.emp; / 运行上一条语句<br style="background-color:inherit">   4.2 DDL(数据定义语言)----改变表结构<br style="background-color:inherit">      4.2.1 创建表<br style="background-color:inherit">         CREATE TABLE name (<br style="background-color:inherit">           tid VARCHAR2(5),<br style="background-color:inherit">           tname VARCHAR2(20),<br style="background-color:inherit">           tdate DATE,<br style="background-color:inherit">           as VARCHAR(7,2)<br style="background-color:inherit">         );<br style="background-color:inherit">      4.2.2 添加一列<br style="background-color:inherit">          ALTER TABLE 表名 ADD 列名 属性;<br style="background-color:inherit">          ALTER TABLE student ADD age number(5);<br style="background-color:inherit">      4.2.4 删除一列<br style="background-color:inherit">          ALTER TABLE table_name DROP COLUMN column_name;<br style="background-color:inherit">          ALTER TABLE student DROP COLUMN age;<br style="background-color:inherit">      4.2.5 修改一列的属性<br style="background-color:inherit">          ALTER TABLE table_name MODIFY column_name type;<br style="background-color:inherit">          修改列名<br style="background-color:inherit">          ALTER TABLE table_name RENAME COLUMN columnname TO newname;<br style="background-color:inherit">          修改表名<br style="background-color:inherit">          ALTER TABLE table_name RENAME TO newname;<br style="background-color:inherit">      4.2.6 查看表中数据<br style="background-color:inherit">          DESC table_name;<br style="background-color:inherit">      4.2.7 删除表<br style="background-color:inherit">          DROP TABLE table_name;<br style="background-color:inherit">    4.3 DCL(数据控制语言)<br style="background-color:inherit">      4.3.1 授权<br style="background-color:inherit">         GRANT 权限/角色 TO 用户<br style="background-color:inherit">         给 demo 用户以创建 session 的权限:GRANT create session TO demo;<br style="background-color:inherit">         角色:-------------角色就是一堆权限的集合Create role myrole;<br style="background-color:inherit">         Grant create table to myrole;<br style="background-color:inherit">         Drop role myrole; 删除角色<br style="background-color:inherit">          1.CONNECT, RESOURCE, DBA<br style="background-color:inherit">          这些预定义角色主要是为了向后兼容。其主要是用于数据库管理。oracle建议用户自己设计数据库管理和安全的权限规划,而不要简单的使用这些预定角色。将来的版本中这些角色可能不会作为预定义角色。<br style="background-color:inherit">          2.DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE, SELECT_CATALOG_ROLE 这些角色主要用于访问数据字典视图和包。<br style="background-color:inherit">          3.EXP_FULL_DATABASE, IMP_FULL_DATABASE 这两个角色用于数据导入导出工具的使用。<br style="background-color:inherit">           GRANT 权限(select、update、insert、delete) ON schema.table TO 用户<br style="background-color:inherit">            |- GRANT select ON scott.emp TO test ;<br style="background-color:inherit">            |- Grant all on scott.emp to test; --将表相关的所有权限付给 test<br style="background-color:inherit">            |- Grant update(ename) on emp to test; 可以控制到列(还有 insert)<br style="background-color:inherit">      4.3.2 收权<br style="background-color:inherit">           REVOKE 权限/角色 ON schema.table FROM 用户<br style="background-color:inherit">             |- REVOKE select ON scott.emp FROM test ;<br style="background-color:inherit">     4.4 TCL(事务控制语言)<br style="background-color:inherit">        事务的概念:事务是一系列对数据库操作命令的集合,它有边界(commit---commit)<br style="background-color:inherit">        事务的特征:A ------原子性-----不可分割性-------要么执行要么不执行<br style="background-color:inherit">                    C------一致性-----rollback<br style="background-color:inherit">                    I-------隔离性-----锁的机制来保证的,锁有粒度【表、行】---------只读、修改锁<br style="background-color:inherit">                              上锁---SELECT * FROM DEMO1 FOR UPDATE;<br style="background-color:inherit">                              释放------commit、rollback<br style="background-color:inherit">                    D -----持久性-------commit<br style="background-color:inherit">           系统时间-----sysdate<br style="background-color:inherit">                         to_date(‘2013/11/09’,‘yyyy/mm/dd’)--------修改日期格式<br style="background-color:inherit">         转换函数<br style="background-color:inherit">               1、To_char<br style="background-color:inherit">                       select to_char(sysdate,'yyyy') from dual;<br style="background-color:inherit">                       select to_char(sysdate,'fmyyyy-mm-dd') from dual;<br style="background-color:inherit">                       select to_char(sal,'L999,999,999') from emp;<br style="background-color:inherit">                       select to_char(sysdate,’D’) from dual;//返回星期<br style="background-color:inherit">               2、To_number<br style="background-color:inherit">                       select to_number('13')+to_number('14') from dual;<br style="background-color:inherit">               3、To_date<br style="background-color:inherit">                       Select to_date(‘20090210’,‘yyyyMMdd’) from dual;<br style="background-color:inherit">         4.4.1 ROLLBACK<br style="background-color:inherit">   回滚------回滚到它上面的离它最近的commit<br style="background-color:inherit">  4.4.2 COMMIT<br style="background-color:inherit">   提交-----------将数据缓冲区的数据提交到文件中去<br style="background-color:inherit">  4.4.3 SAVEPOINT------保存点<br style="background-color:inherit">   回滚点例子:<br style="background-color:inherit">   INSERT INTO DEMO1(TID,TNAME) VALUES(11,'AS');<br style="background-color:inherit">   SAVEPOINT P1;<br style="background-color:inherit">   INSERT INTO DEMO1(TID,TNAME) VALUES(22,'AS');<br style="background-color:inherit">   INSERT INTO DEMO1(TID,TNAME) VALUES(33,'AS');<br style="background-color:inherit">   SAVEPOINT P2;<br style="background-color:inherit">   INSERT INTO DEMO1(TID,TNAME) VALUES(44,'AS');<br style="background-color:inherit">   ROLLBACK TO P2;<br style="background-color:inherit">   COMMIT;<br style="background-color:inherit">   INSERT INTO DEMO1(TID,TNAME) VALUES(55,'AS');<br style="background-color:inherit">   ROLLBACK TO P1;----------无法回滚<br style="background-color:inherit">     ------------查询结果:11,22,33 由于55没有提交所以没有写入文件<br style="background-color:inherit">     4.5 DML(数据操作语言)---------改变数据结构<br style="background-color:inherit">  4.5.1 insert 语句<br style="background-color:inherit">   INSERT INTO table_name() VALUES();<br style="background-color:inherit">   INSERT INTO table_name VALUES();<br style="background-color:inherit">       插入空值时,用三种格式<br style="background-color:inherit">   1、INSERT INTO demo VALUES('');<br style="background-color:inherit">   2、INSERT INTO demo VALUES(' ');<br style="background-color:inherit">   3、INSERT INTO demo VALUES(NULL);<br style="background-color:inherit">   INSERT INTO demo(tid,tname,tdate) VALUES(1,null,sysdate);<br style="background-color:inherit">   INSERT INTO demo(tid,tname,tdate) VALUES(1,'',to_date(sysdate,'yyyy-mm-dd'));<br style="background-color:inherit">   INSERT INTO demo VALUES(1,'',to_date('2013/11/11','yyyy/mm/dd'));<br style="background-color:inherit">  <br style="background-color:inherit">   注意:<br style="background-color:inherit">   1、字符串类型的字段值必须用单引号括起来,如:‘rain’;<br style="background-color:inherit">   2、如果字段值里包含单引号需要进行字符串转换,把它替换成两个单引号‘’,如:‘''c''' 数据库中将插入‘c’;<br style="background-color:inherit">   3、字符串类型的字段值超过定义长度会报错,最好在插入前进行长度校验;<br style="background-color:inherit">   4、日期字段的字段值可以使用当前数据库的系统时间sysdate,精确到秒;<br style="background-color:inherit">   5、INSERT时如果要用到从1开始自动增长的序列号,应该先建立一个序列号。<br style="background-color:inherit">  <br style="background-color:inherit">  4.5.2 update 语句<br style="background-color:inherit">   UPDATE table_name SET column_name=值 WHERE 查询条件<br style="background-color:inherit">   UPDATE demo SET tname='张三' WHERE tid=1;<br style="background-color:inherit">   COMMIT;------是更新生效<br style="background-color:inherit">  4.5.3 delete 语句-----不能回退<br style="background-color:inherit">   DELETE TABLE table_name;--------------只能删除数据,不能释放空间<br style="background-color:inherit">   TRUNCATE TABLE table_name;---------------删除数据并释放空间<br style="background-color:inherit">   DELETE TABLE demo;<br style="background-color:inherit">   TRUNCATE TABLE demo;<br style="background-color:inherit">   4.5.4 select 语句<br style="background-color:inherit">   A 、简单的 Select 语句<br style="background-color:inherit">   SELECT * FROM table_name;<br style="background-color:inherit">   SELECT * FROM demo;<br style="background-color:inherit">   B、空值 is null<br style="background-color:inherit">   SELECT * FROM demo where tname is null;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 第五章 Select查询<br style="background-color:inherit"> 结构: 执行顺序<br style="background-color:inherit"> SELECT * 5<br style="background-color:inherit">        FROM table_name 1<br style="background-color:inherit">             WHERE -----分组前的条件 2<br style="background-color:inherit">    GROUP BY 3<br style="background-color:inherit"> HAVING -----分组后的条件 4<br style="background-color:inherit">                            ORDER BY column_name ASC/DESC; 6<br style="background-color:inherit"> -----------------------------<br style="background-color:inherit"> 子句、聚合函数、友好列 列名 AS 别名<br style="background-color:inherit"> -----------------------------<br style="background-color:inherit"> 5.1 简单查询<br style="background-color:inherit"> 5.1.1 查看表结构<br style="background-color:inherit"> DESC table_name;<br style="background-color:inherit"> DESC emp;<br style="background-color:inherit">  <br style="background-color:inherit"> 5.1.2查看所有的列<br style="background-color:inherit"> SELECT * FROM table_name;<br style="background-color:inherit"> SELECT * FROM emp;<br style="background-color:inherit">  <br style="background-color:inherit"> 5.1.3 查看指定列<br style="background-color:inherit"> SELECT 列名 FROM table_name;<br style="background-color:inherit"> SELECT empno FROM emp;<br style="background-color:inherit"> 5.1.4 查看指定行<br style="background-color:inherit"> SELECT * FROM table_name WHERE column_name=值;<br style="background-color:inherit"> SELECT * FROM emp WHERE empno=7369;<br style="background-color:inherit"> 5.1.5 使用算术表达式 + 、- 、/ 、*<br style="background-color:inherit"> SELECT ename,sal+1 FROM EMP;<br style="background-color:inherit"> ENAME SAL+1<br style="background-color:inherit"> ---------- ----------<br style="background-color:inherit"> SMITH 801<br style="background-color:inherit"> ALLEN 1601<br style="background-color:inherit"> WARD 1251<br style="background-color:inherit"> SELECT ename,sal-2 FROM EMP;<br style="background-color:inherit"> ENAME SAL-1<br style="background-color:inherit"> ---------- ----------<br style="background-color:inherit"> SMITH 799<br style="background-color:inherit"> ALLEN 1599<br style="background-color:inherit"> WARD 1249<br style="background-color:inherit"> SELECT ename,sal*2 FROM EMP;<br style="background-color:inherit"> ENAME SAL*2<br style="background-color:inherit"> ---------- ----------<br style="background-color:inherit"> SMITH 1600<br style="background-color:inherit"> ALLEN 3200<br style="background-color:inherit"> WARD 2500<br style="background-color:inherit"> SELECT ename,sal/2 FROM EMP;<br style="background-color:inherit"> ENAME SAL/2<br style="background-color:inherit"> ---------- ----------<br style="background-color:inherit"> SMITH 400<br style="background-color:inherit"> ALLEN 800<br style="background-color:inherit"> WARD 625<br style="background-color:inherit"> nvl(comm,0)的意思是,如果comm中有值,则nvl(comm,0)=comm; comm中无值,则nvl(comm,0)=0<br style="background-color:inherit"> 5.1.3 连接运算符 ||<br style="background-color:inherit"> SELECT 'how'||'do' ||sno;<br style="background-color:inherit"> 5.1.4 使用字段别名 AS<br style="background-color:inherit"> SELECT * FROM DEMO1 "Asd";-------带引号可以保证输入的结果有大小写<br style="background-color:inherit"> SELECT * FROM DEMO1 asd;<br style="background-color:inherit"> 5.1.5 空值 IS NULL、 IS NOT NULL<br style="background-color:inherit"> SQL>SELECT * FROM EMP WHERE COMM IS NOT NULL AND SAL IN(SELECT ENAME,sal FROM emp WHERE ENAME LIKE '_O%') ;<br style="background-color:inherit"> 5.1.6 去除重复行 DISTINCT<br style="background-color:inherit"> SQL>SELECT DISTINCT DEPTNO FROM EMP ORDER BY DEPTNO<br style="background-color:inherit"> SQL>SELECT DEPTNO FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO<br style="background-color:inherit"> 5.1.7 查询结果排序 ORDER BY ASC/DESC<br style="background-color:inherit"> 逆序:<br style="background-color:inherit"> SQL> SELECT * FROM emp WHERE job='CLERK' OR ename='MILLER' ORDER BY SAL DESC;<br style="background-color:inherit"> 顺序:<br style="background-color:inherit"> SQL> SELECT * FROM emp WHERE job='CLERK' OR ename='MILLER' ORDER BY SAL ASC;<br style="background-color:inherit"> SQL> SELECT * FROM emp WHERE job='CLERK' OR ename='MILLER' ORDER BY SAL ;<br style="background-color:inherit"> 5.1.8 关系运算符 >、 < 、=、(!= or <>) MOD(模,类似于%)、BETWEEN AND、 NOT BETWEEN AND<br style="background-color:inherit"> SQL> SELECT DISTINCT MGR FROM emp WHERE MGR<>7788;<br style="background-color:inherit"> SQL>SELECT DISTINCT MGR FROM emp WHERE MGR BETWEEN 7788 AND 7902;<br style="background-color:inherit"> SQL>SELECT * FROM emp WHERE MOD(DEPTNO,100)=2;<br style="background-color:inherit"> SQL>SELECT * FROM EMP1 WHERE EMPNO NOT BETWEEN 7369 AND 7521;<br style="background-color:inherit"> SQL>SELECT * FROM EMP1 WHERE EMPNO>=7369 AND EMPNO<=7521;<br style="background-color:inherit"> 5.1.9 操作 IN、NOT IN<br style="background-color:inherit"> SQL> SELECT ENAME,SAL FROM EMP WHERE SAL IN(SELECT MAX(SAL) FROM EMP1 GROUP BY DEPTNO);<br style="background-color:inherit"> 5.1.10 模糊查询 LIKE、NOT LIKE----只针对字符型<br style="background-color:inherit"> % 表示零或多个字符<br style="background-color:inherit"> _ 表示一个字符<br style="background-color:inherit"> 对于特殊符号可使用ESCAPE 标识符来查找<br style="background-color:inherit"> select * from emp where ename like '%*_%' escape '*'<br style="background-color:inherit"> 上面的escape表示*后面的那个符号不当成特殊字符处理,就是查找普通的_符号<br style="background-color:inherit"> 5.1.11 逻辑运算符 AND、OR、NOT<br style="background-color:inherit"> SQL> select * from emp where job='CLERK' OR ename='MILLER';<br style="background-color:inherit"> SQL> select * from emp where job='CLERK' AND ename='MILLER';<br style="background-color:inherit"> 5.1.12 ANY、ALL<br style="background-color:inherit"> SQL>SELECT * FROM EMP WHERE EMPNO IN(7369,7521,7782);<br style="background-color:inherit"> SQL>SELECT * FROM EMP WHERE EMPNO>ANY(7369,7521,7782);--大于min<br style="background-color:inherit"> SQL>SELECT * FROM EMP WHERE EMPNO>ALL(7369,7521,7782);--大于max<br style="background-color:inherit"> SQL>SELECT * FROM EMP WHERE EMPNO<ANY(7369,7521,7782);--小于max<br style="background-color:inherit"> SQL>SELECT * FROM EMP WHERE EMPNO<ALL(7369,7521,7782);--小于min<br style="background-color:inherit"> 5.1.13 练习<br style="background-color:inherit"> 1、选择在部门30中员工的所有信息<br style="background-color:inherit"> Select * from emp where deptno=30;<br style="background-color:inherit"> 2、列出职位为(MANAGER)的员工的编号,姓名<br style="background-color:inherit"> Select empno,ename from emp where job ="Manager";<br style="background-color:inherit"> 3、找出奖金高于工资的员工<br style="background-color:inherit"> Select * from emp where comm>sal;<br style="background-color:inherit"> 4、找出每个员工奖金和工资的总和<br style="background-color:inherit"> Select sal+comm,ename from emp;<br style="background-color:inherit"> 5、找出部门10中的经理(MANAGER)和部门20中的普通员工(CLERK)<br style="background-color:inherit"> Select * from emp where (deptno=10 and job=?MANAGER?) or (deptno=20 and job=?CLERK?);<br style="background-color:inherit"> 6、找出部门10中既不是经理也不是普通员工,而且工资大于等于2000的员工<br style="background-color:inherit"> Select * from emp where deptno=10 and job not in('MANAGER') and sal>=2000;<br style="background-color:inherit"> 7、找出有奖金的员工的不同工作<br style="background-color:inherit"> Select distinct job from emp where comm is not null and comm>0;<br style="background-color:inherit"> 8、找出没有奖金或者奖金低于500的员工<br style="background-color:inherit"> Select * from emp where comm<500 or comm is null;<br style="background-color:inherit"> 9、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面<br style="background-color:inherit"> select ename from emp order by hiredate ;<br style="background-color:inherit"> 10、SQL>SELECT DEPTNO,MAX(SAL) AS tot,<br style="background-color:inherit">                MIN(COMM) AS MCOMM,<br style="background-color:inherit">                SUM(COMM) SUMC,<br style="background-color:inherit">                TRUNC(AVG(SAL+NVL(COMM,0)))TAVG,<br style="background-color:inherit">                ROUND(AVG(SAL+NVL(COMM,0)),2)RAVG,<br style="background-color:inherit">                COUNT(*)<br style="background-color:inherit">        FROM EMP<br style="background-color:inherit">             HAVING COUNT(*)>3<br style="background-color:inherit">                   GROUP BY DEPTNO<br style="background-color:inherit">                         ORDER BY DEPTNO<br style="background-color:inherit">            <br style="background-color:inherit">             11、SQL>SELECT ENAME,SAL<br style="background-color:inherit">                 FROM EMP<br style="background-color:inherit">                          WHERE SAL IN(SELECT MAX(SAL)<br style="background-color:inherit">                                FROM EMP1<br style="background-color:inherit">                                             GROUP BY DEPTNO);<br style="background-color:inherit"> 5.2 多表查询<br style="background-color:inherit"> INNER JOIN:内连接<br style="background-color:inherit"> JOIN: 如果表中有至少一个匹配,则返回行<br style="background-color:inherit"> LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行<br style="background-color:inherit"> RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行<br style="background-color:inherit"> FULL JOIN: 只要其中一个表中存在匹配,就返回行<br style="background-color:inherit"> 5.2.1、笛卡尔集(Cross Join)------------列相加,行相乘<br style="background-color:inherit"> Select * from emp,dept;<br style="background-color:inherit"> 5.2.2、等值连接(Equijoin)(Natural join..on)---------隐式内联<br style="background-color:inherit"> select empno, ename, sal, emp.deptno, dname from emp, dept where emp.deptno = dept.deptno;<br style="background-color:inherit"> 5.2.3、非等值连接(Non-Equijoin)<br style="background-color:inherit"> select ename,empno,grade from emp,salgrade where sal between losal and hisal;<br style="background-color:inherit"> 5.2.4、自联接(Self join)<br style="background-color:inherit"> select column_name from table_name1,table_name2 where 条件;<br style="background-color:inherit"> select e.empno,e.ename,m.empno,m.ename from emp e,emp m where m.mgr = e.empno;<br style="background-color:inherit"> 5.2.5、内联接(Inner Join)----------显式外联<br style="background-color:inherit"> SELECT column_name(s)<br style="background-color:inherit"> FROM table_name1<br style="background-color:inherit"> INNER JOIN table_name2<br style="background-color:inherit"> ON table_name1.column_name=table_name2.column_name<br style="background-color:inherit"> 5.2.6、 左外联接(Left Outer Join )<br style="background-color:inherit"> 左外连接:在内联接的基础上,增加左表中没有匹配的行,也就是说,左表中的记录总会出现在最终结果集中<br style="background-color:inherit"> SELECT column_name(s)<br style="background-color:inherit"> FROM table_name1<br style="background-color:inherit"> LEFT JOIN table_name2<br style="background-color:inherit"> ON table_name1.column_name=table_name2.column_name<br style="background-color:inherit"> select s.sid,s.sname,s1.sid,s1.sname from student s,student1 s1 where s.sid=s1.sid(+);<br style="background-color:inherit"> 1、先通过from自句判断左表和右表;<br style="background-color:inherit"> 2、接着看加号作用在那个表别名上;<br style="background-color:inherit"> 3、如果作用在右表上,则为左外连接,否则为右外连接<br style="background-color:inherit"> select empno,ename,dname from emp left outer join dept on emp.deptno = dept.deptno;<br style="background-color:inherit"> 5.2.7、右外联接(Right Outer Join)<br style="background-color:inherit"> 右外连接:在内联接的基础上,增加右表中没有匹配的行,也就是说,右表中的记录总会出现在最终结果集中<br style="background-color:inherit"> SELECT column_name(s)<br style="background-color:inherit"> FROM table_name1<br style="background-color:inherit"> RIGHT JOIN table_name2<br style="background-color:inherit"> ON table_name1.column_name=table_name2.column_name<br style="background-color:inherit"> 右外联接转换为内联接<br style="background-color:inherit"> SELECT column_name(s)<br style="background-color:inherit"> FROM table_name1<br style="background-color:inherit"> RIGHT JOIN table_name2<br style="background-color:inherit"> ON table_name1.column_name=table_name2.column_name WHERE table_name1.column_name is not null;<br style="background-color:inherit"> select s.sid,s.sname,s1.sid,s1.sname from student s,student1 s1 where s.sid(+)=s1.sid;<br style="background-color:inherit"> select empno,ename,dname from emp right outer join dept on emp.deptno= dept.deptno;<br style="background-color:inherit"> select * from emp1 e right join dept d on e.deptno=d.deptno where e.deptno is not null;<br style="background-color:inherit"> 5.2.8、全外联接(Full Outer Join)<br style="background-color:inherit"> SELECT column_name(s)<br style="background-color:inherit"> FROM table_name1<br style="background-color:inherit"> FULL JOIN table_name2<br style="background-color:inherit"> ON table_name1.column_name=table_name2.column_name<br style="background-color:inherit"> select empno,ename,dname from emp full outer join dept on emp.deptno = dept.deptno;<br style="background-color:inherit"> 5.2.9、集合操作<br style="background-color:inherit">  · UNION:并集,所有的内容都查询,重复的显示一次<br style="background-color:inherit">   ·UNION ALL:并集,所有的内容都显示,包括重复的<br style="background-color:inherit">  · INTERSECT:交集:只显示重复的<br style="background-color:inherit">  · MINUS:差集:只显示对方没有的(跟顺序是有关系的)<br style="background-color:inherit"> SELECT column_name(s) FROM table_name1<br style="background-color:inherit"> UNION/INTERSECT/MINUS<br style="background-color:inherit"> SELECT column_name(s) FROM table_name2<br style="background-color:inherit"> 首先建立一张只包含 20 部门员工信息的表:<br style="background-color:inherit">  CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20 ;<br style="background-color:inherit"> 1、验证 UNION 及 UNION ALL<br style="background-color:inherit">  UNION:SELECT * FROM emp UNION SELECT * FROM emp20 ;<br style="background-color:inherit">  使用此语句重复的内容不再显示了<br style="background-color:inherit">  UNION ALL:SELECT * FROM emp UNION ALL SELECT * FROM emp20 ;<br style="background-color:inherit">  重复的内容依然显示<br style="background-color:inherit"> 2、验证 INTERSECT<br style="background-color:inherit">  SELECT * FROM emp INTERSECT SELECT * FROM emp20 ; 只显示了两个表中彼此重复的记录。<br style="background-color:inherit">  <br style="background-color:inherit"> MINUS:返回差异的记录<br style="background-color:inherit">  SELECT * FROM emp MINUS SELECT * FROM emp20 ; 只显示了两张表中的不同记录满链接也可以用以下的方式来表示:<br style="background-color:inherit"> select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+) union<br style="background-color:inherit"> select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id<br style="background-color:inherit"> 5.3 子查询<br style="background-color:inherit"> 5.3.1、单行子查询<br style="background-color:inherit"> select * from emp<br style="background-color:inherit"> where sal > (select sal from emp where empno = 7566);<br style="background-color:inherit"> 5.3.2、 子查询空值/多值问题<br style="background-color:inherit"> 如果子查询未返回任何行,则主查询也不会返回任何结果<br style="background-color:inherit"> (空值)select * from emp where sal > (select sal from emp where empno = 8888);<br style="background-color:inherit"> 如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比较运算符<br style="background-color:inherit"> (正常)select * from emp where sal > (select sal from emp where empno = 7566);<br style="background-color:inherit"> 如果子查询返回多行结果,则为多行子查询,此时不允许对其使用单行记录比较运算符<br style="background-color:inherit"> (多值)select * from emp where sal > (select avg(sal) from emp group by deptno);//非法----错误的<br style="background-color:inherit">  <br style="background-color:inherit"> 5.3.3、 多行子查询<br style="background-color:inherit"> select * from emp where sal > any(select avg(sal) from emp group by deptno);<br style="background-color:inherit"> select * from emp where sal > all(select avg(sal) from emp group by deptno);<br style="background-color:inherit"> select * from emp where job in (select job from emp where ename = 'MARTIN' or ename = 'SMITH');<br style="background-color:inherit"> 5.3.4、 分页查询<br style="background-color:inherit"> Oracle分页<br style="background-color:inherit"> ①采用rownum关键字(三层嵌套)<br style="background-color:inherit"> SELECT * FROM(<br style="background-color:inherit">   SELECT A.*,ROWNUM num FROM (<br style="background-color:inherit"> SELECT * FROM t_order)A<br style="background-color:inherit"> WHERE ROWNUM<=15)<br style="background-color:inherit"> WHERE num>=5; --返回第5-15行数据<br style="background-color:inherit"> ②采用row_number解析函数进行分页(效率更高)<br style="background-color:inherit"> SELECT xx.* FROM(<br style="background-color:inherit"> SELECT t.*,row_number() over(ORDER BY o_id)AS num<br style="background-color:inherit"> FROM t_order t<br style="background-color:inherit"> )xx<br style="background-color:inherit"> WHERE num BETWEEN 5 AND 15;<br style="background-color:inherit"> ROWID和ROWNUM的区别<br style="background-color:inherit"> 1、ROWID是物理地址,用于定位ORACLE中具体数据的物理存储位置是唯一的18位物理编号,而ROWNUM则是根据sql查询后得到的结果自动加上去的<br style="background-color:inherit"> 2、ROWNUM是暂时的并且总是从1开始排起,而ROWID是永久的。<br style="background-color:inherit"> 解析函数能用格式<br style="background-color:inherit"> 函数() over(pertion by 字段 order by 字段);<br style="background-color:inherit"> ROW_NUMBER(): Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序),因为row_number()是分析函数而rownum是伪列所以row_number()一定要over而rownum不能over。<br style="background-color:inherit"> RANK():Rank函数返回一个唯一的值,除非遇到相同的数据,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)。<br style="background-color:inherit"> DENSE_RANK():Dense_rank函数返回一个唯一的值,除非当碰到相同数据,此时所有相同数据的排名都是一样的。<br style="background-color:inherit"> dense_rank()是连续排序,有两个第二名时仍然跟着第三名。他和row_number的区别在于row_number是没有重复值的。<br style="background-color:inherit"> dense_rank()是连续排序,有两个第二名时仍然跟着第三名。他和row_number的区别在于row_number是没有重复值的。<br style="background-color:inherit">  下面举个例子:<br style="background-color:inherit"> SQL> select * from user_order order by customer_sales;<br style="background-color:inherit">  REGION_ID CUSTOMER_ID CUSTOMER_SALES<br style="background-color:inherit"> ---------- ----------- --------------<br style="background-color:inherit">         10 30 1216858<br style="background-color:inherit">          5 2 1224992<br style="background-color:inherit">          9 24 1224992<br style="background-color:inherit">          9 23 1224992<br style="background-color:inherit">          8 18 1253840<br style="background-color:inherit"> 【3】row_number()、rank()、dense_rank()这三个分析函数的区别实例<br style="background-color:inherit"> SQL>SELECT empno, deptno, SUM(sal) total,<br style="background-color:inherit">            RANK() OVER(ORDER BY SUM(sal) DESC) RANK,<br style="background-color:inherit">            dense_rank() OVER(ORDER BY SUM(sal) DESC)dense_rank,<br style="background-color:inherit">            row_number() OVER(ORDER BY SUM(sal) DESC)row_number<br style="background-color:inherit"> FROM emp1 GROUP BY empno, deptno;<br style="background-color:inherit"> --------------------------------------------------<br style="background-color:inherit"> 1 7839 10 5000 1 1 1<br style="background-color:inherit"> 2 7902 20 3000 2 2 2<br style="background-color:inherit"> 3 7788 20 3000 2 2 3<br style="background-color:inherit"> 4 7566 20 2975 4 3 4<br style="background-color:inherit"> 5 7698 30 2850 5 4 5<br style="background-color:inherit"> 6 7782 10 2450 6 5 6<br style="background-color:inherit"> 7 7499 30 1600 7 6 7<br style="background-color:inherit"> 比较上面3种不同的策略,我们在选择的时候就要根据客户的需求来定夺了:<br style="background-color:inherit"> ①假如客户就只需要指定数目的记录,那么采用row_number是最简单的,但有漏掉的记录的危险<br style="background-color:inherit"> ②假如客户需要所有达到排名水平的记录,那么采用rank或dense_rank是不错的选择。至于选择哪一种则看客户的需要,选择dense_rank或得到最大的记录<br style="background-color:inherit"> Mysql分页采用limt关键字<br style="background-color:inherit"> select * from t_order limit 5,10; #返回第6-15行数据<br style="background-color:inherit"> select * from t_order limit 5; #返回前5行<br style="background-color:inherit"> select * from t_order limit 0,5; #返回前5行<br style="background-color:inherit"> Mssql 2000分页采用top关键字(20005以上版本也支持关键字rownum)<br style="background-color:inherit"> Select top 10 * from t_order where id not in (select id from t_order where id>5 ); //返回第6到15行数据其中10表示取10记录 5表示从第5条记录开始取<br style="background-color:inherit"> sql server 分页采用top关键字<br style="background-color:inherit"> 5.3.5、 in 、exists<br style="background-color:inherit"> EXISTS 的执行流程<br style="background-color:inherit"> select * from t1 where exists ( select null from t2 where y = x )<br style="background-color:inherit"> 可以理解为:<br style="background-color:inherit">   for x in ( select * from t1 ) loop<br style="background-color:inherit">  if ( exists ( select null from t2 where y = x.x ) then<br style="background-color:inherit">         OUTPUT THE RECORD<br style="background-color:inherit">  end if;<br style="background-color:inherit">  end loop;<br style="background-color:inherit"> 对于 in 和 exists 的性能区别:<br style="background-color:inherit">   如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用 in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用 exists。<br style="background-color:inherit">   其实我们区分 in 和 exists 主要是造成了驱动顺序的改变(这是性能变化的关键),如果是 exists,那么以外层表为驱动表,先被访问,如果是 IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 另外 IN 是不对 NULL 进行处理<br style="background-color:inherit"> 如:<br style="background-color:inherit"> select 1 from dual where not in (0,1,2,null) 为空<br style="background-color:inherit"> 第六章 约束<br style="background-color:inherit"> 约束就是指对插入数据的各种限制,例如:人员的姓名不能为空,人的年龄只能在0~150 岁之间。约束可以对数据库中的数据进行保护。 约束可以在建表的时候直接声明,也可以为已建好的表添加约束。<br style="background-color:inherit">  <br style="background-color:inherit"> 6.1、NOT NULL:非空约束 例如:姓名不能为空<br style="background-color:inherit"> CREATE TABLE person(<br style="background-color:inherit"> pid NUMBER ,<br style="background-color:inherit"> name VARCHAR2(30) NOT NULL<br style="background-color:inherit"> ) ;<br style="background-color:inherit">  <br style="background-color:inherit"> alter table emp<br style="background-color:inherit"> -- 插入数据<br style="background-color:inherit"> INSERT INTO person(pid,name) VALUES (11,'张三');<br style="background-color:inherit"> -- 错误的数据,会受到约束限制,无法插入<br style="background-color:inherit"> INSERT INTO person(pid) VALUES (12);<br style="background-color:inherit">  <br style="background-color:inherit"> 6.2、 PRIMARY KEY:主键约束<br style="background-color:inherit">  · 不能重复,不能为空 · 例如:身份证号不能为空。 现在假设pid字段不能为空,且不能重复。<br style="background-color:inherit"> DROP TABLE person ;<br style="background-color:inherit"> CREATE TABLE person<br style="background-color:inherit"> (<br style="background-color:inherit">  pid NUMBER PRIMARY KEY , name VARCHAR(30) NOT NULL<br style="background-color:inherit"> ) ;<br style="background-color:inherit"> -- 插入数据<br style="background-color:inherit"> INSERT INTO person(pid,name) VALUES (11,'张三');<br style="background-color:inherit"> -- 主键重复了<br style="background-color:inherit"> INSERT INTO person(pid,name) VALUES (11,'李四');<br style="background-color:inherit">  <br style="background-color:inherit"> 6.3、UNIQUE:唯一约束,值不能重复(空值除外) 人员中有电话号码,电话号码不能重复。<br style="background-color:inherit"> DROP TABLE person ;<br style="background-color:inherit"> CREATE TABLE person<br style="background-color:inherit"> (<br style="background-color:inherit">  pid NUMBER PRIMARY KEY NOT NULL , name VARCHAR(30) NOT NULL , tel VARCHAR(50) UNIQUE<br style="background-color:inherit"> ) ;<br style="background-color:inherit"> -- 插入数据<br style="background-color:inherit"> INSERT INTO person(pid,name,tel) VALUES (11,'张三','1234567');<br style="background-color:inherit"> -- 电话重复了<br style="background-color:inherit"> INSERT INTO person(pid,name,tel) VALUES (12,'李四','1234567');<br style="background-color:inherit">  <br style="background-color:inherit"> 6.4、CHECK:条件约束,插入的数据必须满足某些条件<br style="background-color:inherit">  例如:人员有年龄,年龄的取值只能是 0~150 岁之间<br style="background-color:inherit"> DROP TABLE person ;<br style="background-color:inherit"> CREATE TABLE person(<br style="background-color:inherit">    pid NUMBER PRIMARY KEY NOT NULL ,<br style="background-color:inherit">  name VARCHAR2(30) NOT NULL ,<br style="background-color:inherit"> tel VARCHAR2(50) NOT NULL UNIQUE ,<br style="background-color:inherit"> age NUMBER CHECK(age BETWEEN 0 AND 150)<br style="background-color:inherit"> ) ;<br style="background-color:inherit"> -- 插入数据<br style="background-color:inherit"> INSERT INTO person(pid,name,tel,age) VALUES (11,'张三','1234567',30);<br style="background-color:inherit"> -- 年龄的输入错误<br style="background-color:inherit"> INSERT INTO person(pid,name,tel,age) VALUES (12,'李四','2345678',-100);<br style="background-color:inherit">  alter table product<br style="background-color:inherit"> add constriant chk_product_unitprice check(unitprice>0);<br style="background-color:inherit"> 6.5、Foreign Key:外键<br style="background-color:inherit">  例如:有以下一种情况:<br style="background-color:inherit">  · 一个人有很多本书:<br style="background-color:inherit">   |- Person 表<br style="background-color:inherit">   |- Book 表:而且book 中的每一条记录表示一本书的信息,一本书的信息属于一个人<br style="background-color:inherit"> CREATE TABLE book(<br style="background-color:inherit">  bid NUMBER PRIMARY KEY NOT NULL ,<br style="background-color:inherit">  name VARCHAR(50) ,<br style="background-color:inherit">  -- 书应该属于一个人 pid NUMBER<br style="background-color:inherit"> ) ;<br style="background-color:inherit">  如果使用了以上的表直接创建,则插入下面的记录有效:<br style="background-color:inherit"> INSERT INTO book(bid,name,pid) VALUES(1001,'JAVA',12) ;<br style="background-color:inherit">  以上的代码没有任何错误,但是没有任何意义,因为一本书应该属于一个人,所以在此处的pid的取值应该与person 表中的pid一致。<br style="background-color:inherit">  此时就需要外键的支持。修改book 的表结构<br style="background-color:inherit"> DROP TABLE book ;<br style="background-color:inherit"> CREATE TABLE book<br style="background-color:inherit"> (<br style="background-color:inherit">  bid NUMBER PRIMARY KEY NOT NULL , name VARCHAR(50) ,<br style="background-color:inherit">  -- 书应该属于一个人 pid NUMBER REFERENCES person(pid) ON DELETE CASCADE<br style="background-color:inherit">  -- 建立约束:book_pid_fk,与person中的pid 为主-外键关系<br style="background-color:inherit">  --CONSTRAINT book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid)<br style="background-color:inherit"> ) ;<br style="background-color:inherit">  <br style="background-color:inherit"> INSERT INTO book(bid,name,pid) VALUES(1001,'JAVA',12) ;<br style="background-color:inherit"> 6.6、级联删除<br style="background-color:inherit">  此时如果想完成删除person 表的数据同时自动删除掉book 表的数据操作,则必须使用级联删除。<br style="background-color:inherit">  在建立外键的时候必须指定级联删除(ON DELETE CASCADE)。<br style="background-color:inherit"> CREATE TABLE book<br style="background-color:inherit"> (<br style="background-color:inherit">  bid NUMBER PRIMARY KEY NOT NULL , name VARCHAR(50) ,<br style="background-color:inherit">  -- 书应该属于一个人<br style="background-color:inherit">  pid NUMBER ,<br style="background-color:inherit">  -- 建立约束:book_pid_fk,与person中的pid 为主-外键关系<br style="background-color:inherit">  CONSTRAINT book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ON DELETE CASCADE<br style="background-color:inherit"> ) ;<br style="background-color:inherit"> DROP TABLE book ;<br style="background-color:inherit"> DROP TABLE person ;<br style="background-color:inherit"> CREATE TABLE person(<br style="background-color:inherit">       pid NUMBER ,<br style="background-color:inherit">       name VARCHAR(30) NOT NULL ,<br style="background-color:inherit">       tel VARCHAR(50) ,<br style="background-color:inherit">       age NUMBER<br style="background-color:inherit"> ) ;<br style="background-color:inherit"> CREATE TABLE book(<br style="background-color:inherit">       bid NUMBER ,<br style="background-color:inherit">       name VARCHAR2(50) ,<br style="background-color:inherit">       pid NUMBER<br style="background-color:inherit"> ) ;<br style="background-color:inherit">  <br style="background-color:inherit">  以上两张表中没有任何约束,下面使用 alter 命令为表添加约束<br style="background-color:inherit"> ALTER TABLE table_name ADD CONSTRAINT column_name 约束;<br style="background-color:inherit"> 1、 为两个表添加主键:<br style="background-color:inherit">   · person 表 pid 为主键:<br style="background-color:inherit">    ALTER TABLE person ADD CONSTRAINT person_pid_pk PRIMARY KEY(pid) ;<br style="background-color:inherit">   · book 表 bid 为主键:<br style="background-color:inherit">    ALTER TABLE book ADD CONSTRAINT book_bid_pk PRIMARY KEY(bid) ;<br style="background-color:inherit"> 2、 为 person 表中的 tel 添加唯一约束:<br style="background-color:inherit">   ALTER TABLE person ADD CONSTRAINT person_tel_uk UNIQUE(tel) ;<br style="background-color:inherit"> 3、 为 person 表中的 age 添加检查约束:<br style="background-color:inherit">   ALTER TABLE person ADD CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND<br style="background-color:inherit"> 150) ;<br style="background-color:inherit">  4、 为 book 表中的 pid 添加与 person 的主-外键约束,要求带级联删除<br style="background-color:inherit">   ALTER TABLE book ADD CONSTRAINT person_book_pid_fk FOREIGN KEY (pid)<br style="background-color:inherit"> REFERENCES person(pid) ON DELETE CASCADE ;<br style="background-color:inherit">  <br style="background-color:inherit"> Q:如何用alter添加非空约束<br style="background-color:inherit"> A:用 check约束<br style="background-color:inherit"> 6.7、删除约束:<br style="background-color:inherit">  ALTER TABLE book DROP CONSTRAINT person_book_pid_fk ;<br style="background-color:inherit"> alter table student drop unique(tel);<br style="background-color:inherit"> 6.8、 启用约束<br style="background-color:inherit"> ALTER TABLE book enable CONSTRAINT person_book_pid_fk ;<br style="background-color:inherit"> 6.9、 禁用约束<br style="background-color:inherit"> ALTER TABLE book disable CONSTRAINT person_book_pid_fk ;<br style="background-color:inherit"> 第七章 SQL函数<br style="background-color:inherit"> 7.1 单行函数<br style="background-color:inherit"> 1、字符函数<br style="background-color:inherit"> Upper -------大写<br style="background-color:inherit"> SELECT Upper ('abcde') FROM dual ;<br style="background-color:inherit"> SELECT * FROM emp WHERE ename=UPPER('smith') ;<br style="background-color:inherit"> Lower --------小写<br style="background-color:inherit"> SELECT lower('ABCDE') FROM dual ;<br style="background-color:inherit"> Initcap--------首字母大写<br style="background-color:inherit"> Select initcap(ename) from emp;<br style="background-color:inherit"> Concat----联接<br style="background-color:inherit"> Select concat('a','b') from dual;<br style="background-color:inherit"> Select 'a'||'b' from dual;<br style="background-color:inherit"> Substr------截取<br style="background-color:inherit"> Select substr('abcde',length('abcde')-2) from dual;<br style="background-color:inherit"> Select substr('abcde',-3,3) from dual;<br style="background-color:inherit"> Length------长度<br style="background-color:inherit"> Select length(ename) from emp;<br style="background-color:inherit"> Replace------替代<br style="background-color:inherit"> Select replace(ename,'a','A') from emp;<br style="background-color:inherit"> Instr---------- indexof<br style="background-color:inherit"> Select instr('Hello World','or') from dual;<br style="background-color:inherit"> Lpad------------左侧填充 lpad() *****Smith<br style="background-color:inherit"> lpad('Smith',10,'*')<br style="background-color:inherit"> Rpad-------------右侧填充 rpad()Smith*****<br style="background-color:inherit"> rpad('Smith',10,'*')<br style="background-color:inherit"> Trim-------------过滤首尾空格 trim() Mr Smith<br style="background-color:inherit"> trim(' Mr Smith ')<br style="background-color:inherit"> 2、数值函数<br style="background-color:inherit"> Round<br style="background-color:inherit"> select round(412,-2) from dual; --400<br style="background-color:inherit"> select round(412.313,2) from dual;<br style="background-color:inherit"> Mod<br style="background-color:inherit"> select MOD(412,3) from dual;<br style="background-color:inherit"> Trunc<br style="background-color:inherit"> select trunc(412.13,-2) from dual;<br style="background-color:inherit"> 3、日期函数<br style="background-color:inherit"> Months_between()<br style="background-color:inherit"> select months_between(sysdate,hiredate) from emp;<br style="background-color:inherit"> Add_months()<br style="background-color:inherit"> select add_months(sysdate,1) from dual;<br style="background-color:inherit"> Next_day()<br style="background-color:inherit"> select next_day(sysdate,'星期一') from dual;<br style="background-color:inherit"> Last_day<br style="background-color:inherit"> select last_day(sysdate) from dual;<br style="background-color:inherit"> 4.4、转换函数<br style="background-color:inherit"> To_char<br style="background-color:inherit"> select to_char(sysdate,'yyyy') from dual; select to_char(sysdate,'fmyyyy-mm-dd') from dual; select to_char(sal,'L999,999,999') from emp; select to_char(sysdate,’D’) from dual;//返回星期<br style="background-color:inherit"> To_number<br style="background-color:inherit"> select to_number('13')+to_number('14') from dual;<br style="background-color:inherit"> To_date<br style="background-color:inherit"> Select to_date(?20090210?,?yyyyMMdd?) from dual;<br style="background-color:inherit"> 5、通用函数<br style="background-color:inherit"> NVL()函数<br style="background-color:inherit"> select nvl(comm,0) from emp;<br style="background-color:inherit"> NULLIF()函数<br style="background-color:inherit"> 如果表达式 exp1 与 exp2 的值相等则返回 null,否则返回 exp1 的值<br style="background-color:inherit"> NVL2()函数 select empno, ename, sal, comm, nvl2(comm, sal+comm, sal) total from emp;<br style="background-color:inherit"> COALESCE()函数<br style="background-color:inherit"> 依次考察各参数表达式,遇到非 null 值即停止并返回该值。<br style="background-color:inherit"> select empno, ename, sal, comm, coalesce(sal+comm, sal, 0)总收入 from emp;<br style="background-color:inherit"> CASE 表达式------区间<br style="background-color:inherit"> SQL>select empno,<br style="background-color:inherit">           ename,<br style="background-color:inherit">           sal,<br style="background-color:inherit">           case deptno<br style="background-color:inherit"> when 10 then '财务部'<br style="background-color:inherit"> when 20 then '研发部'<br style="background-color:inherit"> when 30 then '销售部'<br style="background-color:inherit"> else '未知部门'<br style="background-color:inherit"> end 部门<br style="background-color:inherit"> from emp;<br style="background-color:inherit"> SQL>SELECT e.*,<br style="background-color:inherit">     CASE<br style="background-color:inherit">         WHEN sal>=3000 THEN '高'<br style="background-color:inherit">         WHEN sal>=2000 AND sal<3000 THEN '中'<br style="background-color:inherit">         WHEN sal<2000 AND sal>0 THEN '高'<br style="background-color:inherit">         ELSE 'un'<br style="background-color:inherit">      END ca<br style="background-color:inherit"> FROM emp1 e;<br style="background-color:inherit"> DECODE()函数------------离散的值<br style="background-color:inherit"> SQL>select empno, ename, sal,<br style="background-color:inherit">     decode(deptno,<br style="background-color:inherit">                                 10, '财务部',<br style="background-color:inherit">                                 20, '研发部',<br style="background-color:inherit">                                 30, '销售部',<br style="background-color:inherit">                                 '未知部门') 部门<br style="background-color:inherit"> from emp;<br style="background-color:inherit">  <br style="background-color:inherit"> 单行函数嵌套<br style="background-color:inherit"> select empno, lpad(initcap(trim(ename)),10,' ') name, job, sal from emp;<br style="background-color:inherit"> 7.2 分组函数<br style="background-color:inherit"> 1、COUNT<br style="background-color:inherit"> 如果数据库表的没有数据,count(*)返回的不是 null,而是 0<br style="background-color:inherit"> 2、Avg,max,min,sum<br style="background-color:inherit"> 3、nvl----分组函数与空值<br style="background-color:inherit"> 分组函数省略列中的空值<br style="background-color:inherit"> select avg(comm) from emp; select sum(comm) from emp;<br style="background-color:inherit"> 可使用 NVL()函数强制分组函数处理空值 select avg(nvl(comm, 0)) from emp;<br style="background-color:inherit"> 4、GROUP BY 子句<br style="background-color:inherit"> 出现在 SELECT 列表中的字段或者出现在 order by 后面的字段,如果不是包含在分组函数中,那么该字段必须同时在 GROUP BY 子句中出现。包含在 GROUP BY 子句中的字段则不必须出现在 SELECT 列表中。<br style="background-color:inherit"> 可使用 where 字句限定查询条件,可使用 Order by 子句指定排序方式<br style="background-color:inherit"> 如果没有 GROUP BY 子句,SELECT 列表中不允许出现字段(单行函数)与分组函数混用的情况。<br style="background-color:inherit"> select empno, sal from emp; //合法 select avg(sal) from emp; //合法 select empno, initcap(ename), avg(sal) from emp; //非法<br style="background-color:inherit">  不允许在 WHERE 子句中使用分组函数。 select deptno, avg(sal) from emp where avg(sal) > 2000; group by deptno;<br style="background-color:inherit"> 5、HAVING 子句<br style="background-color:inherit"> select deptno, job, avg(sal)<br style="background-color:inherit"> from emp<br style="background-color:inherit"> where hiredate >= to_date('1981-05-01','yyyy-mm-dd') group by deptno,job having avg(sal) > 1200 order by deptno,job;<br style="background-color:inherit"> 6、分组函数嵌套<br style="background-color:inherit"> select max(avg(sal)) from emp group by deptno;<br style="background-color:inherit">  <br style="background-color:inherit"> 第八章 PLSQL变量与常量<br style="background-color:inherit"> 1、声明变量<br style="background-color:inherit">   变量一般都在PL/SQL块的声明部分声明,引用变量前必须首先声明,要在执行或异常处理部分使用变量,那么变量必须首先在声明部分进行声明。<br style="background-color:inherit">   声明变量的语法如下:<br style="background-color:inherit"> Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]<br style="background-color:inherit">      注意:可以在声明变量的同时给变量强制性的加上NOT NULL约束条件,此时变量在初始化时必须赋值。<br style="background-color:inherit"> 2、给变量赋值<br style="background-color:inherit">   给变量赋值有两种方式:<br style="background-color:inherit">   . 直接给变量赋值<br style="background-color:inherit">    X:=200;<br style="background-color:inherit">    Y=Y+(X*20);<br style="background-color:inherit">   . 通过SQL SELECT INTO 或FETCH INTO给变量赋值<br style="background-color:inherit"> SELECT SUM(SALARY),SUM(SALARY*0.1)<br style="background-color:inherit"> INTO TOTAL_SALARY,TATAL_COMMISSION<br style="background-color:inherit"> FROM EMPLOYEE<br style="background-color:inherit"> WHERE DEPT=10;<br style="background-color:inherit"> 3、常量<br style="background-color:inherit">   常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,,他的声明方式与变量相似,但必须包括关键字CONSTANT。常量和变量都可被定义为SQL和用户定义的数据类型。<br style="background-color:inherit"> ZERO_VALUE CONSTANT NUMBER:=0;<br style="background-color:inherit"> 4、标量(scalar)数据类型<br style="background-color:inherit">   标量(scalar)数据类型没有内部组件,他们大致可分为以下四类:<br style="background-color:inherit">    . number<br style="background-color:inherit"> . char<br style="background-color:inherit"> . date/time<br style="background-color:inherit"> . boolean<br style="background-color:inherit">   表1 Numer<br style="background-color:inherit"> Datatype Range Subtypes description<br style="background-color:inherit"> BINARY_INTEGER -214748-2147483647 NATURAL<br style="background-color:inherit"> NATURAL<br style="background-color:inherit"> NPOSITIVE<br style="background-color:inherit"> POSITIVEN<br style="background-color:inherit"> SIGNTYPE<br style="background-color:inherit"> 用于存储单字节整数。<br style="background-color:inherit"> 要求存储长度低于NUMBER值。<br style="background-color:inherit"> 用于限制范围的子类型(SUBTYPE):<br style="background-color:inherit">  NATURAL:用于非负数<br style="background-color:inherit">  POSITIVE:只用于正数<br style="background-color:inherit">  NATURALN:只用于非负数和非NULL值<br style="background-color:inherit">  POSITIVEN:只用于正数,不能用于NULL值<br style="background-color:inherit">  SIGNTYPE:只有值:-1、0或1.<br style="background-color:inherit"> NUMBER 1.0E-130-9.99E125 DEC<br style="background-color:inherit"> DECIMAL<br style="background-color:inherit"> DOUBLE<br style="background-color:inherit"> PRECISION<br style="background-color:inherit"> FLOAT<br style="background-color:inherit"> INTEGERIC<br style="background-color:inherit"> INT<br style="background-color:inherit"> NUMERIC<br style="background-color:inherit"> REAL<br style="background-color:inherit"> SMALLINT 存储数字值,包括整数和浮点数。可以选择精度和刻度方式,语法:<br style="background-color:inherit"> number[([,])]。<br style="background-color:inherit"> 缺省的精度是38,scale是0.<br style="background-color:inherit"> PLS_INTEGER -2147483647-2147483647 与BINARY_INTEGER基本相同,但采用机器运算时,PLS_INTEGER提供更好的性能 。<br style="background-color:inherit">   表2 字符数据类型<br style="background-color:inherit"> datatype rang subtype description<br style="background-color:inherit"> CHAR 最大长度32767字节 CHARACTER 存储定长字符串,如果长度没有确定,缺省是1<br style="background-color:inherit"> LONG 最大长度2147483647字节 存储可变长度字符串<br style="background-color:inherit"> RAW 最大长度32767字节 用于存储二进制数据和字节字符串,当在两个数据库之间进行传递时,RAW数据不在字符集之间进行转换。<br style="background-color:inherit"> LONGRAW 最大长度2147483647 与LONG数据类型相似,同样他也不能在字符集之间进行转换。<br style="background-color:inherit"> ROWID 18个字节 与数据库ROWID伪列类型相同,能够存储一个行标示符,可以将行标示符看作数据库中每一行的唯一键值。<br style="background-color:inherit"> VARCHAR2 最大长度32767字节 STRINGVARCHAR 与VARCHAR数据类型相似,存储可变长度的字符串。声明方法与VARCHAR相同<br style="background-color:inherit">   表3 DATE和BOOLEAN<br style="background-color:inherit"> datatype range description<br style="background-color:inherit"> BOOLEAN TRUE/FALSE 存储逻辑值TRUE或FALSE,无参数<br style="background-color:inherit"> DATE 01/01/4712 BC 存储固定长的日期和时间值,日期值中包含时间<br style="background-color:inherit"> LOB数据类型<br style="background-color:inherit">   LOB(大对象,Large object) 数据类型用于存储类似图像,声音这样的大型数据对象,LOB数据对象可以是二进制数据也可以是字符数据,其最大长度不超过4G。LOB数据类型支持任意访问方式,LONG只支持顺序访问方式。LOB存储在一个单独的位置上,同时一个"LOB定位符"(LOB locator)存储在原始的表中,该定位符是一个指向实际数据的指针。在PL/SQL中操作LOB数据对象使用ORACLE提供的包DBMS_LOB.LOB数据类型可分为以下四类:<br style="background-color:inherit">   . BFILE----------------二进制文件<br style="background-color:inherit">   . BLOB--------------二进制对象<br style="background-color:inherit">   . CLOB---------------字符型对象<br style="background-color:inherit">   . NCLOB-------------nchar类型对象<br style="background-color:inherit"> 操作符<br style="background-color:inherit">   PL/SQL有一系列操作符。操作符分为下面几类:<br style="background-color:inherit">   . 算术操作符<br style="background-color:inherit">   . 关系操作符<br style="background-color:inherit">   . 比较操作符<br style="background-color:inherit">   . 逻辑操作符<br style="background-color:inherit">   算术操作符如表4所示<br style="background-color:inherit"> operator operation<br style="background-color:inherit"> + 加<br style="background-color:inherit"> - 减<br style="background-color:inherit"> / 除<br style="background-color:inherit"> * 乘<br style="background-color:inherit"> ** 乘方<br style="background-color:inherit">   关系操作符主要用于条件判断语句或用于where子串中,关系操作符检查条件和结果是否为true或false,<br style="background-color:inherit"> 表5PL/SQL中的关系操作符<br style="background-color:inherit"> operator operation<br style="background-color:inherit"> < 小于操作符<br style="background-color:inherit"> <= 小于或等于操作符<br style="background-color:inherit"> > 大于操作符<br style="background-color:inherit"> >= 大于或等于操作符<br style="background-color:inherit"> = 等于操作符<br style="background-color:inherit"> != 不等于操作符<br style="background-color:inherit"> <> 不等于操作符<br style="background-color:inherit"> := 赋值操作符<br style="background-color:inherit">   表6 显示的是比较操作符<br style="background-color:inherit"> operator operation<br style="background-color:inherit"> IS NULL 如果操作数为NULL返回TRUE<br style="background-color:inherit"> LIKE 比较字符串值<br style="background-color:inherit"> BETWEEN 验证值是否在范围之内<br style="background-color:inherit"> IN 验证操作数在设定的一系列值中<br style="background-color:inherit">   表7显示的是逻辑操作符<br style="background-color:inherit"> operator operation<br style="background-color:inherit"> AND 两个条件都必须满足<br style="background-color:inherit"> OR 只要满足两个条件中的一个<br style="background-color:inherit"> NOT 取反<br style="background-color:inherit"> 第九章 PL/SQL--------动态SQL<br style="background-color:inherit"> PL/SQL动态SQL(原创)<br style="background-color:inherit"> 概念:动态SQL,编译阶段无法明确SQL命令,只有在运行阶段才能被识别<br style="background-color:inherit"> 动态SQL和静态SQL两者的异同<br style="background-color:inherit"> 静态SQL为直接嵌入到PL/SQL中的代码,而动态SQL在运行时,根据不同的情况产生不同的SQL语句。<br style="background-color:inherit"> 静态SQL在执行前编译,一次编译,多次运行。动态SQL同样在执行前编译,但每次执行需要重新编译。<br style="background-color:inherit"> 静态SQL可以使用相同的执行计划,对于确定的任务而言,静态SQL更具有高效性,但缺乏灵活性;动态SQL使用了不同的执行计划,效率不如静态SQL,但能够解决复杂的问题。<br style="background-color:inherit"> 动态SQL容易产生SQL注入,为数据库安全带来隐患。<br style="background-color:inherit"> 动态SQL语句的几种方法<br style="background-color:inherit"> a.使用EXECUTE IMMEDIATE语句<br style="background-color:inherit"> 包括DDL语句,DCL语句,DML语句以及单行的SELECT 语句。该方法不能用于处理多行查询语句。<br style="background-color:inherit"> b.使用OPEN-FOR,FETCH和CLOSE语句<br style="background-color:inherit"> 对于处理动态多行的查询操作,可以使用OPEN-FOR语句打开游标,使用FETCH语句循环提取数据,最终使用CLOSE语句关闭游标。<br style="background-color:inherit"> c.使用批量动态SQL<br style="background-color:inherit"> 即在动态SQL中使用BULK子句,或使用游标变量时在fetch中使用BULK ,或在FORALL语句中使用BULK子句来实现。<br style="background-color:inherit"> d.使用系统提供的PL/SQL包DBMS_SQL来实现动态SQL<br style="background-color:inherit">  <br style="background-color:inherit"> 动态SQL的语法<br style="background-color:inherit"> 下面是动态SQL常用的语法之一<br style="background-color:inherit"> EXECUTE IMMEDIATE dynamic_SQL_string<br style="background-color:inherit"> [INTO defined_variable1, defined_variable2, ...]<br style="background-color:inherit"> [USING [IN | OUT | IN OUT] bind_argument1, bind_argument2,...]<br style="background-color:inherit"> [{RETURNING | RETURN} field1, field2, ... INTO bind_argument1,<br style="background-color:inherit"> bind_argument2, ...]<br style="background-color:inherit"> 语法描述<br style="background-color:inherit"> dynamic_SQL_string:存放指定的SQL语句或PL/SQL块的字符串变量<br style="background-color:inherit"> defined_variable1:用于存放单行查询结果,使用时必须使用INTO关键字,类似于使用<br style="background-color:inherit"> SELECT ename INTO v_name FROM scott.emp;<br style="background-color:inherit"> 只不过在动态SQL时,将INTO defined_variable1移出到dynamic_SQL_string语句之外。<br style="background-color:inherit"> bind_argument1:用于给动态SQL语句传入或传出参数,使用时必须使用USING关键字,IN表示传入的参数,OUT表示传出的参数,IN OUT则既可以传入,也可传出。<br style="background-color:inherit"> RETURNING | RETURN 子句也是存放SQL动态返回值的变量。<br style="background-color:inherit"> 使用要点<br style="background-color:inherit"> a.EXECUTE IMMEDIATE执行DML时,不会提交该DML事务,需要使用显示提交(COMMIT)或作为EXECUTE IMMEDIATE自身的一部分。<br style="background-color:inherit"> b.EXECUTE IMMEDIATE执行DDL,DCL时会自动提交其执行的事务。<br style="background-color:inherit"> c.对于多行结果集的查询,需要使用游标变量或批量动态SQL,或者使用临时表来实现。<br style="background-color:inherit"> d.当执行SQL时,其尾部不需要使用分号,当执行PL/SQL 代码时,其尾部需要使用分号。<br style="background-color:inherit"> f.动态SQL中的占位符以冒号开头,紧跟任意字母或数字表示。<br style="background-color:inherit"> 动态SQL的使用(DDL,DCL,DML以及单行结果集)<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">   v_table VARCHAR2(30):='emp1';<br style="background-color:inherit">   v_sql LONG:='SELECT ename FROM emp1 WHERE empno=:1';--占位符\可以用任何符号(数字或字母)<br style="background-color:inherit">   --v_no emp1.empno%TYPE:='&请输入号码';--&是变量绑定符 绑定的数据是字符串类型时必须要加引号<br style="background-color:inherit">   --v_no emp1.empno%TYPE:=&请输入号码;<br style="background-color:inherit">   v_name emp1.ename%TYPE;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">   --EXECUTE IMMEDIATE v_sql INTO v_name USING IN v_no;<br style="background-color:inherit">   dbms_output.put_line('ename='||v_name);<br style="background-color:inherit">   --EXECUTE IMMEDIATE 'create table emp2 as select * from emp';<br style="background-color:inherit">   --EXECUTE IMMEDIATE 'drop table '||v_table;<br style="background-color:inherit">   --EXECUTE IMMEDIATE 'alter table emp enable row movement';<br style="background-color:inherit"> END;<br style="background-color:inherit"> BULK子句和动态SQL的使用<br style="background-color:inherit"> 动态SQL中使用BULK子句的语法<br style="background-color:inherit"> EXECUTE IMMEDIATE dynamic_string --dynamic_string用于存放动态SQL字符串<br style="background-color:inherit"> [BULK COLLECT INTO define_variable[,define_variable...]] --存放查询结果的集合变量<br style="background-color:inherit"> [USING bind_argument[,argument...]] --使用参数传递给动态SQL<br style="background-color:inherit"> [{RETURNING | RETURN} --返回子句<br style="background-color:inherit"> BULK COLLECT INTO return_variable[,return_variable...]]; --存放返回结果的集合变量<br style="background-color:inherit"> 使用bulk collect into子句处理动态SQL中T的多行查询可以加快处理速度,从而提高应用程序的性能。当使用bulk子句时,集合类型可以是PL/SQL所支持的索引表、嵌套表和VARRY,但集合元 素必须使用SQL数据类型。常用的三种语句支持BULK子句,分别为EXECUTE IMMEDIATE,FETCH 和FORALL。<br style="background-color:inherit"> 使用EXECUTE IMMEDIATE 结合BULK子句处理多行查询。使用了BULK COLLECT INTO来传递结果。<br style="background-color:inherit"> SQL>declare<br style="background-color:inherit">   type ename_table_type is table of emp1.ename%type index by binary_integer;<br style="background-color:inherit">   type sal_table_type is table OF emp1.sal%type index by binary_integer;<br style="background-color:inherit">      ename_table ename_table_type;<br style="background-color:inherit">      sal_table sal_table_type;<br style="background-color:inherit">      sql_stat varchar2(100);<br style="background-color:inherit">      v_dno number := 7369;<br style="background-color:inherit"> begin<br style="background-color:inherit">     sql_stat := 'select ename,sal from emp1 where deptno = :v_dno'; --动态DQL语句,未使用RETURNING子句<br style="background-color:inherit">     execute immediate sql_stat<br style="background-color:inherit">     bulk collect into ename_table,sal_table using v_dno;<br style="background-color:inherit">     for i in 1..ename_table.count loop<br style="background-color:inherit">         dbms_output.put_line('Employee ' || ename_table(i) || ' Salary is: ' || sal_table(i));<br style="background-color:inherit">     end loop;<br style="background-color:inherit"> end;<br style="background-color:inherit"> 使用FETCH子句结合BULK子句处理多行结果集<br style="background-color:inherit"> 下面的示例中首先定义了游标类型,游标变量以及复合类型,复合变量,接下来从动态SQL中OPEN游标,然后使用FETCH将结果存放到复合变量中。即使用OPEN,FETCH代替了EXECUTE IMMEDIATE来完成动态SQL的执行。<br style="background-color:inherit"> SQL> declare<br style="background-color:inherit">   2 type empcurtype is ref cursor;<br style="background-color:inherit">   3 emp_cv empcurtype;<br style="background-color:inherit">   4 type ename_table_type is table of tb2.ename%type index by binary_integer;<br style="background-color:inherit">   5 ename_table ename_table_type;<br style="background-color:inherit">   6 sql_stat varchar2(120);<br style="background-color:inherit">   7 begin<br style="background-color:inherit">   8 sql_stat := 'select ename from tb2 where deptno = :dno';<br style="background-color:inherit">   9 open emp_cv for sql_stat using &dno;<br style="background-color:inherit">  10 fetch emp_cv bulk collect into ename_table;<br style="background-color:inherit">  11 for i in 1..ename_table.count loop<br style="background-color:inherit">  12 dbms_output.put_line('Employee Name: ' || ename_table(i));<br style="background-color:inherit">  13 end loop;<br style="background-color:inherit">  14 close emp_cv;<br style="background-color:inherit">  15* end;<br style="background-color:inherit"> 在FORALL语句中使用BULK子句<br style="background-color:inherit"> 下面是FORALL子句的语法<br style="background-color:inherit"> FORALL index IN lower bound..upper bound --FORALL循环计数<br style="background-color:inherit"> EXECUTE IMMEDIATE dynamic_string --结合EXECUTE IMMEDIATE来执行动态SQL语句<br style="background-color:inherit"> USING bind_argument | bind_argument(index) --绑定输入参数<br style="background-color:inherit"> [bind_argument | bind_argument(index)]...<br style="background-color:inherit"> [{RETURNING | RETURN} BULK COLLECT INTO bind_argument[,bind_argument...]]; --绑定返回结果集<br style="background-color:inherit"> FORALL子句允许为动态SQL输入变量,但FORALL子句仅支持的DML(INSERT,DELETE,UPDATE)语句,不支持动态的SELECT语句。<br style="background-color:inherit"> 下面的示例中,首先声明了两个复合类型以及复合变量,接下来为复合变量ename_table赋值,以形成动态SQL语句。紧接着使用FORALL子句结合EXECUTE IMMEDIATE 来提取结果集。<br style="background-color:inherit"> SQL> declare<br style="background-color:inherit">   2 type ename_table_type is table of tb2.ename%type;<br style="background-color:inherit">   3 type sal_table_type is table of tb2.sal%type;<br style="background-color:inherit">   4 ename_table ename_table_type;<br style="background-color:inherit">   5 sal_table sal_table_type;<br style="background-color:inherit">   6 sql_stat varchar2(100);<br style="background-color:inherit">   7 begin<br style="background-color:inherit">   8 ename_table := ename_table_type('BLAKE','FORD','MILLER');<br style="background-color:inherit">   9 sql_stat := 'update tb2 set sal = sal * 1.1 where ename = :1'<br style="background-color:inherit">  10 || ' returning sal into :2';<br style="background-color:inherit">  11 forall i in 1..ename_table.count<br style="background-color:inherit">  12 execute immediate sql_stat using ename_table(i) returning bulk collect into sal_table;<br style="background-color:inherit">  13 for j in 1..sal_table.count loop<br style="background-color:inherit">  14 dbms_output.put_line('The ' || ename_table(j) || '''' || 's new salalry is ' || sal_table(j));<br style="background-color:inherit">  15 end loop;<br style="background-color:inherit">  16* end;<br style="background-color:inherit"> 常见错误<br style="background-color:inherit"> 1、使用动态DDL时,不能使用绑定变量。<br style="background-color:inherit"> EXECUTE IMMEDIATE 'CREATE TABLE dsa '||'as select * from :1' USING IN v_table;<br style="background-color:inherit"> 解决办法,将绑定变量直接拼接,如下:<br style="background-color:inherit"> EXECUTE IMMEDIATE 'CREATE TABLE dsa '||'as select * from '|| v_table;<br style="background-color:inherit"> 2、不能使用schema对象作为绑定参数,下面的示例中,动态SQL语句查询需要传递表名,因此收到了错误提示。<br style="background-color:inherit"> EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM:tb_name ' into v_count;<br style="background-color:inherit"> 解决办法,将绑定变量直接拼接,如下:<br style="background-color:inherit"> EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || tb_name into v_count;<br style="background-color:inherit"> 3、动态SQL块不能使用分号结束(;)<br style="background-color:inherit">   execute immediate 'select count(*) from emp;' --此处多出了分号,应该去掉<br style="background-color:inherit">  <br style="background-color:inherit"> 4、动态PL/SQL块不能使用正斜杠来结束块,但是块结尾处必须要使用分号(;)<br style="background-color:inherit"> SQL> declare<br style="background-color:inherit">   2 plsql_block varchar2(300);<br style="background-color:inherit">   3 begin<br style="background-color:inherit">   4 plsql_block := 'Declare ' ||<br style="background-color:inherit">   5 ' v_date date; ' ||<br style="background-color:inherit">   6 ' begin ' ||<br style="background-color:inherit">   7 ' select sysdate into v_date from dual; ' ||<br style="background-color:inherit">   8 ' dbms_output.put_line(to_char(v_date,''yyyy-mm-dd'')); ' ||<br style="background-color:inherit">   9 ' end;<br style="background-color:inherit">  10 /'; --此处多出了/,应该将其去掉<br style="background-color:inherit">  11 execute immediate plsql_block;<br style="background-color:inherit">  12* end;<br style="background-color:inherit"> 4、空值传递的问题<br style="background-color:inherit"> 下面的示例中对表tb_emp更新,并将空值更新到sal列,直接使用USING NULL收到错误提示。<br style="background-color:inherit">   execute immediate sql_stat using null,v_empno;<br style="background-color:inherit"> 正确的处理方法<br style="background-color:inherit">     v_sal tb2.sal%type; --声明一个新变量,但不赋值<br style="background-color:inherit">     execute immediate sql_stat using v_sal,v_empno;<br style="background-color:inherit"> 5、日期和字符型必须要使用引号来处理<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">   sql_stat VARCHAR2(100);<br style="background-color:inherit">   v_date DATE :=TO_DATE('2013-11-21','yyyy-mm-dd');<br style="background-color:inherit">   v_empno NUMBER :=7900;<br style="background-color:inherit">   v_ename emp.ename%TYPE;<br style="background-color:inherit">   v_sal emp.sal%TYPE;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">   sql_stat := 'SELECT ename,sal FROM emp WHERE hiredate=:v_date';<br style="background-color:inherit">   EXECUTE IMMEDIATE sql_stat<br style="background-color:inherit">   INTO v_ename,v_sal<br style="background-color:inherit">   USING v_date;<br style="background-color:inherit">   DBMS_OUTPUT.PUT_LINE('Employee Name '||v_ename||', sal is '||v_sal);<br style="background-color:inherit"> END;<br style="background-color:inherit"> 6、单行SELECT 查询不能使用RETURNING INTO返回<br style="background-color:inherit"> 下面的示例中,使用了动态的单行SELECT查询,并且使用了RETURNING子句来返回值。事实上,RETURNING coloumn_name INTO 子句仅仅支持对DML结果集的返回,因此,收到了错误提示。<br style="background-color:inherit"> SQL>declare<br style="background-color:inherit"> v_empno emp.empno%type := &empno;<br style="background-color:inherit">  v_ename emp.ename%type;<br style="background-color:inherit"> begin<br style="background-color:inherit">  execute immediate 'select ename from emp where empno = :eno' into v_ename using v_empno;<br style="background-color:inherit">  dbms_output.put_line('Employee name: ' || v_ename);<br style="background-color:inherit"> end;<br style="background-color:inherit"> 第十章 PL/SQL---------游标<br style="background-color:inherit"> 游标的使用<br style="background-color:inherit">     在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现。<br style="background-color:inherit"> 4.1 游标概念<br style="background-color:inherit"> 对于不同的SQL语句,游标的使用情况不同:<br style="background-color:inherit"> SQL语句<br style="background-color:inherit"> 游标<br style="background-color:inherit"> 非查询语句<br style="background-color:inherit"> 隐式的<br style="background-color:inherit"> 结果是单行的查询语句<br style="background-color:inherit"> 隐式的或显示的<br style="background-color:inherit"> 结果是多行的查询语句<br style="background-color:inherit"> 显示的<br style="background-color:inherit"> 游标名%属性名<br style="background-color:inherit"> 显式游标的名字右用户定义,隐式游标名为SQL<br style="background-color:inherit"> 隐式游标只是一个状态<br style="background-color:inherit"> 4.1.1 处理显式游标<br style="background-color:inherit">  <br style="background-color:inherit"> 1. 显式游标处理<br style="background-color:inherit"> 语法格式:<br style="background-color:inherit"> CURSOR cursor_name is select * from emp;<br style="background-color:inherit"> OPEN cursor_name;<br style="background-color:inherit"> FETCH cursor_name INTO variables_list;<br style="background-color:inherit"> CLOSE cursor_name;<br style="background-color:inherit"> 例1:<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">   v_deptno NUMBER:=&inputno;<br style="background-color:inherit">   v_row emp1%ROWTYPE;<br style="background-color:inherit">   CURSOR v_cursor IS SELECT * FROM emp1 WHERE deptno=v_deptno;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">   --打开<br style="background-color:inherit">   OPEN v_cursor;<br style="background-color:inherit">   --提取<br style="background-color:inherit">   LOOP<br style="background-color:inherit">     FETCH v_cursor INTO v_row;--先提取<br style="background-color:inherit">     EXIT WHEN v_cursor%NOTFOUND;<br style="background-color:inherit">     dbms_output.put_line('Employee Name: ' || v_row.ename || ' ,Salary: ' || v_row.sal);<br style="background-color:inherit">   END LOOP;<br style="background-color:inherit">   --关闭<br style="background-color:inherit">   CLOSE v_cursor;<br style="background-color:inherit"> END;<br style="background-color:inherit"> 显式游标处理需四个 PL/SQL步骤:<br style="background-color:inherit"> l 定义/声明游标:就是定义一个游标名,以及与其相对应的SELECT 语句。<br style="background-color:inherit"> 格式:<br style="background-color:inherit">  <br style="background-color:inherit">     CURSOR cursor_name[(parameter[, parameter]…)]<br style="background-color:inherit">            <br style="background-color:inherit">            [RETURN datatype]<br style="background-color:inherit">     IS<br style="background-color:inherit">         select_statement;<br style="background-color:inherit">         select_statement;<br style="background-color:inherit">  <br style="background-color:inherit"> 游标参数只能为输入参数,其格式为:<br style="background-color:inherit">  <br style="background-color:inherit"> parameter_name [IN] datatype [{:= | DEFAULT} expression]<br style="background-color:inherit"> 在指定数据类型时,不能使用长度约束。如NUMBER(4),CHAR(10) 等都是错误的。<br style="background-color:inherit"> [RETURN datatype]是可选的,表示游标返回数据的数据。如果选择,则应该严格与select_statement中的选择列表在次序和数据类型上匹配。一般是记录数据类型或带“%ROWTYPE”的数据。<br style="background-color:inherit">  <br style="background-color:inherit"> l 打开游标:就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。如果游标查询语句中带有FOR UPDATE选项,OPEN 语句还将锁定数据库表中游标结果集合对应的数据行。<br style="background-color:inherit"> 格式:<br style="background-color:inherit">  <br style="background-color:inherit"> OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];<br style="background-color:inherit">  <br style="background-color:inherit"> 在向游标传递参数时,可以使用与函数参数相同的传值方法,即位置表示法和名称表示法。PL/SQL 程序不能用OPEN 语句重复打开一个游标。<br style="background-color:inherit">  <br style="background-color:inherit"> l 提取游标数据:就是检索结果集合中的数据行,放入指定的输出变量中。<br style="background-color:inherit"> 格式:<br style="background-color:inherit">  <br style="background-color:inherit"> FETCH cursor_name INTO {variable_list | record_variable };<br style="background-color:inherit">  <br style="background-color:inherit"> 执行FETCH语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。当检索到最后一行数据时,如果再次执行FETCH语句,将操作失败,并将游标属性%NOTFOUND置为TRUE。所以每次执行完FETCH语句后,检查游标属性%NOTFOUND就可以判断FETCH语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了值。<br style="background-color:inherit"> l 对该记录进行处理;<br style="background-color:inherit"> l 继续处理,直到活动集合中没有记录;<br style="background-color:inherit"> l 关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。关闭后的游标可以使用OPEN 语句重新打开。<br style="background-color:inherit"> 格式:<br style="background-color:inherit">  <br style="background-color:inherit"> CLOSE cursor_name;<br style="background-color:inherit">  <br style="background-color:inherit">      注:定义的游标不能有INTO 子句。<br style="background-color:inherit">  <br style="background-color:inherit"> 例1. 查询前10名员工的信息。<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">    CURSOR c_cursor<br style="background-color:inherit">    IS SELECT first_name || last_name, Salary FROM EMPLOYEES WHERE rownum<11;<br style="background-color:inherit">    v_ename EMPLOYEES.first_name%TYPE;<br style="background-color:inherit">    v_sal EMPLOYEES.Salary%TYPE;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">   OPEN c_cursor;<br style="background-color:inherit">   FETCH c_cursor INTO v_ename, v_sal;<br style="background-color:inherit">   WHILE c_cursor%FOUND LOOP<br style="background-color:inherit">      DBMS_OUTPUT.PUT_LINE(v_ename||'---'||to_char(v_sal) );<br style="background-color:inherit">      FETCH c_cursor INTO v_ename, v_sal;<br style="background-color:inherit">   END LOOP;<br style="background-color:inherit">   CLOSE c_cursor;<br style="background-color:inherit"> END;<br style="background-color:inherit">  <br style="background-color:inherit"> 2.游标属性<br style="background-color:inherit">  Cursor_name%FOUND 布尔型属性,当最近一次提取游标操作FETCH成功则为 TRUE,否则为FALSE;<br style="background-color:inherit">  Cursor_name%NOTFOUND 布尔型属性,与%FOUND相反;<br style="background-color:inherit">  Cursor_name%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;<br style="background-color:inherit">  Cursor_name%ROWCOUNT 数字型属性,返回已从游标中读取的记录数。<br style="background-color:inherit">  <br style="background-color:inherit"> 例2:没有参数且没有返回值的游标。<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">    v_f_name employees.first_name%TYPE;<br style="background-color:inherit">    v_j_id employees.job_id%TYPE;<br style="background-color:inherit">    <br style="background-color:inherit">    CURSOR c1 --声明游标,没有参数没有返回值<br style="background-color:inherit">    IS<br style="background-color:inherit">       SELECT first_name, job_id FROM employees WHERE department_id = 20;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">    OPEN c1; --打开游标<br style="background-color:inherit">    LOOP<br style="background-color:inherit">       FETCH c1 INTO v_f_name, v_j_id; --提取游标<br style="background-color:inherit">       IF c1%FOUND THEN<br style="background-color:inherit">          DBMS_OUTPUT.PUT_LINE(v_f_name||'的岗位是'||v_j_id);<br style="background-color:inherit">       ELSE<br style="background-color:inherit">          DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');<br style="background-color:inherit">          EXIT;<br style="background-color:inherit">       END IF;<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit">    CLOSE c1; --关闭游标<br style="background-color:inherit"> END;<br style="background-color:inherit">  <br style="background-color:inherit"> 例3:有参数且没有返回值的游标。<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">    v_f_name employees.first_name%TYPE;<br style="background-color:inherit">    v_h_date employees.hire_date%TYPE;<br style="background-color:inherit">    <br style="background-color:inherit">    CURSOR c2(dept_id NUMBER, j_id VARCHAR2) --声明游标,有参数没有返回值<br style="background-color:inherit">    IS<br style="background-color:inherit">       SELECT first_name, hire_date FROM employees WHERE department_id = dept_id AND job_id = j_id;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">    OPEN c2(90, 'AD_VP'); --打开游标,传递参数值<br style="background-color:inherit">    LOOP<br style="background-color:inherit">       FETCH c2 INTO v_f_name, v_h_date; --提取游标<br style="background-color:inherit">       IF c2%FOUND THEN<br style="background-color:inherit">          DBMS_OUTPUT.PUT_LINE(v_f_name||'的雇佣日期是'||v_h_date);<br style="background-color:inherit">       ELSE<br style="background-color:inherit">          DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');<br style="background-color:inherit">          EXIT;<br style="background-color:inherit">       END IF;<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit">    CLOSE c2; --关闭游标<br style="background-color:inherit"> END;<br style="background-color:inherit"> 例4:有参数且有返回值的游标。<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">    TYPE emp_record_type IS RECORD(<br style="background-color:inherit">         f_name employees.first_name%TYPE,<br style="background-color:inherit">         h_date employees.hire_date%TYPE);<br style="background-color:inherit">    v_emp_record EMP_RECORD_TYPE;<br style="background-color:inherit">    v_emp_record EMP_RECORD_TYPE;<br style="background-color:inherit">    CURSOR c3(dept_id NUMBER, j_id VARCHAR2) --声明游标,有参数有返回值<br style="background-color:inherit">           RETURN EMP_RECORD_TYPE<br style="background-color:inherit">    IS<br style="background-color:inherit">       SELECT first_name, hire_date FROM employees WHERE department_id = dept_id AND job_id = j_id;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">    OPEN c3(j_id => 'AD_VP', dept_id => 90); --打开游标,传递参数值<br style="background-color:inherit">    LOOP<br style="background-color:inherit">       FETCH c3 INTO v_emp_record; --提取游标<br style="background-color:inherit">       IF c3%FOUND THEN<br style="background-color:inherit">          DBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇佣日期是'||v_emp_record.h_date);<br style="background-color:inherit">       ELSE<br style="background-color:inherit">          DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');<br style="background-color:inherit">          EXIT;<br style="background-color:inherit">       END IF;<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit">    CLOSE c3; --关闭游标<br style="background-color:inherit"> END;<br style="background-color:inherit">  例5:基于游标定义记录变量。<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">    CURSOR c4(dept_id NUMBER, j_id VARCHAR2) --声明游标,有参数没有返回值<br style="background-color:inherit">    IS<br style="background-color:inherit">       SELECT first_name f_name, hire_date FROM employees WHERE department_id = dept_id AND job_id = j_id;<br style="background-color:inherit">     --基于游标定义记录变量,比声明记录类型变量要方便,不容易出错<br style="background-color:inherit">     v_emp_record c4%ROWTYPE;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">    OPEN c4(90, 'AD_VP'); --打开游标,传递参数值<br style="background-color:inherit">    LOOP<br style="background-color:inherit">       FETCH c4 INTO v_emp_record; --提取游标<br style="background-color:inherit">       IF c4%FOUND THEN<br style="background-color:inherit">          DBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇佣日期是'||v_emp_record.hire_date);<br style="background-color:inherit">       ELSE<br style="background-color:inherit">          DBMS_OUTPUT.PUT_LINE('已经处理完结果集了');<br style="background-color:inherit">          EXIT;<br style="background-color:inherit">       END IF;<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit">    CLOSE c4; --关闭游标<br style="background-color:inherit"> END;<br style="background-color:inherit"> 3. 游标的FOR循环<br style="background-color:inherit">     PL/SQL语言提供了游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能;当进入循环时,游标FOR循环语句自动打开游标,并提取第一行游标数据,当程序处理完当前所提取的数据而进入下一次循环时,游标FOR循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有数据行后结束循环,并自动关闭游标。<br style="background-color:inherit"> 格式:<br style="background-color:inherit">    FOR index_variable IN cursor_name[(value[, value]…)] LOOP<br style="background-color:inherit">     -- 游标数据处理代码<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit"> 其中:<br style="background-color:inherit"> index_variable为游标FOR 循环语句隐含声明的索引变量,该变量为记录变量,其结构与游标查询语句返回的结构集合的结构相同。在程序中可以通过引用该索引记录变量元素来读取所提取的游标数据,index_variable中各元素的名称与游标查询语句选择列表中所制定的列名相同。如果在游标查询语句的选择列表中存在计算列,则必须为这些计算列指定别名后才能通过游标FOR 循环语句中的索引变量来访问这些列数据。<br style="background-color:inherit"> 注:不要在程序中对游标进行人工操作;不要在程序中定义用于控制FOR循环的记录。<br style="background-color:inherit">  <br style="background-color:inherit"> 例6:当所声明的游标带有参数时,通过游标FOR 循环语句为游标传递参数。<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">   CURSOR c_cursor(dept_no NUMBER DEFAULT 10)<br style="background-color:inherit">   IS<br style="background-color:inherit">   SELECT department_name, location_id FROM departments WHERE department_id <= dept_no;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">     DBMS_OUTPUT.PUT_LINE('当dept_no参数值为30:');<br style="background-color:inherit">     FOR c1_rec IN c_cursor(30) LOOP<br style="background-color:inherit">    DBMS_OUTPUT.PUT_LINE(c1_rec.department_name||'---'||c1_rec.location_id);<br style="background-color:inherit">     END LOOP;<br style="background-color:inherit">     DBMS_OUTPUT.PUT_LINE(CHR(10)||'使用默认的dept_no参数值10:');<br style="background-color:inherit">     FOR c1_rec IN c_cursor LOOP<br style="background-color:inherit">    DBMS_OUTPUT.PUT_LINE(c1_rec.department_name||'---'||c1_rec.location_id);<br style="background-color:inherit">     END LOOP;<br style="background-color:inherit"> END;<br style="background-color:inherit">  <br style="background-color:inherit"> 例7:PL/SQL还允许在游标FOR循环语句中使用子查询来实现游标的功能。<br style="background-color:inherit"> BEGIN<br style="background-color:inherit"> --隐含打开游标<br style="background-color:inherit">    FOR r IN (SELECT * FROM emp1 WHERE deptno=v_deptno) LOOP<br style="background-color:inherit"> --隐含执行一个FETCH语句<br style="background-color:inherit">       dbms_output.put_line('Employee Name: ' || r.ename || ' ,Salary: ' || r.sal);<br style="background-color:inherit"> --隐含监测c_sal%NOTFOUND<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit"> --隐含关闭游标<br style="background-color:inherit"> END;<br style="background-color:inherit">  <br style="background-color:inherit"> 4.1.2 处理隐式游标<br style="background-color:inherit"> 对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由ORACLE 系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条SQL 语句所包含的数据。<br style="background-color:inherit"> 格式调用为: SQL%<br style="background-color:inherit">  <br style="background-color:inherit"> 注:INSERT, UPDATE, DELETE, SELECT(单查询) 语句中不必明确定义游标。<br style="background-color:inherit">  <br style="background-color:inherit"> 隐式游标属性<br style="background-color:inherit"> 属性<br style="background-color:inherit"> 值<br style="background-color:inherit"> SELECT<br style="background-color:inherit"> INSERT<br style="background-color:inherit"> UPDATE<br style="background-color:inherit"> DELETE<br style="background-color:inherit"> SQL%ISOPEN<br style="background-color:inherit">  <br style="background-color:inherit"> FALSE<br style="background-color:inherit"> FALSE<br style="background-color:inherit"> FALSE<br style="background-color:inherit"> FALSE<br style="background-color:inherit"> SQL%FOUND<br style="background-color:inherit"> TRUE<br style="background-color:inherit"> 有结果<br style="background-color:inherit">  <br style="background-color:inherit"> 成功<br style="background-color:inherit"> 成功<br style="background-color:inherit"> SQL%FOUND<br style="background-color:inherit"> FALSE<br style="background-color:inherit"> 没结果<br style="background-color:inherit">  <br style="background-color:inherit"> 失败<br style="background-color:inherit"> 失败<br style="background-color:inherit"> SQL%NOTFUOND<br style="background-color:inherit"> TRUE<br style="background-color:inherit"> 没结果<br style="background-color:inherit">  <br style="background-color:inherit"> 失败<br style="background-color:inherit"> 失败<br style="background-color:inherit"> SQL%NOTFOUND<br style="background-color:inherit"> FALSE<br style="background-color:inherit"> 有结果<br style="background-color:inherit">  <br style="background-color:inherit"> 成功<br style="background-color:inherit"> 失败<br style="background-color:inherit"> SQL%ROWCOUNT<br style="background-color:inherit">  <br style="background-color:inherit"> 返回行数,只为1<br style="background-color:inherit"> 插入的行数<br style="background-color:inherit"> 修改的行数<br style="background-color:inherit"> 删除的行数<br style="background-color:inherit">  <br style="background-color:inherit"> 例8: 通过隐式游标SQL的%ROWCOUNT属性来了解修改了多少行。<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">    v_rows NUMBER;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit"> --更新数据<br style="background-color:inherit">    UPDATE employees SET salary = 30000<br style="background-color:inherit">    WHERE department_id = 90 AND job_id = 'AD_VP';<br style="background-color:inherit"> --获取默认游标的属性值<br style="background-color:inherit">    v_rows := SQL%ROWCOUNT;<br style="background-color:inherit">    DBMS_OUTPUT.PUT_LINE(<br style="background-color:inherit">    DBMS_OUTPUT.PUT_LINE('更新了'||v_rows||'个雇员的工资');<br style="background-color:inherit"> --回退更新,以便使数据库的数据保持原样<br style="background-color:inherit">    ROLLBACK;<br style="background-color:inherit"> END;<br style="background-color:inherit">  <br style="background-color:inherit"> 4.1.3 使用游标更新和删除数据<br style="background-color:inherit"> 游标修改和删除操作是指在游标定位下,修改或删除表中指定的数据行。这时,要求游标查询语句中必须使用FOR UPDATE选项,以便在打开游标时锁定游标结果集合在表中对应数据行的所有列和部分列。<br style="background-color:inherit"> 为了对正在处理(查询)的行不被另外的用户改动,ORACLE 提供一个 FOR UPDATE 子句来对所选择的行进行锁住。该需求迫使ORACLE锁定游标结果集合的行,可以防止其他事务处理更新或删除相同的行,直到您的事务处理提交或回退为止。<br style="background-color:inherit"> 语法:<br style="background-color:inherit">  <br style="background-color:inherit"> SELECT column_list FROM table_list FOR UPDATE [OF column[, column]…] [NOWAIT]<br style="background-color:inherit">  <br style="background-color:inherit"> 如果使用 FOR UPDATE 声明游标,则可在DELETE和UPDATE 语句中使用<br style="background-color:inherit"> WHERE CURRENT OF cursor_name子句,修改或删除游标结果集合当前行对应的数据库表中的数据行。<br style="background-color:inherit">  <br style="background-color:inherit"> 例9:从EMPLOYEES表中查询某部门的员工情况,将其工资最低定为 1500;<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">     V_deptno employees.department_id<br style="background-color:inherit">     V_deptno employees.department_id%TYPE :=&p_deptno;<br style="background-color:inherit">    <br style="background-color:inherit">   CURSOR emp_cursor<br style="background-color:inherit">   IS<br style="background-color:inherit">   SELECT employees.employee_id, employees.salary FROM employees WHERE employees.department_id=v_deptno FOR UPDATE NOWAIT;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">     FOR emp_record IN emp_cursor LOOP<br style="background-color:inherit">     IF emp_record.salary < 1500 THEN<br style="background-color:inherit">         UPDATE employees SET salary=1500 WHERE CURRENT OF emp_cursor;<br style="background-color:inherit">     END IF;<br style="background-color:inherit">     END LOOP;<br style="background-color:inherit">     COMMIT;<br style="background-color:inherit"> END;<br style="background-color:inherit"> 4.2 游标变量<br style="background-color:inherit"> 与游标一样,游标变量也是一个指向多行查询结果集合中当前数据行的指针。但与游标不同的是,游标变量是动态的,而游标是静态的。游标只能与指定的查询相连,即固定指向一个查询的内存处理区域,而游标变量则可与不同的查询语句相连,它可以指向不同查询语句的内存处理区域(但不能同时指向多个内存处理区域,在某一时刻只能与一个查询语句相连),只要这些查询语句的返回类型兼容即可。<br style="background-color:inherit"> 4.2.1 声明游标变量<br style="background-color:inherit"> 游标变量为一个指针,它属于参照类型,所以在声明游标变量类型之前必须先定义游标变量类型。在PL/SQL中,可以在块、子程序和包的声明区域内定义游标变量类型。<br style="background-color:inherit"> 语法格式为:<br style="background-color:inherit"> 1.定义游标变量<br style="background-color:inherit"> TYPE cursortype IS REF CURSOR;<br style="background-color:inherit"> cursor_variable cursortype;<br style="background-color:inherit"> 2.打开游标变量<br style="background-color:inherit"> OPEN cursor_variable FOR dynamic_string<br style="background-color:inherit"> [USING bind_argument[,bind_argument]...]<br style="background-color:inherit"> 3.循环提取数据<br style="background-color:inherit"> FETCH cursor_variable INTO {var1[,var2]...| record_variable};<br style="background-color:inherit"> EXIT WHEN cursor_variable%NOTFOUND<br style="background-color:inherit"> 4.关闭游标变量<br style="background-color:inherit"> CLOSE cursor_variable;<br style="background-color:inherit">  <br style="background-color:inherit"> 例10:使用游标变量(没有RETURN子句)<br style="background-color:inherit"> DECLARE<br style="background-color:inherit"> --定义一个游标数据类型<br style="background-color:inherit">    TYPE emp_cursor_type IS REF CURSOR;<br style="background-color:inherit"> --声明一个游标变量<br style="background-color:inherit">    c1 EMP_CURSOR_TYPE;<br style="background-color:inherit"> --声明两个记录变量<br style="background-color:inherit">    v_emp_record employees%ROWTYPE;<br style="background-color:inherit">    v_reg_record regions%ROWTYPE;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">    OPEN c1 FOR SELECT * FROM employees WHERE department_id = 20;<br style="background-color:inherit">    LOOP<br style="background-color:inherit">       FETCH c1 INTO v_emp_record;<br style="background-color:inherit">       EXIT WHEN c1%NOTFOUND;<br style="background-color:inherit">       DBMS_OUTPUT.PUT_LINE(v_emp_record.first_name||'的雇佣日期是'||v_emp_record.hire_date);<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit"> --将同一个游标变量对应到另一个SELECT语句<br style="background-color:inherit">    OPEN c1 FOR SELECT * FROM regions WHERE region_id IN(1,2);<br style="background-color:inherit">    LOOP<br style="background-color:inherit">       FETCH c1 INTO v_reg_record;<br style="background-color:inherit">      <br style="background-color:inherit">       EXIT WHEN c1%NOTFOUND;<br style="background-color:inherit">       DBMS_OUTPUT.PUT_LINE(v_reg_record.region_id||'表示'||v_reg_record.region_name);<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit">    CLOSE c1;<br style="background-color:inherit"> END;<br style="background-color:inherit">  <br style="background-color:inherit"> 例11:使用游标变量(有RETURN子句)<br style="background-color:inherit"> DECLARE<br style="background-color:inherit"> --定义一个与employees表中的这几个列相同的记录数据类型<br style="background-color:inherit">    TYPE emp_record_type IS RECORD(<br style="background-color:inherit">         f_name employees.first_name<br style="background-color:inherit">         f_name employees.first_name%TYPE,<br style="background-color:inherit">         h_date employees.hire_date<br style="background-color:inherit">         h_date employees.hire_date%TYPE,<br style="background-color:inherit">         j_id employees.job_id<br style="background-color:inherit">         j_id employees.job_id%TYPE);<br style="background-color:inherit"> --声明一个该记录数据类型的记录变量<br style="background-color:inherit">    v_emp_record EMP_RECORD_TYPE;<br style="background-color:inherit"> --定义一个游标数据类型<br style="background-color:inherit">    TYPE emp_cursor_type IS REF CURSOR<br style="background-color:inherit">         RETURN EMP_RECORD_TYPE;<br style="background-color:inherit"> --声明一个游标变量<br style="background-color:inherit">    c1 EMP_CURSOR_TYPE;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">    OPEN c1 FOR SELECT first_name, hire_date, job_id FROM employees WHERE department_id = 20;<br style="background-color:inherit">    LOOP<br style="background-color:inherit">       FETCH c1 INTO v_emp_record;<br style="background-color:inherit">       EXIT WHEN c1%NOTFOUND;<br style="background-color:inherit">       DBMS_OUTPUT.PUT_LINE('雇员名称:'||v_emp_record.f_name||' 雇佣日期:'||v_emp_record.h_date||' 岗位:'||v_emp_record.j_id);<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit">    CLOSE c1;<br style="background-color:inherit"> END;<br style="background-color:inherit">  <br style="background-color:inherit"> 第十一章 视图<br style="background-color:inherit"> 视图:是一个封装了各种复杂查询的语句,就称为视图。不存储数据,只存储定义,定义被保存在数据字典中<br style="background-color:inherit"> 作用:1、可以保证安全,隐藏一些数据,保证数据不会被误删;<br style="background-color:inherit">            2、多表连接,可以使复杂的查询易于理解和使用<br style="background-color:inherit"> 15.1、创建视图<br style="background-color:inherit"> 需要权限才能创建<br style="background-color:inherit"> grant create view to scott;<br style="background-color:inherit">  CREATE OR REPLACE VIEW 视图名字(字段) AS 子查<br style="background-color:inherit">  CREATE OR REPLACE VIEW v_表名_业务 AS 查询语句<br style="background-color:inherit"> 建立一个只包含 20 部门雇员信息的视图(雇员的编号、姓名、工资)<br style="background-color:inherit">  CREATE VIEW empv20 (empno,ename,sal) AS SELECT empno,ename,sal FROM emp WHERE deptno=20 ;<br style="background-color:inherit">  现在直接更新视图里的数据 将 7369 的部门编号修改为 30。此操作在视图中完成。<br style="background-color:inherit">    update empv20 SET deptno=30 where empno=7369 ; 此时,提示更新完成。<br style="background-color:inherit">  默认情况下创建的视图,如果更新了,则会自动将此数据从视图中删除,之后会更新原本的数据。<br style="background-color:inherit">  <br style="background-color:inherit"> 在建立视图的时候有两个参数:<br style="background-color:inherit">  · WITH CHECK OPTION à 保护视图的创建规则<br style="background-color:inherit"> CREATE OR REPLACE VIEW empv20<br style="background-color:inherit"> AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20<br style="background-color:inherit"> WITH CHECK OPTION CONSTRAINT empv20_ck;----约束条件<br style="background-color:inherit"> ALTER TABLE emp1 add CONSTRAINT empv20_ck check(约束条件);<br style="background-color:inherit">  再执行更新操作:<br style="background-color:inherit">   update empv20 SET deptno=30 where empno=7369 ; à 此处更新的是部门编号,失败<br style="background-color:inherit">    |- 之前是按照部门编号建立的视图,所以不能修改部门编号<br style="background-color:inherit">   update empv20 SET ename='tom' where empno=7369 ; à 可以更新,更新的是名字,成功<br style="background-color:inherit">  · WITH READ ONLY(只读,不可修改),视图最好不要轻易的修改<br style="background-color:inherit"> CREATE OR REPLACE VIEW empv20<br style="background-color:inherit"> AS SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20<br style="background-color:inherit"> WITH READ ONLY;<br style="background-color:inherit">  现在任意的字段都不可更改,所以现在的视图是只读的。<br style="background-color:inherit"> 如果视图的基表有多行查询(比如:group by,distinct)那么该视图也是只读的<br style="background-color:inherit">  <br style="background-color:inherit"> 15.1、查看视图<br style="background-color:inherit"> SELECT * FROM v_emp;<br style="background-color:inherit"> update v_emp SET deptno=20 where empno=7369;<br style="background-color:inherit"> DELETE FROM v_emp WHERE empno=7369;<br style="background-color:inherit"> ROLLBACK;<br style="background-color:inherit"> DROP VIEW v_emp;<br style="background-color:inherit"> 在视图终不能被修改删除,1、多表构成的视图;2、group by<br style="background-color:inherit"> 资料:<br style="background-color:inherit"> http://database.51cto.com/art/200904/118306.htm<br style="background-color:inherit"> http://blog.csdn.net/fan_xiao_ming/article/details/6174065<br style="background-color:inherit"> 第十六章 索引<br style="background-color:inherit"> 工作原理:rowid<br style="background-color:inherit"> 用执行计划检测索引是否起作用(set autot on exp)<br style="background-color:inherit"> 执行计划 cbo(选择)和cro(规则)<br style="background-color:inherit">    <br style="background-color:inherit"> 16.1、索引<br style="background-color:inherit"> 索引是一种用于提升查询效率的数据库对象,通过快速定位数据的方法,索引信息与表独立存放,Oracle数据库自动使用和维护索引<br style="background-color:inherit"> 索引的存储<br style="background-color:inherit">        索引和表都是独立存在的。在为索引指定表空间的时候,不要将被索引的表和索引指向同一个表空间,这样可以避免产生 IO 冲突。使 Oracle 能够并行访问存放在不同硬盘中的索引数据和表数据,更好的提高查询速度。<br style="background-color:inherit"> 16.2、索引优缺点<br style="background-color:inherit"> 建立索引的优点<br style="background-color:inherit">   1.加快数据的检索速度;<br style="background-color:inherit">   2.创建唯一性索引,保证数据库表中每一行数据的唯一性;<br style="background-color:inherit">   3.加速表和表之间的连接;<br style="background-color:inherit">   4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。<br style="background-color:inherit"> 索引的缺点<br style="background-color:inherit">   1.索引需要占物理空间。<br style="background-color:inherit">   2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。<br style="background-color:inherit"> 16.3、创建索引<br style="background-color:inherit"> 创建索引的方式<br style="background-color:inherit"> 1、自动创建:在定义主键或唯一键约束时系统会自动在相应的字段上创建唯一性索引<br style="background-color:inherit"> 2、手动创建:用户可以在其他列上创建非唯一索引,以加速查询。<br style="background-color:inherit"> 创建索引:创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。<br style="background-color:inherit"> --在 select 操作占大部分的表上创建索引;<br style="background-color:inherit"> --在 where 子句中出现最频繁的列上创建索引;<br style="background-color:inherit"> --在选择性高的列上创建索引(补充索引选择性,最高是 1,eg:primary key)<br style="background-color:inherit"> --复合索引的主列应该是最有选择性的和 where 限定条件最常用的列,并以此类推第二列……。<br style="background-color:inherit"> --小于 5M 的表,最好不要使用索引来查询,表越小,越适合用全表扫描。<br style="background-color:inherit"> Create [UNIQUE|BITMAP] index<br style="background-color:inherit"> [schema.]index_name on [schema.]table_name(column_name[ASC|DESC],…n,[column_expression])|CLUSTER [schema.]cluster_name<br style="background-color:inherit"> [INITRANS integer]<br style="background-color:inherit"> [MAXTRANS integer]<br style="background-color:inherit"> [PCTFREE integer]<br style="background-color:inherit"> [PCTUESD integer]<br style="background-color:inherit"> [TABLESPACE tablespace_name]<br style="background-color:inherit"> [STORAGE storage_clause]<br style="background-color:inherit"> [NOSORT]<br style="background-color:inherit"> [REVERSE]<br style="background-color:inherit"> UNIQUE 指定索引所基于的列(或多列)值必须唯一。默认的索引是非唯一的。<br style="background-color:inherit"> BITMAP 指定建立位映射索引而不是B*索引。位映射索引保存的行标识符与作为位映射的键值有关。位映射中的每一位都对应于一个可能的行标识符,位设置意味着具有对应行标识符的行包含该键值。<br style="background-color:inherit"> ON table_name 建立基于函数的索引。用table_name的列、常数、SQL函数和自定义函数创建的表达式。指定column_expression,以后用基于函数的索引查询时,必须保证查询该column_expression不为空。<br style="background-color:inherit"> CLUSTER 创建cluster_name簇索引。若表不用schema限制,oracle假设簇包含在你自己的方案中。不能为散列簇创建簇索引。<br style="background-color:inherit"> NOSORT 数据库中的行以升序保存,在创建索引时不必对行排序。若索引列或多列的行不以升序保存,oracle会返回错误。<br style="background-color:inherit"> REVERSE 指定以反序索引块的字节,不包含行标识符。NOSORT不能与REVERSE一起指定。<br style="background-color:inherit"> CREATE INDEX idx_表名_列名 on 表名(列1,列2...)<br style="background-color:inherit"> create index abc on student(sid,sname);<br style="background-color:inherit"> create index abc1 on student(sname,sid);<br style="background-color:inherit"> 这两种索引方式是不一样的<br style="background-color:inherit"> 索引 abc 对 Select * from student where sid=1; 这样的查询语句更有效索引 abc1 对 Select * from student where sname=?louis?; 这样的查询语句更有效<br style="background-color:inherit"> 因此建立索引的时候,字段的组合顺序是非常重要的。一般情况下,需要经常访问的字段放在组合字段的前面<br style="background-color:inherit"> 16.4、使用索引的原则<br style="background-color:inherit"> --查询结果是所有数据行的 5%以下时,使用 index 查询效果最好;<br style="background-color:inherit"> --where 条件中经常用到表的多列时,使用复合索引效果会好于几个单列索引。因为当 sql 语句所查询的列,全部都出现在复合索引中时,此时由于 Oracle 只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多;<br style="background-color:inherit"> --索引利于 select,但对经常 insert,delte 尤其 update 的表,会降低效率。<br style="background-color:inherit"> eg:试比较下面两条 SQL 语句(emp 表的 deptno 列上建有 ununique index):<br style="background-color:inherit"> 语句 A:SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp);<br style="background-color:inherit"> 语句 B:SELECT dname, deptno FROM dept WHERE NOT EXISTS(SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);<br style="background-color:inherit"> 这两条查询语句实现的结果是相同的,但是执行语句 A 的时候,ORACLE 会对整个 emp 表进行扫描,没有使用建立在 emp 表上的 deptno 索引,执行语句 B 的时候,由于在子查询中使用了联合查询,ORACLE 只是对 emp 表进行的部分数据扫描,并利用了 deptno 列的索引,所以语句 B 的效率要比语句 A 的效率高。<br style="background-color:inherit">  <br style="background-color:inherit"> ----where 子句中的这个字段,必须是复合索引的第一个字段;<br style="background-color:inherit"> eg:一个索引是按 f1, f2, f3 的次序建立的,若 where 子句是 f2 = : var2, 则因为 f2 不是索引的第 1 个字段,无法使用该索引。<br style="background-color:inherit"> ---- where 子句中的这个字段,不应该参与任何形式的计算:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。 ----应尽量熟悉各种操作符对 Oracle 是否使用索引的影响:以下这些操作会显式<br style="background-color:inherit"> (explicitly)地阻止 Oracle 使用索引: is null ; is not null ; not in; !=; like ; numeric_col+0;date_col+0; char_col||' '; to_char; to_number,to_date 等。<br style="background-color:inherit"> Eg:<br style="background-color:inherit"> Select jobid from mytabs where isReq='0' and to_date (updatedate) >= to_Date ( '2001-7-18',<br style="background-color:inherit"> 'YYYY-MM-DD');--updatedate 列的索引也不会生效。<br style="background-color:inherit"> 在正确使用索引的前提下,索引可以提高检索相应的表的速度。当用户考虑在表中使用索引时,应遵循下列一些基本原则。<br style="background-color:inherit"> (1)在表中插入数据后创建索引。在表中插入数据后,创建索引效率将更高。如果在装载数据之前创建索引,那么插入每行时oracle都必须更改索引。<br style="background-color:inherit"> (2)索引正确的表和列。如果经常检索包含大量数据的表中小于15%的行,就需要创建索引。为了改善多个表的相互关系,常常使用索引列进行关系连接。<br style="background-color:inherit"> (3)主键和唯一关键字所在的列自动具有索引,但应该在与之关联的表中的外部关键字所在的列上创建索引。<br style="background-color:inherit"> (4)合理安排索引列。在create index 语句中,列的排序会影响查询的性能,通常将最常用的列放在前面。创建一个索引来提高多列的查询效率时,应该清楚地了解这个多列的索引对什么列的存取有效,对什么列的存取无效。<br style="background-color:inherit"> (5)限制表中索引的数量。尽管表可以有任意数量的索引,可是索引越多,在修改表中的数据时对索引做出相应更改的工作量也越大,效率也就越低。同样,目前不用的索引应该及时删除。<br style="background-color:inherit"> (6)指定索引数据块空间的使用。创建索引时,索引的数据块是用表中现存的值填充的,直到达到PCTFREE为止。如果打算将许多行插入到被索引的表中,PCTFREE就应设置得大一点,不能给索引指定PCTUSED。<br style="background-color:inherit"> (7)根据索引大小设置存储参数。创建索引之前应先估计索引的大小,以便更好地促进规划和管理磁盘空间。单个索引项的最大值大约是数据块大小的一半。<br style="background-color:inherit"> 16.6、删除索引<br style="background-color:inherit">  drop index PK_DEPT1;<br style="background-color:inherit"> 16.7、索引类型<br style="background-color:inherit"> B树索引 B-tree indexes;<br style="background-color:inherit"> B树索引又可分为以下子类:<br style="background-color:inherit"> 索引组织表Index-organized tables;<br style="background-color:inherit"> 反转索引Reverse key indexes;<br style="background-color:inherit"> 降序索引Descending indexes;<br style="background-color:inherit"> B树聚簇索引B-tree cluster indexes;<br style="background-color:inherit"> 位图和位图联合索引Bitmap and bitmap join indexes;<br style="background-color:inherit"> 基于函数的索引Function-based indexes;<br style="background-color:inherit"> 应用域索引Application domain indexes;<br style="background-color:inherit"> B-Tree是一个平衡树的结构【注意这里的B表示Balanced平衡的意思,而不是Binary二叉】,B树索引也是Oracle里最为常见的索引类型。B树索引里的数据是已经按照关键字或者是被索引字段事先排好序存放的,默认是升序存放。<br style="background-color:inherit"> 对于这幅B树存储结构图作以下几点介绍:<br style="background-color:inherit"> 1 、索引高度是指从根块到达叶子块时所遍历的数据块的个数,而索引层次=索引高度-1;本图中的索引的高度是3,索引层次等于2;通常,索引的高度是2或者3,即使表中有上百万条记录,也就意味着,从索引中定位一个键字只需要2或3次I/O,索引越高,性能越差;<br style="background-color:inherit"> 2、 B树索引包含两种数据块儿:分枝块(Branch Block)和叶子块(Leaf Block);<br style="background-color:inherit"> 3 、分枝块里存放指向下级分枝块(索引高度大于2,即有超过两层分枝块的情况)或者直接指向叶子块的指针(索引高度等于2,即层次为1的索引);<br style="background-color:inherit"> 4 、叶子块,就是位于B树结构里最底层的数据块。叶子块里存放的是索引条目,即索引关键字和rowid,rowid用来精确定位表里的记录;索引条目都是按照索引关键字+rowid已经排好序存放的;同一个叶子块里的索引条目同时又和左右兄弟条目形成链表,并且是一个双向链表;<br style="background-color:inherit"> 5 、B树索引的所有叶子块一定位于同一层上,这是由B树的数据结构定义的。因此,从根块到达任何一个叶子块的遍历代价都是相同的;<br style="background-color:inherit"> B 树索引(B-Tree Index)<br style="background-color:inherit"> 创建索引的默认类型,结构是一颗树,采用的是平衡 B 树算法:<br style="background-color:inherit"> l 右子树节点的键值大于等于父节点的键值 l 左子树节点的键值小于等于父节点的键值<br style="background-color:inherit"> 位图索引(BitMap Index)<br style="background-color:inherit"> 如果表中的某些字段取值范围比较小,比如职员性别、分数列 ABC 级等。只有两个值。<br style="background-color:inherit"> 这样的字段如果建 B 树索引没有意义,不能提高检索速度。这时我们推荐用位图索引<br style="background-color:inherit"> Create BitMap Index student on(sex);<br style="background-color:inherit"> 索引按功能和索引对象分还有以下类型。<br style="background-color:inherit">     (1)唯一索引意味着不会有两行记录相同的索引键值。唯一索引表中的记录没有RowID,不能再对其建立其他索引。在oracle10g中,要建立唯一索引,必须在表中设置主关键字,建立了唯一索引的表只按照该唯一索引结构排序。<br style="background-color:inherit">     (2)非唯一索引不对索引列的值进行唯一性限制。<br style="background-color:inherit">     (3)分区索引是指索引可以分散地存在于多个不同的表空间中,其优点是可以提高数据查询的效率。<br style="background-color:inherit">     (4)未排序索引也称为正向索引。Oracle10g数据库中的行是按升序排序的,创建索引时不必指定对其排序而使用默认的顺序。<br style="background-color:inherit">     (5)逆序索引也称反向索引。该索引同样保持列按顺序排列,但是颠倒已索引的每列的字节。<br style="background-color:inherit">     按照索引所包含的列数可以把索引分为单列索引和复合索引。索引列只有一列的索引为单列索引,对多列同时索引称为复合索引。<br style="background-color:inherit"> 16.8、管理索引<br style="background-color:inherit"> 1)先插入数据后创建索引<br style="background-color:inherit"> 向表中插入大量数据之前最好不要先创建索引,因为如果先建立索引。那么在插入每行数据的时候都要更改索引。这样会大大降低插入数据的速度。<br style="background-color:inherit"> 2)设置合理的索引列顺序<br style="background-color:inherit"> 3)限制每个表索引的数量<br style="background-color:inherit"> 4)删除不必要的索引<br style="background-color:inherit"> 5)为每个索引指定表空间<br style="background-color:inherit"> 6)经常做 insert,delete 尤其是 update 的表最好定期 exp/imp 表数据,整理数据,降低碎片(缺点:要停应用,以保持数据一致性,不实用);<br style="background-color:inherit">      有索引的最好定期 rebuild 索引(rebuild期间只允许表的 select 操作,可在数据库较空闲时间提交),以降低索引碎片,提高效率<br style="background-color:inherit">  <br style="background-color:inherit"> 16.8、索引问题<br style="background-color:inherit"> 1.一个表的查询语句可以同时用到两个索引。<br style="background-color:inherit">  <br style="background-color:inherit"> 2.索引是以独立于表存在的一种数据库对象,它是对基表的一种排序(默认是 B 树索引就是二叉树的排序方式),比如:<br style="background-color:inherit"> 3.这样的查询效率,肯定是大于没有索引情况的全表扫描(table access full),但是有两个问题。<br style="background-color:inherit">     问题一:建立索引将占用额外的数据库空间,更重要的是增删改操作的时候,索引的排序也必须改变,加大的维护的成本 问题二:如果经常查询 x=?和 y=?,那推荐使用组合 index(x,y),这种情况下组合索引的效率是远高于两个单独的索引的。<br style="background-color:inherit"> 同时在用组合索引的时候,大家一定要注意一个细节:建立组合索引 index(x,y,z)的时候,那在查询条件中出现 x,xy,xyz,yzx 都是可以用到该组合索引,但是 y,yz,z 是不能用到该索引的。<br style="background-color:inherit"> 第十三章 序列、同义词<br style="background-color:inherit"> 13.1、 创建序列(sequence)<br style="background-color:inherit"> CREATE SEQUENCE seq<br style="background-color:inherit">   INCREMENT BY 2--增量<br style="background-color:inherit">   START WITH 2--起始值 不能小于min<br style="background-color:inherit">   MAXVALUE 10--最大值<br style="background-color:inherit">   MINVALUE 1--最小值<br style="background-color:inherit">   CYCLE--/NOCYCLE 序列号是否可循环(到了maxvalue在从min开始)<br style="background-color:inherit">   CACHE 5--/NOCACHE 缓存下一个值,必须满足大于1,小于等于(MAXVALUE-MINVALUE)/INCREMENT<br style="background-color:inherit">   NOORDER--/NOORDER 序列号是否顺序产生<br style="background-color:inherit"> 13.2、 属性 NextVal,CurrVal<br style="background-color:inherit"> --当前值 -----currval<br style="background-color:inherit"> SELECT seq.currval FROM dual;<br style="background-color:inherit"> --下一个值------nextval<br style="background-color:inherit"> SELECT seq.nextval FROM dual;<br style="background-color:inherit"> (必须先有 nextval,才能有 currval)<br style="background-color:inherit"> --在向表中插入数据时使用<br style="background-color:inherit"> INSERT INTO emp1(empno) VALUES(seq.nextval);<br style="background-color:inherit">  使用 cache 或许会跳号, 比如数据库突然不正常 down 掉<br style="background-color:inherit"> (shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况<br style="background-color:inherit"> 13.3、 修改<br style="background-color:inherit"> 不能改变当前值,但是可以改变增量<br style="background-color:inherit"> ALTER SEQUENCE seq INCREMENT BY 3;<br style="background-color:inherit"> ALTER SEQUENCE seq CACHE 3;<br style="background-color:inherit"> 13.4、 删除<br style="background-color:inherit">  DROP SEQUENCE seq;<br style="background-color:inherit"> 13.5、 同义词 (synonym)<br style="background-color:inherit"> Select * from dual;<br style="background-color:inherit"> 为什么?因为同义词的存在<br style="background-color:inherit"> Dual 其实是 sys 用户下的一张表<br style="background-color:inherit"> select table_name from user_tables where lower(table_name) = 'dual';<br style="background-color:inherit"> 1、概念<br style="background-color:inherit"> 同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。与视图类似,同义词并不占用实际存储空间,只有在数据字典中保存了同义词的定义。在Oracle数据库中的大部分数据库对象,如表、视图、同义词、序列、存储过程、包等等,数据库管理员都可以根据实际情况为他们定义同义词。<br style="background-color:inherit"> 同义词,顾名思义就是两个词的意思一样,可以互相替换.<br style="background-color:inherit"> 2、作用:<br style="background-color:inherit"> 1) 多用户协同开发中,可以屏蔽对象的名字及其持有者。如果没有同义词,当操作其他用户的表时,必须通过user名.object名的形式,采用了Oracle同义词之后就可以隐蔽掉user名,当然这里要注意的是:public同义词只是为数据库对象定义了一个公共的别名,其他用户能否通过这个别名访问这个数据库对象,还要看是否已经为这个用户授权。<br style="background-color:inherit"> 2) 简化sql语句。上面的一条其实就是一种简化sql的体现,同时如果自己建的表的名字很长,可以为这个表创建一个Oracle同义词来简化sql开发。<br style="background-color:inherit"> 3)为分布式数据库的远程对象提供位置透明性。<br style="background-color:inherit"> 4)Oracle同义词在数据库链接中的作用<br style="background-color:inherit"> 数据库链接是一个命名的对象,说明一个数据库到另一个数据库的路径,通过其可以实现不同数据库之间的通信。<br style="background-color:inherit"> Create database link 数据库链名 connect to user名 identified by 口令 using ‘Oracle连接串’;<br style="background-color:inherit"> 访问对象要通过 object名@数据库链名。同义词在数据库链中的作用就是提供位置透明性。<br style="background-color:inherit"> 3、分类:<br style="background-color:inherit"> Create synonym dept for soctt.dept;(这样创建的同义词是私有的,只有创建者才能用)<br style="background-color:inherit"> Drop synonym dept;<br style="background-color:inherit"> Create public synonym dept for soctt.dept;(这样创建的同义词才是公有的)<br style="background-color:inherit"> Drop public synonym dept;<br style="background-color:inherit"> 4、权限管理<br style="background-color:inherit"> 与同义词相关的权限有CREATE SYNONYM、CREATE ANY SYNONYM、CREATE PUBLIC SYNONYM权限。<br style="background-color:inherit"> 1:用户在自己的模式下创建私有同义词,这个用户必须拥有CREATE SYNONYM权限,否则不能创建私有同义词。<br style="background-color:inherit"> 2:如果需要在其它模式下创建同义词,则必须具有CREATE ANY SYNONYM的权限。<br style="background-color:inherit"> 3:创建公有同义词则需要CREATE PUBLIC SYNONYM系统权限。<br style="background-color:inherit"> 5、查看同义词<br style="background-color:inherit"> SQL> SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME IN ( 'SYSN_TEST','PUBLIC_TEST');<br style="background-color:inherit"> OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME DB_LINK<br style="background-color:inherit"> ------------------------------ ------------------------------<br style="background-color:inherit"> PUBLIC PUBLIC_TEST ETL TEST<br style="background-color:inherit"> ETL SYSN_TEST ETL TEST<br style="background-color:inherit"> SQL> SELECT * FROM USER_SYNONYMS<br style="background-color:inherit"> 6、使用同义词<br style="background-color:inherit"> SELECT * FROM SYSN_TEST;<br style="background-color:inherit"> 使用同义词可以保证当数据库的位置或对象名称发生改变时,应用程序的代码保持稳定不变,仅需要改变同义词;<br style="background-color:inherit"> 当使用一个没有指定schema的同义词是,首先在用户自己的schema中寻找,然后再公共同义词中寻找<br style="background-color:inherit"> 7、删除同义词<br style="background-color:inherit"> DROP [ PUBLIC ] SYNONYM [ schema. ] 同义词名称 [ FORCE ];<br style="background-color:inherit"> DROP SYNONYM SYSN_TEST;<br style="background-color:inherit"> DROP PUBLIC SYNONYM PUBLIC_TEST;--当同义词的原对象被删除是,同义词并不会被删除<br style="background-color:inherit"> 8、编译同义词<br style="background-color:inherit"> ALTER SYNONYM T COMPILE; --当同义词的原对象被重新建立时,同义词需要重新编译<br style="background-color:inherit"> 对原对象进行DDL操作后,同义词的状态会变成INVALID;当再次引用这个同义词时,同义词会自动编译,状态会变成VALID,无需人工干预,当然前提是不改变原对象的名称<br style="background-color:inherit"> 问题锦集<br style="background-color:inherit"> 1:公用同义词与私有同义词能否同名呢?如果可以,访问同义词时,是共有同义词还是私有同义词优先?<br style="background-color:inherit"> 可以,如果存在公用同义词和私有同义词同名的情况,在访问同义词是,访问的是私有同义词的指向的对象。<br style="background-color:inherit"> 2:为啥OE用户创建的公用同义词,HR用户不能访问呢?<br style="background-color:inherit"> 因为HR没有访问OE模式下对象的权限,如果OE模式给HR用户赋予了SELECT对象等权限,那么HR用户即可访问。<br style="background-color:inherit"> 3:对象、私有同义词、公共同义词是否可以存在三者同名的情况?<br style="background-color:inherit"> 存在同名对象和公共同义词时,数据库优先选择对象作为目标,存在同名私有对象和公共对象时,数据库优先选择私有同义词作为目标<br style="background-color:inherit"> 第十四章 函数<br style="background-color:inherit"> in 只读<br style="background-color:inherit"> out 只写<br style="background-color:inherit"> in out 可读写<br style="background-color:inherit">  函数就是一个有返回值的过程。<br style="background-color:inherit"> 定义一个函数:此函数可以根据雇员的编号查询出雇员的年薪<br style="background-color:inherit"> CREATE OR REPLACE FUNCTION myfun(eno emp.empno%TYPE)<br style="background-color:inherit"> RETURN NUMBER<br style="background-color:inherit"> AS<br style="background-color:inherit">  rsal NUMBER ;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">  SELECT (sal+nvl(comm,0))*12 INTO rsal FROM emp WHERE empno=eno ;<br style="background-color:inherit"> RETURN rsal ;<br style="background-color:inherit"> END ;<br style="background-color:inherit"> /<br style="background-color:inherit"> 直接写 SQL 语句,调用此函数:<br style="background-color:inherit"> SELECT myfun(7369) FROM dual ;<br style="background-color:inherit"> 第十五章 触发器<br style="background-color:inherit"> 15.1分类:<br style="background-color:inherit"> DML触发器-----------基于表的(insert、alter、update)<br style="background-color:inherit"> 替代触发器-----------基于VIEW的<br style="background-color:inherit"> 系统触发器-----------基于系统的<br style="background-color:inherit"> 好处:自动调用、记录日志、保证数据安全、用数据库触发器可以保证数据的一致性和完整性。<br style="background-color:inherit"> 语法:<br style="background-color:inherit"> CREATE [OR REPLACE] TRIGGER trigger_name<br style="background-color:inherit"> {BEFORE | AFTER }<br style="background-color:inherit"> {INSERT | DELETE | UPDATE [OF column [, column …]]}<br style="background-color:inherit"> [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]<br style="background-color:inherit"> ON [schema.]table_name | [schema.]view_name<br style="background-color:inherit"> [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]<br style="background-color:inherit"> [FOR EACH ROW ]<br style="background-color:inherit"> [WHEN condition]<br style="background-color:inherit"> PL/SQL_BLOCK | CALL procedure_name;<br style="background-color:inherit">        <br style="background-color:inherit">        BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。<br style="background-color:inherit">        FOR EACH ROW选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操走影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器。<br style="background-color:inherit">        REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。<br style="background-color:inherit">       WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。<br style="background-color:inherit"> 15.2、 触发器触发次序<br style="background-color:inherit"> 1. 执行 BEFORE语句级触发器;<br style="background-color:inherit"> 2. 对与受语句影响的每一行:<br style="background-color:inherit"> l 执行 BEFORE行级触发器<br style="background-color:inherit"> l 执行 DML语句<br style="background-color:inherit"> l 执行 AFTER行级触发器<br style="background-color:inherit"> 3. 执行 AFTER语句级触发器<br style="background-color:inherit"> 15.3、语句触发器<br style="background-color:inherit"> after 语句触发器<br style="background-color:inherit"> Before 语句触发器<br style="background-color:inherit"> 例如:禁止工作人员在休息日改变雇员信息<br style="background-color:inherit"> create or replace trigger tr_src_emp<br style="background-color:inherit"> before insert or update or delete<br style="background-color:inherit"> on emp<br style="background-color:inherit"> begin<br style="background-color:inherit"> if to_char(sysdate,'DY','nls_date_language=AMERICAN') in( 'SAT','SUN') then<br style="background-color:inherit"> raise_application_error(-20001,'can?t modify user information in weekend');<br style="background-color:inherit"> end if;<br style="background-color:inherit"> end;<br style="background-color:inherit"> /<br style="background-color:inherit">  <br style="background-color:inherit"> 使用条件谓语---------inserting、updating、deleting<br style="background-color:inherit">  create or replace trigger tr_src_emp<br style="background-color:inherit"> before insert or update or delete<br style="background-color:inherit"> on emp<br style="background-color:inherit"> begin<br style="background-color:inherit"> if to_char(sysdate,'DY') in( '星期六','星期天') then<br style="background-color:inherit"> case<br style="background-color:inherit"> when inserting then<br style="background-color:inherit">   raise_application_error(-20001,'fail to insert');<br style="background-color:inherit"> when updating then<br style="background-color:inherit">   raise_application_error(-20001,'fail to update');<br style="background-color:inherit">  when deleting then<br style="background-color:inherit">   raise_application_error(-20001,'fail to delete');<br style="background-color:inherit"> end case;<br style="background-color:inherit"> end if;<br style="background-color:inherit"> end;<br style="background-color:inherit"> /<br style="background-color:inherit"> 15.4、行触发器<br style="background-color:inherit"> 执行 DML 操作时,每作用一行就触发一次触发器。<br style="background-color:inherit"> Bofre 行触发器<br style="background-color:inherit"> 例如:确保员工工资不能低于原有工资<br style="background-color:inherit"> Create or replace trigger tr_emp_sal<br style="background-color:inherit"> before update of sal<br style="background-color:inherit"> on emp<br style="background-color:inherit"> for each row<br style="background-color:inherit"> begin<br style="background-color:inherit"> if :new.sal<:old.sal then<br style="background-color:inherit">  raise_application_error(-20010,'sal should not be less');<br style="background-color:inherit"> end if;<br style="background-color:inherit"> end;<br style="background-color:inherit"> /<br style="background-color:inherit"> after 行触发器<br style="background-color:inherit"> 例如:统计员工工资变化<br style="background-color:inherit"> Create table audit_emp_change(<br style="background-color:inherit"> Name varchar2(10),<br style="background-color:inherit"> Oldsal number(6,2),<br style="background-color:inherit"> Newsal number(6,2),<br style="background-color:inherit"> Time date);<br style="background-color:inherit"> Create or replace trigger tr_sal_sal after update of sal on emp for each row declare v_temp int;<br style="background-color:inherit"> begin<br style="background-color:inherit"> select count(*) into v_temp from audit_emp_change where name=:old.ename; if v_temp=0 then<br style="background-color:inherit"> insert into audit_emp_change values(:old.ename,:old.sal,:new.sal,sysdate); else<br style="background-color:inherit">  update audit_emp_change set oldsal=:old.sal,newsal=:new.sal,time=sysdate where name=:old.ename;<br style="background-color:inherit"> end if; end;<br style="background-color:inherit"> /<br style="background-color:inherit"> 限制行触发器<br style="background-color:inherit"> Create or replace trigger tr_sal_sal<br style="background-color:inherit"> after update of sal<br style="background-color:inherit"> on emp<br style="background-color:inherit"> for each row when (old.job=?SALESMAN?)<br style="background-color:inherit"> declare<br style="background-color:inherit"> v_temp int;<br style="background-color:inherit"> begin<br style="background-color:inherit"> select count(*) into v_temp from audit_emp_change where name=:old.ename;<br style="background-color:inherit"> if v_temp=0 then<br style="background-color:inherit"> insert into audit_emp_change values(:old.ename,:old.sal,:new.sal,sysdate);<br style="background-color:inherit"> else<br style="background-color:inherit">  update audit_emp_change set oldsal=:old.sal,newsal=:new.sal,time=sysdate where name=:old.ename;<br style="background-color:inherit"> end if;<br style="background-color:inherit"> end;<br style="background-color:inherit"> /<br style="background-color:inherit"> 注意:<br style="background-color:inherit"> 例如:如果要基于 EMP 表建立触发器。那么该触发器的执行代码不能包含对 EMP 表的查询操作编写 DML 触发器的时,触发器代码不能从触发器所对应的基表中读取数据。<br style="background-color:inherit"> Create or replace trigger tr_emp_sal<br style="background-color:inherit"> Before update of sal<br style="background-color:inherit"> on emp<br style="background-color:inherit"> For each row<br style="background-color:inherit"> declare<br style="background-color:inherit"> Maxsal number(6,2);<br style="background-color:inherit"> Begin<br style="background-color:inherit"> If :new.sal>maxsal then Select max(sal) into maxsal from emp;<br style="background-color:inherit"> Raise_application_error(-21000,?error?);<br style="background-color:inherit"> End if;<br style="background-color:inherit"> End;<br style="background-color:inherit"> /<br style="background-color:inherit">  创建的时候不会报错。但是一旦执行就报错了<br style="background-color:inherit"> update emp set sal=sal*1.1 where deptno=30<br style="background-color:inherit"> DML触发器的限制<br style="background-color:inherit"> l CREATE TRIGGER语句文本的字符长度不能超过32KB;<br style="background-color:inherit"> l 触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT语句。<br style="background-color:inherit"> l 触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句;<br style="background-color:inherit"> l 由触发器所调用的过程或函数也不能使用数据库事务控制语句;<br style="background-color:inherit"> l 触发器中不能使用LONG, LONG RAW 类型;<br style="background-color:inherit"> l 触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据;<br style="background-color:inherit">  <br style="background-color:inherit">  :NEW 修饰符访问操作完成后列的值<br style="background-color:inherit">  :OLD 修饰符访问操作完成前列的值<br style="background-color:inherit"> 特性<br style="background-color:inherit"> INSERT<br style="background-color:inherit"> UPDATE<br style="background-color:inherit"> DELETE<br style="background-color:inherit"> OLD<br style="background-color:inherit"> NULL<br style="background-color:inherit"> 实际值<br style="background-color:inherit"> 实际值<br style="background-color:inherit"> NEW<br style="background-color:inherit"> 实际值<br style="background-color:inherit"> 实际值<br style="background-color:inherit"> NULL<br style="background-color:inherit">  <br style="background-color:inherit"> 15.4 替代触发器<br style="background-color:inherit"> 语法:<br style="background-color:inherit"> CREATE [OR REPLACE] TRIGGER trigger_name<br style="background-color:inherit"> INSTEAD OF<br style="background-color:inherit"> {INSERT | DELETE | UPDATE [OF column [, column …]]}<br style="background-color:inherit"> [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]<br style="background-color:inherit"> ON [schema.] view_name --只能定义在视图上<br style="background-color:inherit"> [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]<br style="background-color:inherit"> [FOR EACH ROW ] --因为INSTEAD OF触发器只能在行级上触发,所以没有必要指定<br style="background-color:inherit"> [WHEN condition]<br style="background-color:inherit"> PL/SQL_block | CALL procedure_name;<br style="background-color:inherit"> 例2:创建复杂视图,针对INSERT操作创建INSTEAD OF触发器,向复杂视图插入数据。<br style="background-color:inherit"> l 创建视图:<br style="background-color:inherit"> CREATE OR REPLACE FORCE VIEW "HR"."V_REG_COU" ("R_ID", "R_NAME", "C_ID", "C_NAME")<br style="background-color:inherit"> AS<br style="background-color:inherit">  SELECT r.region_id,<br style="background-color:inherit">     r.region_name,<br style="background-color:inherit">     c.country_id,<br style="background-color:inherit">     c.country_name<br style="background-color:inherit">  FROM regions r,<br style="background-color:inherit">     countries c<br style="background-color:inherit">  WHERE r.region_id = c.region_id;<br style="background-color:inherit">  <br style="background-color:inherit"> l 创建触发器:<br style="background-color:inherit"> CREATE OR REPLACE TRIGGER "HR"."TR_I_O_REG_COU"<br style="background-color:inherit"> INSTEAD OF INSERT<br style="background-color:inherit"> ON v_reg_cou<br style="background-color:inherit"> FOR EACH ROW<br style="background-color:inherit"> DECLARE<br style="background-color:inherit"> v_count NUMBER;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">  SELECT COUNT(*) INTO v_count FROM regions WHERE region_id = :new.r_id;<br style="background-color:inherit">  IF v_count = 0 THEN<br style="background-color:inherit">     INSERT INTO regions<br style="background-color:inherit">       (region_id, region_name<br style="background-color:inherit">       ) VALUES<br style="background-color:inherit">       (:new.r_id, :new.r_name<br style="background-color:inherit">       );<br style="background-color:inherit">  END IF;<br style="background-color:inherit">  SELECT COUNT(*) INTO v_count FROM countries WHERE country_id = :new.c_id;<br style="background-color:inherit">  IF v_count = 0 THEN<br style="background-color:inherit">     INSERT<br style="background-color:inherit">     INTO countries<br style="background-color:inherit">       (<br style="background-color:inherit">         country_id,<br style="background-color:inherit">         country_name,<br style="background-color:inherit">         region_id<br style="background-color:inherit">       )<br style="background-color:inherit">       VALUES<br style="background-color:inherit">       (<br style="background-color:inherit">         :new.c_id,<br style="background-color:inherit">         :new.c_name,<br style="background-color:inherit">         :new.r_id<br style="background-color:inherit">       );<br style="background-color:inherit">  END IF;<br style="background-color:inherit"> END;<br style="background-color:inherit">  <br style="background-color:inherit"> 创建INSTEAD OF触发器需要注意以下几点:<br style="background-color:inherit"> l 只能被创建在视图上,并且该视图没有指定WITH CHECK OPTION选项。<br style="background-color:inherit"> l 不能指定BEFORE 或 AFTER选项。<br style="background-color:inherit"> l FOR EACH ROW子可是可选的,即INSTEAD OF触发器只能在行级上触发、或只能是行级触发器,没有必要指定。<br style="background-color:inherit"> l 没有必要在针对一个表的视图上创建INSTEAD OF触发器,只要创建DML触发器就可以了。<br style="background-color:inherit">  <br style="background-color:inherit"> 15.5、系统事件触发器<br style="background-color:inherit"> 语法:<br style="background-color:inherit"> CREATE OR REPLACE TRIGGER [sachema.]trigger_name<br style="background-color:inherit"> {BEFORE<br style="background-color:inherit"> {BEFORE|AFTER}<br style="background-color:inherit"> {ddl_event_list<br style="background-color:inherit"> {ddl_event_list | database_event_list}<br style="background-color:inherit"> ON { DATABASE | [schema.]SCHEMA }<br style="background-color:inherit"> [WHEN condition]<br style="background-color:inherit"> PL/SQL_block | CALL procedure_name;<br style="background-color:inherit"> 其中: ddl_event_list:一个或多个DDL 事件,事件间用 OR 分开;<br style="background-color:inherit">          database_event_list:一个或多个数据库事件,事件间用 OR 分开;<br style="background-color:inherit"> 下面给出系统触发器的种类和事件出现的时机(前或后):<br style="background-color:inherit"> 事件<br style="background-color:inherit"> 允许的时机<br style="background-color:inherit"> 说明<br style="background-color:inherit"> STARTUP<br style="background-color:inherit"> AFTER<br style="background-color:inherit"> 启动数据库实例之后触发<br style="background-color:inherit"> SHUTDOWN<br style="background-color:inherit"> BEFORE<br style="background-color:inherit"> 关闭数据库实例之前触发(非正常关闭不触发)<br style="background-color:inherit"> SERVERERROR<br style="background-color:inherit"> AFTER<br style="background-color:inherit"> 数据库服务器发生错误之后触发<br style="background-color:inherit"> LOGON<br style="background-color:inherit"> AFTER<br style="background-color:inherit"> 成功登录连接到数据库后触发<br style="background-color:inherit"> LOGOFF<br style="background-color:inherit"> BEFORE<br style="background-color:inherit"> 开始断开数据库连接之前触发<br style="background-color:inherit"> CREATE<br style="background-color:inherit"> BEFORE,AFTER<br style="background-color:inherit"> 在执行CREATE语句创建数据库对象之前、之后触发<br style="background-color:inherit"> DROP<br style="background-color:inherit"> BEFORE,AFTER<br style="background-color:inherit"> 在执行DROP语句删除数据库对象之前、之后触发<br style="background-color:inherit"> ALTER<br style="background-color:inherit"> BEFORE,AFTER<br style="background-color:inherit"> 在执行ALTER语句更新数据库对象之前、之后触发<br style="background-color:inherit"> DDL<br style="background-color:inherit"> BEFORE,AFTER<br style="background-color:inherit"> 在执行大多数DDL语句之前、之后触发<br style="background-color:inherit"> GRANT<br style="background-color:inherit"> BEFORE,AFTER<br style="background-color:inherit"> 执行GRANT语句授予权限之前、之后触发<br style="background-color:inherit"> REVOKE<br style="background-color:inherit"> BEFORE,AFTER<br style="background-color:inherit"> 执行REVOKE语句收权限之前、之后触犯发<br style="background-color:inherit"> RENAME<br style="background-color:inherit"> BEFORE,AFTER<br style="background-color:inherit"> 执行RENAME语句更改数据库对象名称之前、之后触犯发<br style="background-color:inherit"> AUDIT / NOAUDIT<br style="background-color:inherit"> BEFORE,AFTER<br style="background-color:inherit"> 执行AUDIT或NOAUDIT进行审计或停止审计之前、之后触发<br style="background-color:inherit"> /*create or replace trigger tr_emp1_1<br style="background-color:inherit">   --before update on emp1<br style="background-color:inherit">   after update on emp1<br style="background-color:inherit">   for each row<br style="background-color:inherit"> declare<br style="background-color:inherit">   -- local variables here<br style="background-color:inherit"> begin<br style="background-color:inherit">   if :new.sal<:old.sal then<br style="background-color:inherit">     Raise_application_error(-20000, ':new.sal>:old.sal');<br style="background-color:inherit">   end if;<br style="background-color:inherit"> end tr;*/<br style="background-color:inherit"> /*create or replace trigger tr_emp1_2<br style="background-color:inherit">    after delete on emp1<br style="background-color:inherit">    --before delete on emp1<br style="background-color:inherit">    for each row<br style="background-color:inherit"> begin<br style="background-color:inherit">   Raise_application_error(-20001, '不能删');<br style="background-color:inherit"> end;*/<br style="background-color:inherit"> create or replace trigger tr_emp1_3<br style="background-color:inherit"> after delete or update or insert on emp1<br style="background-color:inherit"> for each ROW<br style="background-color:inherit"> begin<br style="background-color:inherit">   if deleting then<br style="background-color:inherit">     if :new.sal>0 then<br style="background-color:inherit">        Raise_application_error(-20000, 'deleting');<br style="background-color:inherit">     end IF;<br style="background-color:inherit">   /*elsif updating then<br style="background-color:inherit">     if :new.sal<:old.sal then<br style="background-color:inherit">        Raise_application_error(-20001, 'updating');<br style="background-color:inherit">     end if;<br style="background-color:inherit">   else<br style="background-color:inherit">     if :new.sal<:old.sal then<br style="background-color:inherit">        Raise_application_error(-20002, 'inserting');<br style="background-color:inherit">     end if;*/<br style="background-color:inherit">   end if;<br style="background-color:inherit"> end;<br style="background-color:inherit"> 资料:<br style="background-color:inherit"> http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html<br style="background-color:inherit"> 第十六章 存储过程<br style="background-color:inherit"> 16.1、存储过程<br style="background-color:inherit"> CREATE OR REPLACE PROCEDURE procedure_name AS PL/SQL块<br style="background-color:inherit"> 现在定义一个简单的过程,就是打印一个数字<br style="background-color:inherit"> CREATE OR REPLACE PROCEDURE myproc AS<br style="background-color:inherit">  i NUMBER ;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">  i := 100 ;<br style="background-color:inherit">  DBMS_OUTPUT.put_line('i = '||i) ;<br style="background-color:inherit"> END ;<br style="background-color:inherit"> /<br style="background-color:inherit"> 执行过程: exec 过程名字---------set serveroutput on<br style="background-color:inherit"> 下面编写一个过程,要求,可以传入部门的编号,部门的名称,部门的位置,之后调用此过程就可以完成部门的增加操作。<br style="background-color:inherit"> CREATE OR REPLACE PROCEDURE myproc(dno dept.deptno%TYPE,<br style="background-color:inherit">   name dept.dname%TYPE,<br style="background-color:inherit">   dl dept.loc%TYPE)<br style="background-color:inherit"> AS<br style="background-color:inherit"> cou NUMBER ;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">  -- 判断插入的部门编号是否存在,如果存在则不能插入<br style="background-color:inherit">  SELECT COUNT(deptno) INTO cou FROM dept WHERE deptno=dno ;<br style="background-color:inherit">  IF cou=0 THEN<br style="background-color:inherit">   -- 可以增加新的部门<br style="background-color:inherit"> INSERT INTO dept(deptno,dname,loc) VALUES(dno,name,dl) ; DBMS_OUTPUT.put_line('部门插入成功!') ;<br style="background-color:inherit"> ELSE<br style="background-color:inherit">   DBMS_OUTPUT.put_line('部门已存在,无法插入!') ;<br style="background-color:inherit">  END IF ;<br style="background-color:inherit"> END ;<br style="background-color:inherit"> /<br style="background-color:inherit"> 16.2 过程的参数类型:<br style="background-color:inherit"> ? IN:值传递,默认的-----只读<br style="background-color:inherit"> ? IN OUT:带值进,带值出---可读写<br style="background-color:inherit"> ? OUT:不带值进,带值出----只写<br style="background-color:inherit"> IN OUT 类型:<br style="background-color:inherit"> CREATE OR REPLACE PROCEDURE myproc(dno IN OUT dept.deptno%TYPE,<br style="background-color:inherit"> name dept.dname%TYPE,<br style="background-color:inherit"> dl dept.loc%TYPE) AS<br style="background-color:inherit">  cou NUMBER ;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">  -- 判断插入的部门编号是否存在,如果存在则不能插入<br style="background-color:inherit">  SELECT COUNT(deptno) INTO cou FROM dept WHERE deptno=dno ;<br style="background-color:inherit">  IF cou=0 THEN<br style="background-color:inherit">   -- 可以增加新的部门<br style="background-color:inherit">   INSERT INTO dept(deptno,dname,loc) VALUES(dno,name,dl) ;<br style="background-color:inherit">   DBMS_OUTPUT.put_line('部门插入成功!') ;<br style="background-color:inherit">   -- 修改 dno 的值<br style="background-color:inherit">   dno := 1 ;<br style="background-color:inherit">  ELSE<br style="background-color:inherit">   DBMS_OUTPUT.put_line('部门已存在,无法插入!') ; dno := -1 ;<br style="background-color:inherit">  END IF ;<br style="background-color:inherit"> END ;<br style="background-color:inherit"> /<br style="background-color:inherit"> 编写 PL/SQL 块验证过程:<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">  deptno dept.deptno%TYPE ; BEGIN<br style="background-color:inherit">  deptno := 12 ;<br style="background-color:inherit">  myproc(deptno,'开发','南京') ;<br style="background-color:inherit">  DBMS_OUTPUT.put_line(deptno) ;<br style="background-color:inherit"> END ;<br style="background-color:inherit"> /<br style="background-color:inherit"> OUT 类型 不带任何值进,只把值带出来。<br style="background-color:inherit"> CREATE OR REPLACE PROCEDURE myproc(dno OUT dept.deptno%TYPE)<br style="background-color:inherit"> AS<br style="background-color:inherit">  I number<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">   I:= dno;<br style="background-color:inherit"> END ;<br style="background-color:inherit"> /<br style="background-color:inherit"> 执行上面的存储过程<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">  deptno dept.deptno%TYPE ;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit"> deptno :=myproc(deptno) ;<br style="background-color:inherit">  DBMS_OUTPUT.put_line(deptno) ;<br style="background-color:inherit"> END ;<br style="background-color:inherit"> /<br style="background-color:inherit"> 第十七章 包<br style="background-color:inherit"> 17.1 定义<br style="background-color:inherit"> 包------规范和主体<br style="background-color:inherit"> 包就是将一系列的相关联的PLSQL类型、项目和子程序等有计划的组织起来封装在一起<br style="background-color:inherit"> 规范(包头)---------一个操作或应用的接口部分<br style="background-color:inherit"> 主体----------对包的规范部分进行实现<br style="background-color:inherit"> 语法;<br style="background-color:inherit"> 包的规范<br style="background-color:inherit"> CREATE OR REPLACE PACKAGE package_name AS|IS<br style="background-color:inherit"> 参数、类型(type)、异常(exception)、游标(cursor)、procedure、function<br style="background-color:inherit"> END[package_name];<br style="background-color:inherit"> 包的主体<br style="background-color:inherit"> CREATE OR REPLACE PACKAGE BODY package_name AS|IS<br style="background-color:inherit"> 参数、类型(type)、异常(exception)、游标(cursor)、procedure、function<br style="background-color:inherit"> END[package_name];<br style="background-color:inherit"> 调用:<br style="background-color:inherit"> package_name.type_name;<br style="background-color:inherit"> package_name.item_name;<br style="background-color:inherit"> package_name.call_spec_name;<br style="background-color:inherit"> 删除:<br style="background-color:inherit"> drop package package_name;<br style="background-color:inherit"> drop package body package_name;<br style="background-color:inherit"> 好处:<br style="background-color:inherit"> 1、模块化;-----提高应用程序的交互性<br style="background-color:inherit"> 2、信息隐藏<br style="background-color:inherit"> 例:<br style="background-color:inherit"> CREATE OR REPLACE PACKAGE DEMO_PKG<br style="background-color:inherit"> IS<br style="background-color:inherit">   DEPTREC DEPT%ROWTYPE;<br style="background-color:inherit">  <br style="background-color:inherit">   --Add dept...<br style="background-color:inherit">   FUNCTION add_dept(<br style="background-color:inherit">            dept_no NUMBER,<br style="background-color:inherit">            dept_name VARCHAR2,<br style="background-color:inherit">            location VARCHAR2)<br style="background-color:inherit">   RETURN NUMBER;<br style="background-color:inherit">  <br style="background-color:inherit">   --delete dept...<br style="background-color:inherit">   FUNCTION delete_dept(dept_no NUMBER)<br style="background-color:inherit">   RETURN NUMBER;<br style="background-color:inherit">  <br style="background-color:inherit">   --query dept...<br style="background-color:inherit">   PROCEDURE query_dept(dept_no IN NUMBER);<br style="background-color:inherit"> END DEMO_PKG;<br style="background-color:inherit"> CREATE OR REPLACE PACKAGE BODY DEMO_PKG<br style="background-color:inherit"> IS<br style="background-color:inherit"> FUNCTION add_dept<br style="background-color:inherit"> (<br style="background-color:inherit">    dept_no NUMBER,<br style="background-color:inherit">    dept_name VARCHAR2,<br style="background-color:inherit">    location VARCHAR2<br style="background-color:inherit"> )<br style="background-color:inherit"> RETURN NUMBER<br style="background-color:inherit"> IS<br style="background-color:inherit">   empno_remaining EXCEPTION; --自定义异常<br style="background-color:inherit">   PRAGMA EXCEPTION_INIT(empno_remaining, -1);<br style="background-color:inherit">    /* -1 是违反唯一约束条件的错误代码 */<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">   INSERT INTO dept VALUES(dept_no, dept_name, location);<br style="background-color:inherit">   IF SQL%FOUND THEN<br style="background-color:inherit">      RETURN 1;<br style="background-color:inherit">   END IF;<br style="background-color:inherit"> EXCEPTION<br style="background-color:inherit">      WHEN empno_remaining THEN<br style="background-color:inherit">         RETURN 0;<br style="background-color:inherit">      WHEN OTHERS THEN<br style="background-color:inherit">         RETURN -1;<br style="background-color:inherit"> END add_dept;<br style="background-color:inherit"> FUNCTION delete_dept(dept_no NUMBER)<br style="background-color:inherit"> RETURN NUMBER<br style="background-color:inherit"> IS<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">   DELETE FROM dept WHERE deptno = dept_no;<br style="background-color:inherit">   IF SQL%FOUND THEN<br style="background-color:inherit">     RETURN 1;<br style="background-color:inherit">   ELSE<br style="background-color:inherit">     RETURN 0;<br style="background-color:inherit">    END IF;<br style="background-color:inherit"> EXCEPTION<br style="background-color:inherit">   WHEN OTHERS THEN<br style="background-color:inherit">     RETURN -1;<br style="background-color:inherit"> END delete_dept;<br style="background-color:inherit"> PROCEDURE query_dept<br style="background-color:inherit"> (dept_no IN NUMBER)<br style="background-color:inherit"> IS<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">       SELECT * INTO DeptRec FROM dept WHERE deptno=dept_no;<br style="background-color:inherit"> EXCEPTION<br style="background-color:inherit">        WHEN NO_DATA_FOUND THEN<br style="background-color:inherit">           DBMS_OUTPUT.PUT_LINE('温馨提示:数据库中没有编码为'||dept_no||'的部门');<br style="background-color:inherit">        WHEN TOO_MANY_ROWS THEN<br style="background-color:inherit">           DBMS_OUTPUT.PUT_LINE('程序运行错误,请使用游标进行操作!');<br style="background-color:inherit">        WHEN OTHERS THEN<br style="background-color:inherit">            DBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);<br style="background-color:inherit"> END query_dept;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">     Null;<br style="background-color:inherit"> END DEMO_PKG;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 一、数据库连接<br style="background-color:inherit">     1、JDBC连接<br style="background-color:inherit">           1、加载JDBC驱动程序;<br style="background-color:inherit">                     Class.forName("com.mysql.jdbc.Driver");//oracle.jdbc.OracleDriver<br style="background-color:inherit"> 2、创建数据库的连接;<br style="background-color:inherit"> Connection conn = DriverManager.getConnection(url,user,password);<br style="background-color:inherit"> 3、创建一个Statement对象;<br style="background-color:inherit"> Statement stat = conn.createStatement() ;<br style="background-color:inherit"> //PreparedStatement pstat = conn.prepareStatement(SQL_classification_INSERT);<br style="background-color:inherit"> 4、执行SQL语句;<br style="background-color:inherit"> executeQuery 、executeUpdate  和execute<br style="background-color:inherit"> ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;<br style="background-color:inherit"> //rs=pstat.executeQuery();<br style="background-color:inherit"> 5、返回并处理结果;<br style="background-color:inherit"> while(rs.next()){<br style="background-color:inherit"> ...<br style="background-color:inherit"> }<br style="background-color:inherit"> 6、关闭连接;<br style="background-color:inherit"> rs.close() ;<br style="background-color:inherit"> stat.close();<br style="background-color:inherit"> conn.close();<br style="background-color:inherit">     2、Hibernate连接<br style="background-color:inherit">             <session-factory><br style="background-color:inherit">   <property name="dialect">org.hibernate.dialect.MySQLDialect</property><br style="background-color:inherit">   <property name="connection.url">jdbc:mysql://localhost:3306/eshop_1</property><br style="background-color:inherit">   <property name="connection.username">root</property><br style="background-color:inherit">   <property name="connection.password">107510</property><br style="background-color:inherit">   <property name="connection.driver_class">com.mysql.jdbc.Driver</property><br style="background-color:inherit">   <property name="myeclipse.connection.profile">eshop_1</property><br style="background-color:inherit">   <property name="show_sql">true</property><br style="background-color:inherit">   <property name="format_sql">true</property><br style="background-color:inherit">   <mapping class="com.yhtb.entity.TUsers" /><br style="background-color:inherit">  </session-factory></p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> Configuration cfg=new Configuration().configure();<br style="background-color:inherit">           SessionFactory sf=cfg.buildSessionFactory();------------------2级缓存<br style="background-color:inherit">           Session session=sf.openSession();-------------------------------------1级缓存<br style="background-color:inherit">           Transaction tx=session.beginTransaction();<br style="background-color:inherit">           session.save()//增删改查的动作<br style="background-color:inherit">           tx.commit();<br style="background-color:inherit">           session.close();<br style="background-color:inherit">           sf.close();<br style="background-color:inherit">     3、SSH中数据源连接<br style="background-color:inherit">              <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><br style="background-color:inherit">   <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property><br style="background-color:inherit">   <property name="driverClassName" value="oracle.jdbc.OracleDriver"/><br style="background-color:inherit">   <property name="username" value="scott"></property><br style="background-color:inherit">   <property name="password" value="tiger"></property><br style="background-color:inherit">   <property name="defaultAutoCommit" value="false"></property><br style="background-color:inherit">  </bean><br style="background-color:inherit"> <bean id="sessionFactory"    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><br style="background-color:inherit">   <property name="dataSource"><br style="background-color:inherit">    <ref bean="dataSource" /></property><br style="background-color:inherit">   <property name="hibernateProperties"><br style="background-color:inherit">    <props><prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop><br style="background-color:inherit">     <prop key="hibernate.show_sql">true</prop><br style="background-color:inherit">     <prop key="hibernate.format_sql">true</prop></props></property><br style="background-color:inherit">   <property name="annotatedClasses"><list><value>com.rain.entity.Emp</value></list></property><br style="background-color:inherit">          </bean></p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 二、Oracle<br style="background-color:inherit">     1、 事务的特性<br style="background-color:inherit">         原子性、隔离性、持久性、一致性<br style="background-color:inherit">         savepoint p<br style="background-color:inherit">        commit<br style="background-color:inherit">        rollback</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     2、 动态SQL<br style="background-color:inherit">             dml:<br style="background-color:inherit">   ddl:<br style="background-color:inherit">   占位符’:‘<br style="background-color:inherit"> declare<br style="background-color:inherit">   v_no emp1.ename%type:='&请输入号码'; --&变量绑定符<br style="background-color:inherit">   v_name emp1.ename%type;<br style="background-color:inherit">   v_job emp1.job%type;<br style="background-color:inherit">   v_sql long:='select ename,job from emp1 where ename=:xxx';--占位符<br style="background-color:inherit"> begin<br style="background-color:inherit">    execute immediate v_sql into v_name,v_job using v_no;<br style="background-color:inherit">    dbms_output.put_line('name= '||v_name||' job='||v_job);<br style="background-color:inherit"> end;<br style="background-color:inherit">     3、游标<br style="background-color:inherit">         1、分类:<br style="background-color:inherit">             显示游标----游标名%属性名<br style="background-color:inherit">             隐式游标----SQL%<br style="background-color:inherit">         2、步骤;<br style="background-color:inherit">       显示游标 语法格式:<br style="background-color:inherit"> CURSOR cursor_name is select * from emp;--声明游标<br style="background-color:inherit"> OPEN cursor_name;--打开游标<br style="background-color:inherit"> FETCH cursor_name INTO variables_list;--提取游标<br style="background-color:inherit"> CLOSE cursor_name;--关闭游标<br style="background-color:inherit"> 例1:<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">   v_deptno NUMBER:=&inputno;<br style="background-color:inherit">   v_row emp1%ROWTYPE;<br style="background-color:inherit">   CURSOR v_cursor IS SELECT * FROM emp1 WHERE deptno=v_deptno;--声明游标<br style="background-color:inherit"> BEGIN <br style="background-color:inherit">   OPEN v_cursor; --打开<br style="background-color:inherit">   --提取<br style="background-color:inherit">   LOOP<br style="background-color:inherit">     FETCH v_cursor INTO v_row;--先提取<br style="background-color:inherit">     EXIT WHEN v_cursor%NOTFOUND;<br style="background-color:inherit">     dbms_output.put_line('Employee Name: ' || v_row.ename || ' ,Salary: ' || v_row.sal);<br style="background-color:inherit">   END LOOP;<br style="background-color:inherit">   --关闭<br style="background-color:inherit">   CLOSE v_cursor;<br style="background-color:inherit"> END;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> --隐式游标<br style="background-color:inherit"> 自动打开游标<br style="background-color:inherit"> 自动关闭游标<br style="background-color:inherit"> 通过隐式游标SQL的%ROWCOUNT属性来了解修改了多少行。<br style="background-color:inherit"> DECLARE<br style="background-color:inherit">    v_rows NUMBER;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit"> --更新数据<br style="background-color:inherit">    UPDATE employees SET salary = 30000<br style="background-color:inherit">    WHERE department_id = 90 AND job_id = 'AD_VP';<br style="background-color:inherit"> --获取默认游标的属性值<br style="background-color:inherit">    v_rows := SQL%ROWCOUNT;<br style="background-color:inherit">    DBMS_OUTPUT.PUT_LINE('更新了'||v_rows||'个雇员的工资');<br style="background-color:inherit"> --回退更新,以便使数据库的数据保持原样<br style="background-color:inherit">    ROLLBACK;<br style="background-color:inherit"> END;<br style="background-color:inherit">         3、应用中---for游标----无需声明、打开、提取、关闭<br style="background-color:inherit">            BEGIN<br style="background-color:inherit"> --隐含打开游标<br style="background-color:inherit">    FOR r IN (SELECT * FROM emp1 WHERE deptno=v_deptno) LOOP<br style="background-color:inherit"> --隐含执行一个FETCH语句<br style="background-color:inherit">       dbms_output.put_line('Employee Name: ' || r.ename || ' ,Salary: ' || r.sal);<br style="background-color:inherit"> --隐含监测c_sal%NOTFOUND<br style="background-color:inherit">    END LOOP;<br style="background-color:inherit"> --隐含关闭游标<br style="background-color:inherit">          END;</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     4、视图<br style="background-color:inherit">                1、假表【不存储数据,只存储定义,定义被保存数据字典】<br style="background-color:inherit">      2、作用:数据安全:(隐藏行或者列,保证数据不会被误删除)<br style="background-color:inherit">            简化查询<br style="background-color:inherit">      3、定义格式:<br style="background-color:inherit">        CREATE OR REPLACE VIEW v_表名_业务<br style="background-color:inherit">        as<br style="background-color:inherit">          查询语句<br style="background-color:inherit">     5、索引<br style="background-color:inherit">     1、原理:先在索引中根据关键字找到记录的rowid,然后利用rowid在基表中直接定位记录并检索出来,所以速度快<br style="background-color:inherit">     2、特征:1、索引自动维护<br style="background-color:inherit">                     2、索引需要占据实际存储空间<br style="background-color:inherit">                     3、对于表中的主键列,将自动建立唯一索引          <br style="background-color:inherit">     3、语法:<br style="background-color:inherit">     create index 索引名<br style="background-color:inherit">     on<br style="background-color:inherit">     表名(列1,列2,...)<br style="background-color:inherit">     drop index 索引名<br style="background-color:inherit">    4、作用:提高查询速度,通常情况下,索引应该建立在那些经常出现在where子句中的列上</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     6、序列<br style="background-color:inherit">           1、步骤<br style="background-color:inherit"> CREATE SEQUENCE seq<br style="background-color:inherit">   INCREMENT BY 2--增量<br style="background-color:inherit">   START WITH 2--起始值 不能小于min<br style="background-color:inherit">   MAXVALUE 10--最大值<br style="background-color:inherit">   MINVALUE 1--最小值<br style="background-color:inherit">   CYCLE--/NOCYCLE 序列号是否可循环(到了maxvalue在从min开始)<br style="background-color:inherit">   CACHE 5--/NOCACHE 缓存下一个值,必须满足大于1,小于等于(MAXVALUE-MINVALUE)/INCREMENT<br style="background-color:inherit">   NOORDER--/NOORDER 序列号是否顺序产生<br style="background-color:inherit"> 2、 属性   NextVal,CurrVal<br style="background-color:inherit">           3、作用<br style="background-color:inherit">                 序列通常和触发器一起使用,来自动生成主键</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     7、函数<br style="background-color:inherit">           1、定义:函数就是一个有返回值的过程。<br style="background-color:inherit"> 2、步骤:此函数可以根据雇员的编号查询出雇员的年薪<br style="background-color:inherit"> CREATE OR REPLACE FUNCTION myfun(eno emp.empno%TYPE) <br style="background-color:inherit"> RETURN NUMBER <br style="background-color:inherit"> AS<br style="background-color:inherit">  rsal NUMBER ;<br style="background-color:inherit"> BEGIN<br style="background-color:inherit">  SELECT (sal+nvl(comm,0))*12 INTO rsal FROM emp WHERE empno=eno ;<br style="background-color:inherit"> RETURN rsal ;<br style="background-color:inherit"> END ;<br style="background-color:inherit"> /<br style="background-color:inherit"> 3、直接写 SQL 语句,调用此函数:<br style="background-color:inherit"> SELECT myfun(7369) FROM dual ;<br style="background-color:inherit"> v_dfd := EXEC myfun(7369);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     8、触发器<br style="background-color:inherit">         1、分类;<br style="background-color:inherit"> DML触发器-----------基于表的(insert、alter、update)<br style="background-color:inherit"> 替代触发器-----------基于VIEW的---行级<br style="background-color:inherit"> 系统触发器-----------基于系统的<br style="background-color:inherit">       2、创建步骤;<br style="background-color:inherit">             CREATE [OR REPLACE] TRIGGER trigger_name<br style="background-color:inherit"> {BEFORE | AFTER }<br style="background-color:inherit"> {INSERT | DELETE | UPDATE [OF column [, column …]]}<br style="background-color:inherit"> [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]<br style="background-color:inherit"> ON [schema.]table_name | [schema.]view_name <br style="background-color:inherit"> [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]<br style="background-color:inherit"> [FOR EACH ROW ]<br style="background-color:inherit"> [WHEN condition]<br style="background-color:inherit"> PL/SQL_BLOCK | CALL procedure_name;<br style="background-color:inherit">       3、作用<br style="background-color:inherit">             自动调用、记录日志、保证数据安全、用数据库触发器可以保证数据的一致性和完整性。<br style="background-color:inherit">        <br style="background-color:inherit">          触发器(语句级、行级、谓词、分类、作用)<br style="background-color:inherit">              基于表的触发器:[delete\update\insert]<br style="background-color:inherit"> create or replace trigger tr_src_emp <br style="background-color:inherit"> before insert or update or delete <br style="background-color:inherit"> on emp <br style="background-color:inherit"> begin<br style="background-color:inherit"> if to_char(sysdate,'DY') in( '星期六','星期天') then <br style="background-color:inherit"> case <br style="background-color:inherit"> when inserting then<br style="background-color:inherit">   raise_application_error(-20001,'fail to insert');  <br style="background-color:inherit"> when updating then<br style="background-color:inherit">   raise_application_error(-20001,'fail to update'); <br style="background-color:inherit">  when deleting then<br style="background-color:inherit">   raise_application_error(-20001,'fail to delete'); <br style="background-color:inherit"> end case; <br style="background-color:inherit"> end if; <br style="background-color:inherit"> end;<br style="background-color:inherit"> /</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     9、存储过程<br style="background-color:inherit">         1、定义<br style="background-color:inherit">             CREATE OR REPLACE PROCEDURE procedure_name <br style="background-color:inherit">             AS PL/SQL块<br style="background-color:inherit">         2、参数类型<br style="background-color:inherit">             •  IN:值传递,默认的-----只读<br style="background-color:inherit"> •  IN OUT:带值进,带值出---可读写<br style="background-color:inherit"> •  OUT:不带值进,带值出----只写<br style="background-color:inherit">         3、作用<br style="background-color:inherit">             将通用的执行过程封装起来</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     10、包<br style="background-color:inherit">             1、语法;<br style="background-color:inherit"> 包的规范<br style="background-color:inherit"> CREATE OR REPLACE PACKAGE package_name AS|IS<br style="background-color:inherit"> 参数、类型(type)、异常(exception)、游标(cursor)、procedure、function<br style="background-color:inherit"> END[package_name];</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 包的主体<br style="background-color:inherit"> CREATE OR REPLACE PACKAGE BODY package_name AS|IS<br style="background-color:inherit"> 参数、类型(type)、异常(exception)、游标(cursor)、procedure、function<br style="background-color:inherit"> END[package_name];</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、调用:<br style="background-color:inherit"> package_name.type_name;<br style="background-color:inherit"> package_name.item_name;<br style="background-color:inherit"> package_name.call_spec_name;<br style="background-color:inherit">            3、作用<br style="background-color:inherit">                 1、模块化;-----提高应用程序的交互性<br style="background-color:inherit">                 2、信息隐藏</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">     11、体系结构</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 三、Struts 2.1<br style="background-color:inherit">           1、校验框架<br style="background-color:inherit"> 2、配置文件<br style="background-color:inherit"> <struts><br style="background-color:inherit">   <package name="mypackage" extends="json-default"><br style="background-color:inherit">     <action name="login" class="UsersAction" method="login"><br style="background-color:inherit">       <result name="success" >/index.jsp</result><br style="background-color:inherit">       <result name="error" >/login.jsp</result><br style="background-color:inherit">     </action><br style="background-color:inherit"> </package><br style="background-color:inherit"> </struts></p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 3、国际化<br style="background-color:inherit"> <constant name="struts.i18n.encoding" value="utf-8" /><br style="background-color:inherit"> 4、工作原理<br style="background-color:inherit"> 1、struts1 工作原理</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、struts2工作原理</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 6、struts2标签<br style="background-color:inherit"> <%@taglib uri="/struts-tags" prefix="s"%><br style="background-color:inherit"> 7、EL表达式的四个范围<br style="background-color:inherit">         pageScope、requestScope、sessionScope、appalicationScope<br style="background-color:inherit"> 8、客户端校验和服务端校验的优缺点<br style="background-color:inherit">         客户端校验比服务端校验快,但如果用户禁掉js的话,客户端校验即失效,服务端校验用户不能禁掉<br style="background-color:inherit"> 9、struts2的校验框架------服务端校验有基于action的硬编码和基于xml配置文件两种-------------十三中内置校验器<br style="background-color:inherit"> 一、基于Action的硬编码实现步骤<br style="background-color:inherit"> 1、Action必须extends ActionSpport<br style="background-color:inherit"> 2、对某个方法进行校验,需要在Action中添加一个validateXxx().该方法无需返回值,在该方法中加入 addFieldError(" "," ")或者addActionError(" ");<br style="background-color:inherit"> 3、在配置文件struts.xml中,必须增加一个<result name="input">/验证页面</result><br style="background-color:inherit"> 4、在错误页面上显示错误信息。<br style="background-color:inherit">    a、页面必须使用struts标签<s: addFieldError>、<s:addActionError><br style="background-color:inherit">     b、修改配置文件中的过滤器<br style="background-color:inherit">           <filter-mapping><br style="background-color:inherit">     <filter-name>struts2</filter-name><br style="background-color:inherit">     <url-pattern>/*</url-pattern><br style="background-color:inherit">   </filter-mapping><br style="background-color:inherit"> 二、基于XML配置文件的实现步骤</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> a、找到对应的DTD文件头<br style="background-color:inherit"> <!DOCTYPE validators PUBLIC<br style="background-color:inherit">     "-//OpenSymphony Group//XWork Validator 1.0.2//EN"<br style="background-color:inherit">     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"><br style="background-color:inherit"> 四、Hibernate 3.3</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         1、查询方式<br style="background-color:inherit">             HQL【delete、update、select】<br style="background-color:inherit">             QBC【条件】<br style="background-color:inherit">             QBE【FindByExample】<br style="background-color:inherit">              load/get查询<br style="background-color:inherit">    native SQL查询<br style="background-color:inherit">    命名SQL查询</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         2、缓存<br style="background-color:inherit">             一级缓存:session<br style="background-color:inherit">             二级缓存:sessionFactory</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         3、接口<br style="background-color:inherit">             SessionFactory<br style="background-color:inherit">             Session<br style="background-color:inherit">             Transacation<br style="background-color:inherit">             Query<br style="background-color:inherit">             Criteroa</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         4、对象状态<br style="background-color:inherit">              瞬时态、持久态、游离态</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">         5、关联映射<br style="background-color:inherit">             one-to-many,many-to-one,one-to-one,many-to-many<br style="background-color:inherit">         6、hibernate常见主键增长方式:<br style="background-color:inherit">             increment、identity、native、assigned、foreign、sequence<br style="background-color:inherit">             select max(id) from TABLE<br style="background-color:inherit">             id+1            n+1<br style="background-color:inherit">         7、 hibernate的抓取策略:<br style="background-color:inherit">                select、join、fetch<br style="background-color:inherit">         8、hibernate的延迟策略:<br style="background-color:inherit">               proxy<br style="background-color:inherit">     lazy[关联级别、类级别]<br style="background-color:inherit">         <br style="background-color:inherit"> 五、Spring 3.0</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 1、Spring是什么?<br style="background-color:inherit">    Spring是一个容器框架,它管理所有的JavaBean的生命周期<br style="background-color:inherit">    Spring提供了六大模块:(core、aop、dao、orm、JEE、web)<br style="background-color:inherit">    Spring提供了强大的解耦,【IOC/DI,aop】</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 2、IOC<br style="background-color:inherit">    DI注入的方式:setter、construstor<br style="background-color:inherit">         3、AOP</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 切面(aspect):用来切插业务方法的类。<br style="background-color:inherit"> 连接点(joinpoint):是切面类和业务类的连接点,其实就是封装了业务方法的一些基本属性,作为通知的参数来解析。<br style="background-color:inherit"> 通知(advice):在切面类中,声明对业务方法做额外处理的方法。<br style="background-color:inherit"> 切入点(pointcut):业务类中指定的方法,作为切面切入的点。其实就是指定某个方法作为切面切的地方。<br style="background-color:inherit"> 目标对象(target object):被代理对象。<br style="background-color:inherit"> AOP代理(aop proxy):代理对象。<br style="background-color:inherit"> AOP通知类型:<br style="background-color:inherit"> 前置通知(before advice):在切入点之前执行。<br style="background-color:inherit"> 后置通知(after returning advice):在切入点执行完成后,执行通知。<br style="background-color:inherit"> 环绕通知(around advice):包围切入点,调用方法前后完成自定义行为。<br style="background-color:inherit"> 异常通知(after throwing advice):在切入点抛出异常后,执行通知。<br style="background-color:inherit"> 11、AJAX<br style="background-color:inherit">       1、什么是AJAX<br style="background-color:inherit">             AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。<br style="background-color:inherit">     2、ajax的特点:局部刷新<br style="background-color:inherit">     3、Ajax所涉及的技术:JavaScript、XML、CSS、DOM(文档对象模型,在内存中以树结构存储的模型)<br style="background-color:inherit">     4、Ajax的核心类:XMLHttpRequest               <br style="background-color:inherit">             注意:不同的厂家ActiveXObject(IE5及以下)<br style="background-color:inherit">     5、Ajax常见的框架:JQuery、DOJO、prototype(原型)、DWR(直接web远程访问)、YUI(雅虎用户界面)、ExtJS<br style="background-color:inherit">     6、Ajax应用的开发步骤:<br style="background-color:inherit"> //1、创建XMLHttpRequest()对象<br style="background-color:inherit">    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari<br style="background-color:inherit">      xmlhttp=new XMLHttpRequest();<br style="background-color:inherit">    }else{// code for IE6, IE5<br style="background-color:inherit">      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");<br style="background-color:inherit">    }<br style="background-color:inherit">  //2、处理响应(responseText或responseXML)<br style="background-color:inherit">    xmlhttp.onreadystatechange=function(){<br style="background-color:inherit">       if (xmlhttp.readyState==4 && xmlhttp.status==200){<br style="background-color:inherit">         //局部刷新的代码,通常有以下语句        document.getElementById("data").innerHTML=xmlhttp.responseText;<br style="background-color:inherit">         //js操作Html<br style="background-color:inherit">        }<br style="background-color:inherit">      };<br style="background-color:inherit">    //3、向服务器发送请求<br style="background-color:inherit">    xmlhttp.open("GET","/ajax1/index.jsp?t="+Math.random(),true);<br style="background-color:inherit">    xmlhttp.send();//只有是GET提交时才赋值为NULL</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 12、JSON<br style="background-color:inherit">     1、JSON是什么<br style="background-color:inherit">            a、JavaScript 对象表示法(JavaScript Object Notation)。<br style="background-color:inherit">           {<br style="background-color:inherit"> "employees": [<br style="background-color:inherit"> { "firstName":"Bill" , "lastName":"Gates" },<br style="background-color:inherit"> { "firstName":"George" , "lastName":"Bush" },<br style="background-color:inherit"> { "firstName":"Thomas" , "lastName":"Carter" }<br style="background-color:inherit"> ]<br style="background-color:inherit"> }<br style="background-color:inherit">           b、JSON 是存储和交换文本信息的语法。类似 XML。<br style="background-color:inherit">           c、JSON 比 XML 更小、更快,更易解析<br style="background-color:inherit">     <br style="background-color:inherit"> 13、js的对象<br style="background-color:inherit">      1、内置对象<br style="background-color:inherit">             String: var s = new String("23213");<br style="background-color:inherit">             Date:      var d = new Date();<br style="background-color:inherit">             Math:     Math.random();<br style="background-color:inherit">             Array:     var a = new Array();<br style="background-color:inherit">             Object:   var o = new Object();<br style="background-color:inherit">     2、js的浏览器对象(BOM)<br style="background-color:inherit">             window: window.alert()、 window.confirm、 window.setTimeout()                                               <br style="background-color:inherit">             document:document.getElementById()、<br style="background-color:inherit">                               document.getElementByTagName()<br style="background-color:inherit">             location:window.location.href<br style="background-color:inherit">     3、js中的DOM对象<br style="background-color:inherit">         HTML、BODY、SELECT、INPUT<br style="background-color:inherit">     4、js的自定义对象<br style="background-color:inherit">           <script type="text/javascript"><br style="background-color:inherit">   <!--<br style="background-color:inherit"> 方法一:<br style="background-color:inherit">  //1、定义类<br style="background-color:inherit">   function person(name,sex){<br style="background-color:inherit">    this.name=name;<br style="background-color:inherit">    this.sex=sex;<br style="background-color:inherit">   }<br style="background-color:inherit">  //2、实例化<br style="background-color:inherit">  var p1 = new person("rain","man");</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 方法二:--------------------JSON<br style="background-color:inherit"> 定义并实例化:<br style="background-color:inherit"> var p2 = {"name":"你的","sex":"women"};</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> var p = [{"name":"张三丰","sex":"男","tel":{"t1":"332","t2":"445"}},{"name":"张无忌","sex":"男 "},{"name":"张翠山","sex":"男 "}];</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  //3、显示数据<br style="background-color:inherit">  alert(p.name);<br style="background-color:inherit">  alert(p.sex);<br style="background-color:inherit">  confirm(p.name);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //alert(p[1].name);<br style="background-color:inherit">  //alert(p[0].sex);<br style="background-color:inherit">  //confirm(p[2].name);<br style="background-color:inherit">  alert(p[0].tel.t1);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> //将字符串转化成对象-----------JSON<br style="background-color:inherit">  var pp = '{"name":"张三丰","sex":"男","tel":{"t1":"332","t2":"445"}}';<br style="background-color:inherit">  alert(eval('('+pp+')').name);</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">   //--><br style="background-color:inherit">   </script></p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 14、JQuery<br style="background-color:inherit">         <br style="background-color:inherit">     1、定义:Jquery是一个丰富的js库    <br style="background-color:inherit">     2、JQuery对象就是通过Jquery包装DOM对象后产生的对象</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <script type="text/javascript" src="jquery-1.11.0.js"></script><br style="background-color:inherit">  <script type="text/javascript"><br style="background-color:inherit">  <!--/*//第一种格式:<br style="background-color:inherit">   function f1(){<br style="background-color:inherit">    alert('Hello World!');<br style="background-color:inherit">   };<br style="background-color:inherit">   $(document).ready(f1);<br style="background-color:inherit">  //第二种格式:<br style="background-color:inherit">   $(document).ready(function(){<br style="background-color:inherit">    alert('Hello World!');<br style="background-color:inherit">   });*/<br style="background-color:inherit">  $(document).ready(function(){<br style="background-color:inherit">    //$('#111').css('background-color','blue')<br style="background-color:inherit">    // .css('width','234')<br style="background-color:inherit">    // .css('height','333')//修改样式<br style="background-color:inherit">    // .html('<hr/>hello')//修改值<br style="background-color:inherit">    // .html();//取值<br style="background-color:inherit">    //$('#111').css({'background-color':'blue','width':'120','height':'120'})//修改样式<br style="background-color:inherit">    // .text('<hr/>hello');//修改值<br style="background-color:inherit">    //$('.222,#111').html('<hr/>');<br style="background-color:inherit">    //$('div:last').html('hehehhe');<br style="background-color:inherit">    //$('div:first').html('hehehhe');<br style="background-color:inherit">    //$('#111>p').html('<hr/>');<br style="background-color:inherit">    //$('#111 p').html('<hr/>');<br style="background-color:inherit">    //$('#111+.222').html('<hr/>');<br style="background-color:inherit">    //$('#111 ~ p').html('<hr/>');<br style="background-color:inherit">    //$('tr:odd').css({'background-color':'blue'});<br style="background-color:inherit">    //$('tr:even').css('background-color','#eeffee');<br style="background-color:inherit">    //$('tr:eq(0)').css({'background-color':'blue'});<br style="background-color:inherit">    //$('tr:gt(1)').css({'background-color':'blue'});<br style="background-color:inherit">    $('tr:lt(1)').css({'background-color':'blue'});<br style="background-color:inherit">  });<br style="background-color:inherit">  //--></script> </head><br style="background-color:inherit">  <body><br style="background-color:inherit">   <div id="111">sssssssssss<br style="background-color:inherit">   <p>sfdsf</p><br style="background-color:inherit">   </div><br style="background-color:inherit">   <p>sfdsf</p><br style="background-color:inherit">   <div class="222">sssssssssss</div><br style="background-color:inherit">   <div >sssssssssss</div><br style="background-color:inherit">   <table border="1"><center><br style="background-color:inherit">  <tr><td>1</td><td>1</td></tr><br style="background-color:inherit">  <tr><td>22</td><td>22</td></tr><br style="background-color:inherit">  <tr><td>333</td><td>333</td></tr><br style="background-color:inherit">  <tr><td>4444</td><td>4444</td></tr><br style="background-color:inherit">   </table></center></body></p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 例2:<br style="background-color:inherit"> <script type="text/javascript" src="jquery-1.11.0.js"></script><br style="background-color:inherit">    <script type="text/javascript"><br style="background-color:inherit">     $(function(){<br style="background-color:inherit">      alert(222);<br style="background-color:inherit">      $('button').click(function(){<br style="background-color:inherit">       $('#list').load('index.jsp');<br style="background-color:inherit">      });<br style="background-color:inherit">     });<br style="background-color:inherit">    </script><br style="background-color:inherit">   </head><br style="background-color:inherit">  <br style="background-color:inherit">   <body><br style="background-color:inherit">     <div id="list"></div><br style="background-color:inherit">     <button>获取服务器数据</button><br style="background-color:inherit">   </body><br style="background-color:inherit"> 六、SSH<br style="background-color:inherit"> Spring----------3.0<br style="background-color:inherit">         定义:是一个管理JavaBean生命周期的容器型的轻量型框架,包含六大模块DAO、ORM、Web、Core、JEE、AOP<br style="background-color:inherit"> Hibernate------3.3<br style="background-color:inherit">         ORM持久型框架---映射---POJO的属性和表中的字段,对象和表,POJO的属性的类型与表中字段的属性的类型<br style="background-color:inherit"> Struts-----------1.3/2.1<br style="background-color:inherit">         MVC的web轻量型框架</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> VO--------------------值对象<br style="background-color:inherit"> DTO------------------数据传输对象<br style="background-color:inherit"> BO--------------------业务对象<br style="background-color:inherit"> PO---------------------持久化对象<br style="background-color:inherit"> POJO-----------------简单无规则Java对象(JavaBean)<br style="background-color:inherit"> DAO-------------------数据访问对象</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 七、泛型DAO<br style="background-color:inherit">         1、设计通用DAO接口 <br style="background-color:inherit">       public interface IGenericDAO<T,ID extends Serializable>{<br style="background-color:inherit">          public abstract void save(T entity);<br style="background-color:inherit">          public abstract void update(T entity);<br style="background-color:inherit">          public abstract void delete(ID id);<br style="background-color:inherit">          public abstract T findById(ID id);<br style="background-color:inherit">          public abstract List<T> findAll();<br style="background-color:inherit">          public abstract List<T> findByExample(T entity);<br style="background-color:inherit">          public abstract int count(T entity);<br style="background-color:inherit">          public abstract pageVO<T> findByPage(T entity,int currentpage,int pageSize);<br style="background-color:inherit">       }<br style="background-color:inherit">  <br style="background-color:inherit"> 2、设计通用DAO的实现类<br style="background-color:inherit">      public class GenericDAOImpl<T,ID extends Serializable> extends HibernateDaoSupport implements IGenericDAO<T,ID>{<br style="background-color:inherit">          protected class<?> clazz;<br style="background-color:inherit">         //初始化clazz<br style="background-color:inherit">         public GenericDAOImpl(){<br style="background-color:inherit">  //1、得到我们的通用范型实现类的子类,例如:得到EmpDAOImpl<br style="background-color:inherit">      Class<?> cls=getClass();<br style="background-color:inherit">  //2、得到具体类【EmpDAOImpl】的父类,由于父类是范型类,所以,方法为:<br style="background-color:inherit">      ParameterizedType ptype=(ParameterizedType)cls.getGenericSuperclass();<br style="background-color:inherit">  //3、得到具体的参数实际类型<br style="background-color:inherit">     clazz=(Class<?>)(ptype.getActualTypeArguments()[0]);<br style="background-color:inherit">         }<br style="background-color:inherit">  <br style="background-color:inherit">          public void save(T entity){<br style="background-color:inherit">              getHibernateTemplate().save(entity);<br style="background-color:inherit">          }<br style="background-color:inherit">          public void update(T entity){<br style="background-color:inherit">              getHibernateTemplate().update(entity);<br style="background-color:inherit">          }<br style="background-color:inherit">          public void delete(ID id){<br style="background-color:inherit">              getHibernateTemplate().delete(id);<br style="background-color:inherit">          }<br style="background-color:inherit">          public T findById(ID id){<br style="background-color:inherit">                return T(getHibernateTemplate().get(clazz,id));<br style="background-color:inherit">          }<br style="background-color:inherit">          public List<T> findAll(){<br style="background-color:inherit">    DetachedCriteria criteria=DetachedCriteria.forClass(entityClass);<br style="background-color:inherit">   return getHibernateTemplate().findByCriteria(criteria);;<br style="background-color:inherit">   }<br style="background-color:inherit">          public List<T> findByExample(T entity){<br style="background-color:inherit">   return getHibernateTemplate().findByExample(instance);<br style="background-color:inherit">   }<br style="background-color:inherit">          public int count(T entity){}<br style="background-color:inherit">          public pageVO<T> findByPage(T entity,int currentpage,int pageSize){}<br style="background-color:inherit">      <br style="background-color:inherit"> 3、设计每个业务DAO接口,例如IEmpDAO<br style="background-color:inherit">       public interface IEmpDAO extends IGenericDAO<Emp,Integer>{<br style="background-color:inherit">           //新增自己DAO的特有方法:例如登录<br style="background-color:inherit">           Emp login(String account,String password);<br style="background-color:inherit">       }<br style="background-color:inherit"> 4、设计每个业务DAO的实现类,例如EmpDAOImpl<br style="background-color:inherit">       public class EmpDAOImpl extends GenericDAOImpl<Emp,Integer> implements IEmpDAO{<br style="background-color:inherit">               public Emp login(String account,String password){<br style="background-color:inherit">                   return null;<br style="background-color:inherit">               }<br style="background-color:inherit">       }<br style="background-color:inherit">     }</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> 购物车</p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px">  </p> <p style="margin-top:5px; margin-bottom:5px; font-family:微软雅黑; font-size:14px; line-height:21px"> <br style="background-color:inherit"> 链接:<br style="background-color:inherit"> 1、JAVA<br style="background-color:inherit"> 2、JDBC<br style="background-color:inherit"> 3、OA开发<br style="background-color:inherit"> 4、Oracle<br style="background-color:inherit"> 5、WEB<br style="background-color:inherit"> 6、AJAX<br style="background-color:inherit"> 7、Hibernate<br style="background-color:inherit"> 8、Spring<br style="background-color:inherit"> 9、struts1<br style="background-color:inherit"> 10、总结</p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1279102219840405504"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(java)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835509897106649088.htm" title="Long类型前后端数据不一致" target="_blank">Long类型前后端数据不一致</a> <span class="text-muted">igotyback</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>响应给前端的数据浏览器控制台中response中看到的Long类型的数据是正常的到前端数据不一致前后端数据类型不匹配是一个常见问题,尤其是当后端使用Java的Long类型(64位)与前端JavaScript的Number类型(最大安全整数为2^53-1,即16位)进行数据交互时,很容易出现精度丢失的问题。这是因为JavaScript中的Number类型无法安全地表示超过16位的整数。为了解决这个问</div> </li> <li><a href="/article/1835509769822105600.htm" title="LocalDateTime 转 String" target="_blank">LocalDateTime 转 String</a> <span class="text-muted">igotyback</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassMain{publicstaticvoidmain(String[]args){//获取当前时间LocalDateTimenow=LocalDateTime.now();//定义日期格式化器DateTimeFormatterformat</div> </li> <li><a href="/article/1835509391361667072.htm" title="Linux下QT开发的动态库界面弹出操作(SDL2)" target="_blank">Linux下QT开发的动态库界面弹出操作(SDL2)</a> <span class="text-muted">13jjyao</span> <a class="tag" taget="_blank" href="/search/QT%E7%B1%BB/1.htm">QT类</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/sdl2/1.htm">sdl2</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>需求:操作系统为linux,开发框架为qt,做成需带界面的qt动态库,调用方为java等非qt程序难点:调用方为java等非qt程序,也就是说调用方肯定不带QApplication::exec(),缺少了这个,QTimer等事件和QT创建的窗口将不能弹出(包括opencv也是不能弹出);这与qt调用本身qt库是有本质的区别的思路:1.调用方缺QApplication::exec(),那么我们在接口</div> </li> <li><a href="/article/1835498925755297792.htm" title="DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理" target="_blank">DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理</a> <span class="text-muted">STU学生网页设计</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/%E6%9C%9F%E6%9C%AB%E7%BD%91%E9%A1%B5%E4%BD%9C%E4%B8%9A/1.htm">期末网页作业</a><a class="tag" taget="_blank" href="/search/html%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5/1.htm">html静态网页</a><a class="tag" taget="_blank" href="/search/html5%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">html5期末大作业</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/web%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web大作业</a> <div>️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程</div> </li> <li><a href="/article/1835498547785592832.htm" title="【华为OD机试真题2023B卷 JAVA&JS】We Are A Team" target="_blank">【华为OD机试真题2023B卷 JAVA&JS】We Are A Team</a> <span class="text-muted">若博豆</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA/1.htm">华为</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>华为OD2023(B卷)机试题库全覆盖,刷题指南点这里WeAreATeam时间限制:1秒|内存限制:32768K|语言限制:不限题目描述:总共有n个人在机房,每个人有一个标号(1&lt;=标号&lt;=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:1、消息构成为:abc,整数a、b分别代</div> </li> <li><a href="/article/1835496149843275776.htm" title="关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript" target="_blank">关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a><a class="tag" taget="_blank" href="/search/%E9%A3%8E%E6%99%AF/1.htm">风景</a> <div>⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip</div> </li> <li><a href="/article/1835496148601761792.htm" title="HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动" target="_blank">HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/web%E8%AE%BE%E8%AE%A1%E7%BD%91%E9%A1%B5%E8%A7%84%E5%88%92%E4%B8%8E%E8%AE%BE%E8%AE%A1/1.htm">web设计网页规划与设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/dreamweaver/1.htm">dreamweaver</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线</div> </li> <li><a href="/article/1835492740536823808.htm" title="node.js学习" target="_blank">node.js学习</a> <span class="text-muted">小猿L</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a> <div>node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行</div> </li> <li><a href="/article/1835476093189058560.htm" title="Java 重写(Override)与重载(Overload)" target="_blank">Java 重写(Override)与重载(Overload)</a> <span class="text-muted">叨唧唧的</span> <div>Java重写(Override)与重载(Overload)重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。也就是说子类能够根据需要实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如:父类的一个方法申明了一个检查异常IOExceptio</div> </li> <li><a href="/article/1835473830873755648.htm" title="简单了解 JVM" target="_blank">简单了解 JVM</a> <span class="text-muted">记得开心一点啊</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>目录♫什么是JVM♫JVM的运行流程♫JVM运行时数据区♪虚拟机栈♪本地方法栈♪堆♪程序计数器♪方法区/元数据区♫类加载的过程♫双亲委派模型♫垃圾回收机制♫什么是JVMJVM是JavaVirtualMachine的简称,意为Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统(如:JVM、VMwave、VirtualBox)。JVM和其他两个虚拟机</div> </li> <li><a href="/article/1835471058648526848.htm" title="1分钟解决 -bash: mvn: command not found,在Centos 7中安装Maven" target="_blank">1分钟解决 -bash: mvn: command not found,在Centos 7中安装Maven</a> <span class="text-muted">Energet!c</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>1分钟解决-bash:mvn:commandnotfound,在Centos7中安装Maven检查Java环境1下载Maven2解压Maven3配置环境变量4验证安装5常见问题与注意事项6总结检查Java环境Maven依赖Java环境,请确保系统已经安装了Java并配置了环境变量。可以通过以下命令检查:java-version如果未安装,请先安装Java。1下载Maven从官网下载:前往Apach</div> </li> <li><a href="/article/1835469672334585856.htm" title="Java企业面试题3" target="_blank">Java企业面试题3</a> <span class="text-muted">马龙强_</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1.break和continue的作用(智*图)break:用于完全退出一个循环(如for,while)或一个switch语句。当在循环体内遇到break语句时,程序会立即跳出当前循环体,继续执行循环之后的代码。continue:用于跳过当前循环体中剩余的部分,并开始下一次循环。如果是在for循环中使用continue,则会直接进行条件判断以决定是否执行下一轮循环。2.if分支语句和switch分</div> </li> <li><a href="/article/1835468916290318336.htm" title="JVM、JRE和 JDK:理解Java开发的三大核心组件" target="_blank">JVM、JRE和 JDK:理解Java开发的三大核心组件</a> <span class="text-muted">Y雨何时停T</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>Java是一门跨平台的编程语言,它的成功离不开背后强大的运行环境与开发工具的支持。在Java的生态中,JVM(Java虚拟机)、JRE(Java运行时环境)和JDK(Java开发工具包)是三个至关重要的核心组件。本文将探讨JVM、JDK和JRE的区别,帮助你更好地理解Java的运行机制。1.JVM:Java虚拟机(JavaVirtualMachine)什么是JVM?JVM,即Java虚拟机,是Ja</div> </li> <li><a href="/article/1835464504918503424.htm" title="Java面试题精选:消息队列(二)" target="_blank">Java面试题精选:消息队列(二)</a> <span class="text-muted">芒果不是芒</span> <a class="tag" taget="_blank" href="/search/Java%E9%9D%A2%E8%AF%95%E9%A2%98%E7%B2%BE%E9%80%89/1.htm">Java面试题精选</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a> <div>一、Kafka的特性1.消息持久化:消息存储在磁盘,所以消息不会丢失2.高吞吐量:可以轻松实现单机百万级别的并发3.扩展性:扩展性强,还是动态扩展4.多客户端支持:支持多种语言(Java、C、C++、GO、)5.KafkaStreams(一个天生的流处理):在双十一或者销售大屏就会用到这种流处理。使用KafkaStreams可以快速的把销售额统计出来6.安全机制:Kafka进行生产或者消费的时候会</div> </li> <li><a href="/article/1835462485629562880.htm" title="白骑士的Java教学基础篇 2.5 控制流语句" target="_blank">白骑士的Java教学基础篇 2.5 控制流语句</a> <span class="text-muted">白骑士所长</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E6%95%99%E5%AD%A6/1.htm">教学</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>欢迎继续学习Java编程的基础篇!在前面的章节中,我们了解了Java的变量、数据类型和运算符。接下来,我们将探讨Java中的控制流语句。控制流语句用于控制程序的执行顺序,使我们能够根据特定条件执行不同的代码块,或重复执行某段代码。这是编写复杂程序的基础。通过学习这一节内容,你将掌握如何使用条件语句和循环语句来编写更加灵活和高效的代码。条件语句条件语句用于根据条件的真假来执行不同的代码块。if语句‘</div> </li> <li><a href="/article/1835462232612368384.htm" title="python语法——三目运算符" target="_blank">python语法——三目运算符</a> <span class="text-muted">HappyRocking</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E4%B8%89%E7%9B%AE%E8%BF%90%E7%AE%97%E7%AC%A6/1.htm">三目运算符</a> <div>在java中,有三目运算符,如:intc=(a&gt;b)?a:b表示c取两者中的较大值。但是在python,不能直接这样使用,估计是因为冒号在python有分行的关键作用。那么在python中,如何实现类似功能呢?可以使用ifelse语句,也是一行可以完成,格式为:aifbelsec表示如果b为True,则表达式等于a,否则等于c。如:c=(aif(a&gt;b)elseb)同样是完成了取最大值的功能。</div> </li> <li><a href="/article/1835457442260021248.htm" title="ArrayList 源码解析" target="_blank">ArrayList 源码解析</a> <span class="text-muted">程序猿进阶</span> <a class="tag" taget="_blank" href="/search/Java%E5%9F%BA%E7%A1%80/1.htm">Java基础</a><a class="tag" taget="_blank" href="/search/ArrayList/1.htm">ArrayList</a><a class="tag" taget="_blank" href="/search/List/1.htm">List</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/1.htm">架构设计</a><a class="tag" taget="_blank" href="/search/idea/1.htm">idea</a> <div>ArrayList是Java集合框架中的一个动态数组实现,提供了可变大小的数组功能。它继承自AbstractList并实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量capacity,表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添</div> </li> <li><a href="/article/1835454921990828032.htm" title="Java爬虫框架(一)--架构设计" target="_blank">Java爬虫框架(一)--架构设计</a> <span class="text-muted">狼图腾-狼之传说</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BB%BB%E5%8A%A1/1.htm">任务</a><a class="tag" taget="_blank" href="/search/html%E8%A7%A3%E6%9E%90%E5%99%A8/1.htm">html解析器</a><a class="tag" taget="_blank" href="/search/%E5%AD%98%E5%82%A8/1.htm">存储</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1/1.htm">电子商务</a> <div>一、架构图那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。爬虫:爬虫负责爬取,解析,处理电子商务网站的网页的内容数据库:存储商品信息索引:商品的全文搜索索引Task队列:需要爬取的网页列表Visited表:已经爬取过的网页列表爬虫监控平台:web平台可以启动,停止爬虫,管理爬虫,task队列,visited表。二、爬虫1.流程1)Scheduler启动爬虫器,TaskMast</div> </li> <li><a href="/article/1835454543471669248.htm" title="Java:爬虫框架" target="_blank">Java:爬虫框架</a> <span class="text-muted">dingcho</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a> <div>一、ApacheNutch2【参考地址】Nutch是一个开源Java实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。Nutch致力于让每个人能很容易,同时花费很少就可以配置世界一流的Web搜索引擎.为了完成这一宏伟的目标,Nutch必须能够做到:每个月取几十亿网页为这些网页维护一个索引对索引文件进行每秒上千次的搜索提供高质量的搜索结果简单来说Nutch支持分</div> </li> <li><a href="/article/1835450890077696000.htm" title="python怎么将png转为tif_png转tif" target="_blank">python怎么将png转为tif_png转tif</a> <span class="text-muted">weixin_39977276</span> <div>发国外的文章要求图片是tif,cmyk色彩空间的。大小尺寸还有要求。比如网上大神多,找到了一段代码,感谢!https://www.jianshu.com/p/ec2af4311f56https://github.com/KevinZc007/image2Tifimportjava.awt.image.BufferedImage;importjava.io.File;importjava.io.Fi</div> </li> <li><a href="/article/1835448239864770560.htm" title="JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)" target="_blank">JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)</a> <span class="text-muted">跳房子的前端</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95/1.htm">前端面试</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>在JavaScript中,深拷贝(DeepCopy)和浅拷贝(ShallowCopy)是用于复制对象或数组的两种不同方法。了解它们的区别和应用场景对于避免潜在的bugs和高效地处理数据非常重要。以下是对深拷贝和浅拷贝的详细解释,包括它们的概念、用途、优缺点以及实现方式。1.浅拷贝(ShallowCopy)概念定义:浅拷贝是指创建一个新的对象或数组,其中包含了原对象或数组的基本数据类型的值和对引用数</div> </li> <li><a href="/article/1835444076007223296.htm" title="JAVA·一个简单的登录窗口" target="_blank">JAVA·一个简单的登录窗口</a> <span class="text-muted">MortalTom</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>文章目录概要整体架构流程技术名词解释技术细节资源概要JavaSwing是Java基础类库的一部分,主要用于开发图形用户界面(GUI)程序整体架构流程新建项目,导入sql.jar包(链接放在了文末),编译项目并运行技术名词解释一、特点丰富的组件提供了多种可视化组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)、下拉列表(JComboBox)等,可以满足不同的界面设计</div> </li> <li><a href="/article/1835438028009598976.htm" title="WebMagic:强大的Java爬虫框架解析与实战" target="_blank">WebMagic:强大的Java爬虫框架解析与实战</a> <span class="text-muted">Aaron_945</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录引言官网链接WebMagic原理概述基础使用1.添加依赖2.编写PageProcessor高级使用1.自定义Pipeline2.分布式抓取优点结论引言在大数据时代,网络爬虫作为数据收集的重要工具,扮演着不可或缺的角色。Java作为一门广泛使用的编程语言,在爬虫开发领域也有其独特的优势。WebMagic是一个开源的Java爬虫框架,它提供了简单灵活的API,支持多线程、分布式抓取,以及丰富的</div> </li> <li><a href="/article/1835437775344726016.htm" title="博客网站制作教程" target="_blank">博客网站制作教程</a> <span class="text-muted">2401_85194651</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java</div> </li> <li><a href="/article/1835435506645692416.htm" title="00. 这里整理了最全的爬虫框架(Java + Python)" target="_blank">00. 这里整理了最全的爬虫框架(Java + Python)</a> <span class="text-muted">有一只柴犬</span> <a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E7%B3%BB%E5%88%97/1.htm">爬虫系列</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>目录1、前言2、什么是网络爬虫3、常见的爬虫框架3.1、java框架3.1.1、WebMagic3.1.2、Jsoup3.1.3、HttpClient3.1.4、Crawler4j3.1.5、HtmlUnit3.1.6、Selenium3.2、Python框架3.2.1、Scrapy3.2.2、BeautifulSoup+Requests3.2.3、Selenium3.2.4、PyQuery3.2</div> </li> <li><a href="/article/1835429581205630976.htm" title="JAVA学习笔记之23种设计模式学习" target="_blank">JAVA学习笔记之23种设计模式学习</a> <span class="text-muted">victorfreedom</span> <a class="tag" taget="_blank" href="/search/Java%E6%8A%80%E6%9C%AF/1.htm">Java技术</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B8%B8%E7%94%A8%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">常用设计模式</a> <div>博主最近买了《设计模式》这本书来学习,无奈这本书是以C++语言为基础进行说明,整个学习流程下来效率不是很高,虽然有的设计模式通俗易懂,但感觉还是没有充分的掌握了所有的设计模式。于是博主百度了一番,发现有大神写过了这方面的问题,于是博主迅速拿来学习。一、设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器</div> </li> <li><a href="/article/1835428948339683328.htm" title="JavaScript `Map` 和 `WeakMap`详细解释" target="_blank">JavaScript `Map` 和 `WeakMap`详细解释</a> <span class="text-muted">跳房子的前端</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E5%8E%9F%E7%94%9F%E6%96%B9%E6%B3%95/1.htm">原生方法</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在JavaScript中,Map和WeakMap都是用于存储键值对的数据结构,但它们有一些关键的不同之处。MapMap是一种可以存储任意类型的键值对的集合。它保持了键值对的插入顺序,并且可以通过键快速查找对应的值。Map提供了一些非常有用的方法和属性来操作这些数据对:set(key,value):将一个键值对添加到Map中。如果键已经存在,则更新其对应的值。get(key):获取指定键的值。如果键</div> </li> <li><a href="/article/1835419870070665216.htm" title="切换淘宝最新npm镜像源是" target="_blank">切换淘宝最新npm镜像源是</a> <span class="text-muted">hai40587</span> <a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>切换淘宝最新npm镜像源是一个相对简单的过程,但首先需要明确当前淘宝npm镜像源的状态和最新的镜像地址。由于网络环境和服务更新,镜像源的具体地址可能会发生变化,因此,我将基于当前可获取的信息,提供一个通用的切换步骤,并附上最新的镜像地址(截至回答时)。一、了解npm镜像源npm(NodePackageManager)是JavaScript的包管理器,用于安装、更新和管理项目依赖。由于npm官方仓库</div> </li> <li><a href="/article/1835417602004971520.htm" title="【Java】已解决:java.util.concurrent.CompletionException" target="_blank">【Java】已解决:java.util.concurrent.CompletionException</a> <span class="text-muted">屿小夏</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录一、分析问题背景出现问题的场景代码片段二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项已解决:java.util.concurrent.CompletionException一、分析问题背景在Java并发编程中,java.util.concurrent.CompletionException是一种常见的运行时异常,通常在使用CompletableFuture进行异步计算时出现</div> </li> <li><a href="/article/1835411171054809088.htm" title="设计模式之建造者模式(通俗易懂--代码辅助理解【Java版】)" target="_blank">设计模式之建造者模式(通俗易懂--代码辅助理解【Java版】)</a> <span class="text-muted">ok!ko</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F/1.htm">建造者模式</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>文章目录设计模式概述1、建造者模式2、建造者模式使用场景3、优点4、缺点5、主要角色6、代码示例:1)实现要求2)UML图3)实现步骤:1)创建一个表示食物条目和食物包装的接口2)创建实现Packing接口的实体类3)创建实现Item接口的抽象类,该类提供了默认的功能4)创建扩展了Burger和ColdDrink的实体类5)创建一个Meal类,带有上面定义的Item对象6)创建一个MealBuil</div> </li> <li><a href="/article/85.htm" title="ztree异步加载" target="_blank">ztree异步加载</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/ztree/1.htm">ztree</a> <div>相信新手用ztree的时候,对异步加载会有些困惑,我开始的时候也是看了API花了些时间才搞定了异步加载,在这里分享给大家。 我后台代码生成的是json格式的数据,数据大家按各自的需求生成,这里只给出前端的代码。 设置setting,这里只关注async属性的配置 var setting = { //异步加载配置 </div> </li> <li><a href="/article/212.htm" title="thirft rpc 具体调用流程" target="_blank">thirft rpc 具体调用流程</a> <span class="text-muted">BlueSkator</span> <a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a><a class="tag" taget="_blank" href="/search/thrift/1.htm">thrift</a> <div>Thrift调用过程中,Thrift客户端和服务器之间主要用到传输层类、协议层类和处理类三个主要的核心类,这三个类的相互协作共同完成rpc的整个调用过程。在调用过程中将按照以下顺序进行协同工作: &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将客户端程序调用的函数名和参数传递给协议层(TProtocol),协议</div> </li> <li><a href="/article/339.htm" title="异或运算推导, 交换数据" target="_blank">异或运算推导, 交换数据</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%88%96/1.htm">异或</a><a class="tag" taget="_blank" href="/search/%5E/1.htm">^</a> <div>/* * 5 0101 * 9 1010 * * 5 ^ 5 * 0101 * 0101 * ----- * 0000 * 得出第一个规律: 相同的数进行异或, 结果是0 * * 9 ^ 5 ^ 6 * 1010 * 0101 * ---- * 1111 * * 1111 * 0110 * ---- * 1001 </div> </li> <li><a href="/article/466.htm" title="事件源对象" target="_blank">事件源对象</a> <span class="text-muted">周华华</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&q</div> </li> <li><a href="/article/593.htm" title="MySql配置及相关命令" target="_blank">MySql配置及相关命令</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MySQL安装完毕后我们需要对它进行一些设置及性能优化,主要包括字符集设置,启动设置,连接优化,表优化,分区优化等等。 &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一 修改MySQL密码及用户 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp</div> </li> <li><a href="/article/720.htm" title="[简单]poi删除excel 2007超链接" target="_blank">[简单]poi删除excel 2007超链接</a> <span class="text-muted">53873039oycg</span> <a class="tag" taget="_blank" href="/search/Excel/1.htm">Excel</a> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用解析sheet.xml方式删除超链接,缺点是要打开文件2次,代码如下: &nbsp;&nbsp;&nbsp;&nbsp; public void removeExcel2007AllHyperLink(String filePath) throws Exception { OPCPackage ocPkg = OPCPac</div> </li> <li><a href="/article/847.htm" title="Struts2添加 open flash chart" target="_blank">Struts2添加 open flash chart</a> <span class="text-muted">云端月影</span> <div>准备以下开源项目: 1. Struts 2.1.6 2. Open Flash Chart 2 Version 2 Lug Wyrm Charmer (28th, July 2009) 3. jofc2,这东西不知道是没做好还是什么意思,好像和ofc2不怎么匹配,最好下源码,有什么问题直接改。 4. log4j 用eclipse新建动态网站,取名OFC2Demo,将Struts2 l</div> </li> <li><a href="/article/974.htm" title="spring包详解" target="_blank">spring包详解</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div> 下载的spring包中文件及各种包众多,在项目中往往只有部分是我们必须的,如果不清楚什么时候需要什么包的话,看看下面就知道了。&nbsp;aspectj目录下是在Spring框架下使用aspectj的源代码和测试程序文件。Aspectj是java最早的提供AOP的应用框架。&nbsp;dist&nbsp;目录下是Spring 的发布包,关于发布包下面会详细进行说明。&nbsp;docs&nb</div> </li> <li><a href="/article/1101.htm" title="网站推广之seo概念" target="_blank">网站推广之seo概念</a> <span class="text-muted">antonyup_2006</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/1.htm">搜索引擎</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a> <div>&nbsp;&nbsp; 持续开发一年多的b2c网站终于在08年10月23日上线了。作为开发人员的我在修改bug的同时,准备了解下网站的推广分析策略。 &nbsp;&nbsp;&nbsp; 所谓网站推广,目的在于让尽可能多的潜在用户了解并访问网站,通过网站获得有关产品和服务等信息,为最终形成购买决策提供支持。 &nbsp;&nbsp;&nbsp; 网站推广策略有很多,seo,email,adv</div> </li> <li><a href="/article/1228.htm" title="单例模式,sql注入,序列" target="_blank">单例模式,sql注入,序列</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a><a class="tag" taget="_blank" href="/search/%E5%BA%8F%E5%88%97/1.htm">序列</a><a class="tag" taget="_blank" href="/search/sql%E6%B3%A8%E5%85%A5/1.htm">sql注入</a><a class="tag" taget="_blank" href="/search/%E9%A2%84%E7%BC%96%E8%AF%91/1.htm">预编译</a> <div>&nbsp; 序列在前面写过有关的博客,也有过总结,但是今天在做一个JDBC操作数据库的相关内容时 需要使用序列创建一个自增长的字段&nbsp; 居然不会了,所以将序列写在本篇的前面 &nbsp; &nbsp;1,序列是一个保存数据连续的增长的一种方式; 序列的创建; CREATE SEQUENCE seq_pro 2 INCREMENT BY 1 -- 每次加几个 3 </div> </li> <li><a href="/article/1355.htm" title="Mockito单元测试实例" target="_blank">Mockito单元测试实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a><a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a> <div>Mockito单元测试实例: public class SettingServiceTest { private List&lt;PersonDTO&gt; personList = new ArrayList&lt;PersonDTO&gt;(); @InjectMocks private SettingPojoService settin</div> </li> <li><a href="/article/1482.htm" title="精通Oracle10编程SQL(9)使用游标" target="_blank">精通Oracle10编程SQL(9)使用游标</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>/* *使用游标 */ --显示游标 --在显式游标中使用FETCH...INTO语句 DECLARE CURSOR emp_cursor is select ename,sal from emp where deptno=1; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; begin ope</div> </li> <li><a href="/article/1609.htm" title="【Java语言】动态代理" target="_blank">【Java语言】动态代理</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/java%E8%AF%AD%E8%A8%80/1.htm">java语言</a> <div>&nbsp; JDK接口动态代理 JDK自带的动态代理通过动态的根据接口生成字节码(实现接口的一个具体类)的方式,为接口的实现类提供代理。被代理的对象和代理对象通过InvocationHandler建立关联 &nbsp; package com.tom; import com.tom.model.User; import com.tom.service.IUserService; </div> </li> <li><a href="/article/1736.htm" title="Java通信之URL通信基础" target="_blank">Java通信之URL通信基础</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/webservice/1.htm">webservice</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/ITeye/1.htm">ITeye</a> <div>java对网络通信以及提供了比较全面的jdk支持,java.net包能让程序员直接在程序中实现网络通信。 在技术日新月异的现在,我们能通过很多方式实现数据通信,比如webservice、url通信、socket通信等等,今天简单介绍下URL通信。 学习准备:建议首先学习java的IO基础知识 &nbsp; URL是统一资源定位器的简写,URL可以访问Internet和www,可以通过url</div> </li> <li><a href="/article/1863.htm" title="博弈Java讲义 - Java线程同步 (1)" target="_blank">博弈Java讲义 - Java线程同步 (1)</a> <span class="text-muted">boyitech</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/%E5%90%8C%E6%AD%A5/1.htm">同步</a><a class="tag" taget="_blank" href="/search/%E9%94%81/1.htm">锁</a> <div>&nbsp; 在并发编程中经常会碰到多个执行线程共享资源的问题。例如多个线程同时读写文件,共用数据库连接,全局的计数器等。如果不处理好多线程之间的同步问题很容易引起状态不一致或者其他的错误。 &nbsp; &nbsp;同步不仅可以阻止一个线程看到对象处于不一致的状态,它还可以保证进入同步方法或者块的每个线程,都看到由同一锁保护的之前所有的修改结果。处理同步的关键就是要正确的识别临界条件(cri</div> </li> <li><a href="/article/1990.htm" title="java-给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。" target="_blank">java-给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class DeleteExtraSpace { /** * 题目:给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。 * 方法1.用已有的String类的trim和replaceAll方法 * 方法2.全部用正则表达式,这个我不熟 * 方法3.“重新发明轮子”,从头遍历一次 */ public static v</div> </li> <li><a href="/article/2117.htm" title="An error has occurred.See the log file错误解决!" target="_blank">An error has occurred.See the log file错误解决!</a> <span class="text-muted">Kai_Ge</span> <a class="tag" taget="_blank" href="/search/MyEclipse/1.htm">MyEclipse</a> <div>今天早上打开MyEclipse时,自动关闭!弹出An error has occurred.See the log file错误提示! 很郁闷昨天启动和关闭还好着!!!打开几次依然报此错误,确定不是眼花了! 打开日志文件!找到当日错误文件内容: --------------------------------------------------------------------------</div> </li> <li><a href="/article/2244.htm" title="[矿业与工业]修建一个空间矿床开采站要多少钱?" target="_blank">[矿业与工业]修建一个空间矿床开采站要多少钱?</a> <span class="text-muted">comsci</span> <div> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地球上的钛金属矿藏已经接近枯竭........... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们在冥王星的一颗卫星上面发现一些具有开采价值的矿床..... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么,现在要编制一个预算,提交给财政部门..</div> </li> <li><a href="/article/2371.htm" title="解析Google Map Routes" target="_blank">解析Google Map Routes</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/google+api/1.htm">google api</a> <div>为了获得从A点到B点的路劲,经常会使用Google提供的API,例如 [url] http://maps.googleapis.com/maps/api/directions/json?origin=40.7144,-74.0060&amp;destination=47.6063,-122.3204&amp;sensor=false [/url] 从返回的结果上,大致可以了解应该怎么走,但</div> </li> <li><a href="/article/2498.htm" title="SQL还有多少“理所应当”?" target="_blank">SQL还有多少“理所应当”?</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>转贴存档,原帖地址:http://blog.chinaunix.net/uid-29242841-id-3968998.html、http://blog.chinaunix.net/uid-29242841-id-3971046.html! ------------------------------------华丽的分割线-------------------------------- </div> </li> <li><a href="/article/2625.htm" title="Yii使用Ajax验证时,如何设置某些字段不需要验证" target="_blank">Yii使用Ajax验证时,如何设置某些字段不需要验证</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a> <div>经常像你注册页面,你可能非常希望只需要Ajax去验证用户名和Email,而不需要使用Ajax再去验证密码,默认如果你使用Yii 内置的ajax验证Form,例如: $form=$this-&gt;beginWidget('CActiveForm', array(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'id'=&gt;'usuario-form',&</div> </li> <li><a href="/article/2752.htm" title="使用git同步网站代码" target="_blank">使用git同步网站代码</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/crontab/1.htm">crontab</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a> <div>转自:http://ued.ctrip.com/blog/?p=3646?tn=gongxinjun.com &nbsp; 管理一网站,最开始使用的虚拟空间,采用提供商支持的ftp上传网站文件,后换用vps,vps可以自己搭建ftp的,但是懒得搞,直接使用scp传输文件到服务器,现在需要更新文件到服务器,使用scp真的很烦。发现本人就职的公司,采用的git+rsync的方式来管理、同步代码,遂</div> </li> <li><a href="/article/2879.htm" title="sql基本操作" target="_blank">sql基本操作</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/sql%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/1.htm">sql基本操作</a><a class="tag" taget="_blank" href="/search/sql%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C/1.htm">sql常用操作</a> <div>sql基本操作 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 蕃薯耀 2015年6月1日 17:30:33 星期一 &nbsp; &nbsp; &</div> </li> <li><a href="/article/3006.htm" title="Spring4+Hibernate4+Atomikos3.3多数据源事务管理" target="_blank">Spring4+Hibernate4+Atomikos3.3多数据源事务管理</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/Hibernate4/1.htm">Hibernate4</a> <div>Spring3+后不再对JTOM提供支持,所以可以改用Atomikos管理多数据源事务。Spring2.5+Hibernate3+JTOM参考:http://hanqunfeng.iteye.com/blog/1554251Atomikos官网网站:http://www.atomikos.com/&nbsp;&nbsp; 一.pom.xml &lt;dependency&gt; &lt;</div> </li> <li><a href="/article/3133.htm" title="jquery中两个值得注意的方法one()和trigger()方法" target="_blank">jquery中两个值得注意的方法one()和trigger()方法</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/trigger/1.htm">trigger</a> <div>&nbsp; 在jquery中,有两个值得注意但容易忽视的方法,分别是one()方法和trigger()方法,这是从国内作者&lt;&lt;jquery权威指南》一书中看到不错的介绍 1) one方法 &nbsp;&nbsp;&nbsp; one方法的功能是让所选定的元素绑定一个仅触发一次的处理函数,格式为 &nbsp;&nbsp; one(type,${data},fn) &nb</div> </li> <li><a href="/article/3260.htm" title="拿工资不仅仅是让你写代码的" target="_blank">拿工资不仅仅是让你写代码的</a> <span class="text-muted">lampcy</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%92%A8%E8%AF%A2/1.htm">咨询</a> <div>这是我对团队每个新进员工说的第一件事情。这句话的意思是,我并不关心你是如何快速完成任务的,哪怕代码很差,只要它像救生艇通气门一样管用就行。这句话也是我最喜欢的座右铭之一。 这个说法其实很合理:我们的工作是思考客户提出的问题,然后制定解决方案。思考第一,代码第二,公司请我们的最终目的不是写代码,而是想出解决方案。 话粗理不粗。 付你薪水不是让你来思考的,也不是让你来写代码的,你的目的是交付产品</div> </li> <li><a href="/article/3387.htm" title="架构师之对象操作----------对象的效率复制和判断是否全为空" target="_blank">架构师之对象操作----------对象的效率复制和判断是否全为空</a> <span class="text-muted">nannan408</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E5%B8%88/1.htm">架构师</a> <div>1.前言。 &nbsp; 如题。 2.代码。 (1)对象的复制,比spring的beanCopier在大并发下效率要高,利用net.sf.cglib.beans.BeanCopier Src src=new Src(); BeanCopier beanCopier = BeanCopier.create(Src.class, Des.class, false); </div> </li> <li><a href="/article/3514.htm" title="ajax 被缓存的解决方案" target="_blank">ajax 被缓存的解决方案</a> <span class="text-muted">Rainbow702</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>使用jquery的ajax来发送请求进行局部刷新画面,各位可能都做过。 今天碰到一个奇怪的现象,就是,同一个ajax请求,在chrome中,不论发送多少次,都可以发送至服务器端,而不会被缓存。但是,换成在IE下的时候,发现,同一个ajax请求,会发生被缓存的情况,只有第一次才会被发送至服务器端,之后的不会再被发送。郁闷。 解决方法如下: ① 直接使用 JQuery提供的 “cache”参数,</div> </li> <li><a href="/article/3641.htm" title="修改date.toLocaleString()的警告" target="_blank">修改date.toLocaleString()的警告</a> <span class="text-muted">tntxia</span> <a class="tag" taget="_blank" href="/search/String/1.htm">String</a> <div>&nbsp; 我们在写程序的时候,经常要查看时间,所以我们经常会用到date.toLocaleString(),但是date.toLocaleString()是一个过时 的API,代替的方法如下: &nbsp; package com.tntxia.htmlmaker.util; import java.text.SimpleDateFormat; import java.util.</div> </li> <li><a href="/article/3768.htm" title="项目完成后的小总结" target="_blank">项目完成后的小总结</a> <span class="text-muted">xiaomiya</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E6%80%BB%E7%BB%93/1.htm">总结</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE/1.htm">项目</a> <div>项目完成了,突然想做个总结但是有点无从下手了。 做之前对于客户端给的接口很模式。然而定义好了格式要求就如此的愉快了。 先说说项目主要实现的功能吧 1,按键精灵 2,获取行情数据 3,各种input输入条件判断 4,发送数据(有json格式和string格式) 5,获取预警条件列表和预警结果列表, 6,排序, 7,预警结果分页获取 8,导出文件(excel,text等) 9,修</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>