JavaEE知识体系
2023-11-25 21:27:05 0 举报
AI智能生成
JavaEE,全称Java Platform, Enterprise Edition,是用于开发企业级应用的一种主流的、开源的、跨平台的Java技术标准。它包括了一系列的服务、API和协议,如Servlet、JSP、EJB、JMS等,用于构建分布式、多层的、可扩展的企业级应用。JavaEE的主要目标是简化企业级应用的开发,提高开发效率,降低开发成本。JavaEE的知识体系主要包括Java语言基础、Java Web开发、Java EE服务、Java EE架构和设计模式等方面。
作者其他创作
大纲/内容
java基础
概述
名词解释
JVM(Java Virtual MachineJava)JAVA虚拟机
使用软件在不同操作系统中,模拟相同的环境。
JRE(Java Runtime Environment)Java运行环境,包含了jvm和Java类库
JDK:(Java Development Kit)Java开发工具和类库 ,包含了jre
环境变量搭建
“我的电脑”--属性--高级属性--环境变量:
找到path变量:将jdk中bin文件夹的的路径复制到path中
找到path变量:将jdk中bin文件夹的的路径复制到path中
JavaSE:Java Platform Standard Edition(Java平台标准版) CoreJava
JavaEE:Java Platform Enterprise Edition(Java平台企业版)
JavaME:Java Platform Micro Edtion(Java平台微小版)
计算机语言发展
机器语言
汇编语言
高级语言
从1946年2月14日第一台计算机ENAC诞生
到:C , C++ , C# , Java等
到:C , C++ , C# , Java等
Java语言的特点
简单
跨平台性
java程序
win版JVM
mac版JVM
lin版JVM
一次 编写随处运行
面向对象(Object Oriented)OO
封装
继承
多态
交互式特性,多线程机制
由于它支持TCP/IP协议,使得用户可以通过浏览器访问到Internet上的各种动态对象。
并且在网络上用户可以交互式地进行各种动作,而多线程技术的引入使得这种交互式
操作更为容易
并且在网络上用户可以交互式地进行各种动作,而多线程技术的引入使得这种交互式
操作更为容易
健壮性
Java的强类型机制保证任何数据必须有明确的数据类型;
Java提供异常处理机制,能够统一处理异常事件;
Java提供异常处理机制,能够统一处理异常事件;
分布式
提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、 ServerSocket等;
Java的RMI(远程方法调用)机制是开发分布式应用的重要手段;
Java的RMI(远程方法调用)机制是开发分布式应用的重要手段;
动态内存管理机制
java语言采用了自动垃圾回收机制进行内存的管理。
在c++语言中,需要程序员自己对内存进行及时的释放,不然就存在内存泄露等不可预知的问题。
但是在java有一个垃圾回收器,可以对程序中产生的对象进行跟踪,知道哪些对象已经是无用的了,
对无用的内存进行释放,为程序员大大减少了内存管理方面的问题
在c++语言中,需要程序员自己对内存进行及时的释放,不然就存在内存泄露等不可预知的问题。
但是在java有一个垃圾回收器,可以对程序中产生的对象进行跟踪,知道哪些对象已经是无用的了,
对无用的内存进行释放,为程序员大大减少了内存管理方面的问题
安全性
Java语言在安全性方面引入了实时内存分配及布局来防止程序员直接修改物理内存布局;
通过字节代码验证器对字节代码的检验,以防止网络病毒及其它非法代码侵入。
通过字节代码验证器对字节代码的检验,以防止网络病毒及其它非法代码侵入。
语言基础
变量
计算机内存中的一块存储空间,是存储数据的基本单位
内存即是一块瞬时状态的存储空间,有一定的容量
Java虚拟机默认分配的物理内存容量是计算机1/8
组成部分
数据类型
变量名
值
声明方式
先声明,再赋值
数据类型 变量名;
变量名=值;
变量名=值;
声明并赋值
数据类型 变量名=值;
多个同类型的变量
同时声明并赋值
同时声明并赋值
数据类型 变量名1=值1,变量名2=值2;
命名规则
类名:由一个或多个单词组成,每个单词首字母大写
包名:全小写,采用域名倒置的规则
变量名和函数名:由一个或多个单词组成,首单词首字母小写,拼接词首字母大写
常量:全大写,多个单词用_ 连接
其他
//单行注释
/* 多行注释*/
/**文档注释 */
(生成外部文档:javadoc -d .HelloWorld.java)
如果用了public class进行声明,则类名称必须与文件名称完全一致
语言基础
可以由:字母、数字、_. $组成,但不能以数字开头
不能与关键字、保留字重名
java中严格区分大小写
注意:在起名字的时,为了提高阅读性,要尽量有意义
在一个.java文件中可以有多个Java类;
最多只能有一个public类
最多只能有一个public类
局部变量
定义在函数内部的变量
作用范围仅限函数内部
可与全局变量同名,局部变量优先
多个变量在重合的作用范围内,不可出现重名
全局变量(成员变量)
在方法外类内声明的变量
Java关键字
关键字的定义和特点
定义:被Java语言赋予了特殊含义的单词
特点:关键字中所有字母都为小写
用于定义数据类型的关键字
class, interface, byte, short , int
long, float, double, char, boolean, void
用于定义数据类型值的关键字
true false null
用于定义流程控制的关键字
if, else, switch, case, default, while, do, for, break, continue, return
用于定义访问权限修饰符的关键字
private, protected, public
用于定义类,函数,变量修饰符的关键字
abstract, final, static, synchronized
用于定义类与类之间关系的关键字
extends, implements
用于定义建立实例及引用实例,判断实例的关键字
new, this, super, instanceof
用于异常处理的关键字
try, catch, finally, throw, throws
用于包的关键字
package, import
其他修饰符关键字
native, strictfp, transient, volatile, assert
关键字的定义和特点
定义:被Java语言赋予了特殊含义的单词
特点:关键字中所有字母都为小写
用于定义数据类型的关键字
class, interface, byte, short , int
long, float, double, char, boolean, void
用于定义数据类型值的关键字
true false null
用于定义流程控制的关键字
if, else, switch, case, default, while, do, for, break, continue, return
用于定义访问权限修饰符的关键字
private, protected, public
用于定义类,函数,变量修饰符的关键字
abstract, final, static, synchronized
用于定义类与类之间关系的关键字
extends, implements
用于定义建立实例及引用实例,判断实例的关键字
new, this, super, instanceof
用于异常处理的关键字
try, catch, finally, throw, throws
用于包的关键字
package, import
其他修饰符关键字
native, strictfp, transient, volatile, assert
数据类型
基本数据类型
整数
默认:int
默认:int
byte
1个字节
-128~127
默认值0
short
2个字节
-2^15 ~ 2^15-1
默认值0
int
4个字节
-2^31 ~ 2^31-1
默认值0
long
8个字节
-2^63~2^63-1
默认值0
追加L
小数
默认double
默认double
float
4个字节
-3.403E38~3.403E38
默认值0.0
追加F
double
8个字节
-1.798E308~1.798E308
默认值0.0
追加F
布尔
boolean
1个字节
只能存true/false
默认值:false
字符
char
2个字节
默认空字符(\u0000)
转义字符\
\'
\"
\\输出反斜线
\t制表符
\n换行
引用数据类型
字符串
String
对象
枚举类
注解
数组
类型的转换
自动类型转换
两种类型相互兼容,目标类型大于源类型
大范围整数向小范围整数转换
整数向浮点型转换
字符向整型转换
强制类型转换
两种类型相互兼容,目标类型小于源类型
小范围整数向大范围整数转换
浮点型向整型转换
整型向字符转换
转换规则
整数长度足够,数据完整
整数长度不够,数据截断
小数强转整数,数据截断
会造成精度的损失
字符整数互转,数据完整
保证正整数转换成字符,可以正常显示
boolean不可与其他类型转换
+= 隐式的将加操作的结果类型强制转换为持有结果的类型
运算符
算数运算符
+-*/%++--
赋值元素安抚
= += -= *= /= %=
关系运算符
> < >= <= == !=
逻辑运算符
&& || !
三元运算符
布尔表达式?结果1:结果2
位运算符
常量
选择结构
概念:根据已知条件进行落尽判断,满意条件后执行相应的操作
选择结构
基本if结构
if else结构
多重if结构
相互排斥,有一个选项为true,其他选择不再执行,适用于区间判断
嵌套if结构
可以在一个选择结构当中,嵌套另一个选择结构,语法正确、格式正确的情况下,可以任意组合
switch条件分支
可判断变量类型:byte,short,int,char,String(JDK7+),枚举类
case被选中后,不会主动退出这个结构,需手工追加break,跳出整个switch。
dafalut表示没有匹配的case
循环结构
概念:通过某个条件,重复的执行一段逻辑代码
作用:减少代码的重复性
结构:初始部分;循环条件:循环操作;迭代部分
循环结构
dowhile循环
首次没有入口条件,先执行、再判断,适用于循环次数不明确
while循环
先判断、再执行;适用于循环条件明确
for循环
先判断,再执行,适用于循环次数明确
嵌套循环
在一个完整的循环结构中,嵌套另一个循环结构
外层控制行数,内层控制列数
流程控制语句
break
中止、跳出:switch分支结构、循环结构
通过添加标记,可以结束任意层的循环
continue
结束本次循环,进入下一次
函数
概念:实现特定功能的一段代码,可反复使用。
定义的位置:定义在类的内部,与main函数并列
函数的调用:函数名();
函数调用时,优先执行函数内部代码,结束后,返回到函数调用处,继续向下执行
经验:一个函数制作一件事(单一职能原则)
返回值与返回值类型
定义返回值类型:基本数据类型、引用数据类型、void
return value; //应用在具有返回值类型的函数中,函数结束时,伴有返回值,返回到函数调用处
return; //应用在返回值类型为void的函数中,遇到return时,直接结束函数
递归
实际再发中,递归可以解决一些具有既定规律的问题。
当需要解决的问题可以拆分成若干个小问题,大问题、小问题的解决方法相同,有特定的规律,函数自己调用自己。
设置有效的出口条件,避免无穷递归。
重载
概念
在一个类中定义多个相同名称的方法
要求
方法名称相同
参数列表不同
与访问修饰符、返回值无关
好处
屏蔽用户的使用差异,方便
形式参数
实际参数
可变长参数
方法名(参数类型... bianliangming )
在参数列表中只能出现一个
必须出现在参数列表的最后
可当作数组使用
数组
概念:一组连续的存储空间,存储多个相同数据类型的值
创建
先声明,再分配空间
声明并分配空间
int [] a = new int[5];
需要声明数组长度
声明并赋值
int [] a = new int[]{1,2,3}
如果声明时赋值,则不能再声明数组长度
int [] a = {1,2,3}
需要写在同一行
访问
通过下标访问,语法:数组名[下标]
下标的范围:0 ~ 数组的长度-
下标越界异常ArrayIndexOutOfBoundsException
扩容
思路:
创建长度大于原数组的新数组。
将原数组中的数据依次复制到新数组当中。
数组一旦创建长度不可改变,只能通过地址引用到新数组
三种方法
手工循环完成逐一的赋值
System.arraycopy(原数组 , 原数组起始位置 , 新数组 , 新数组起始位置 , 长度);
数组类型的变量 = java.util.Arrays.copyOf(原数组 , 新长度);
排序
选择排序
固定值与其他值比较大小,互换位置
冒泡排序
相邻的两个值比较大小,互换位置
JDK排序
java.util.Arrays.sort(数组名);默认升序
二维数组
创建语法:数据类型[][] 数组名 = new 数据类型[高维下标][低维下标]
访问元素的方式:数组名[高维下标][低维下标]
第一个下标控制行,第二下标控制列
高维数组中存储的是一维数组地址
面向对象
程序:程序是为了模拟现实世界,解决现实问题而使用计算机语言编写的指令集合
对象:一切客观存在的事物都是对象,万物皆对象。对象一定具有自己的特征和行为
类:定义了对象应具有的特征和行为,类是对象的模板。
对象实体:拥有多个特征和行为的实体,对象是类的实例。
类的抽取:在一组相同或类似的对象中,抽取出共性的特征和行为,保留所关注的部分。
构造方法(构造器)
每个类都有一个默认的无参构造器,用于创建对象;
没有返回值,方法不加返回值类型,方法名与类名相同
执行过程
开辟内存空间;
初始化属性;
如果没有初始值,全部都是默认值
执行构造方法中的代码块
将内存地址赋值给引用变量
默认提供了无参构造方法
一旦定义了有参构造方法,无参构造方法就消失了;除非手动再次定义
field:字段、全局变量、属性、实例成员属性
定义在类内、方法外
在类内处处可用;
有默认值
局部变量可与属性同名,此时局部变量优先级高;
三大特性
封装
概念
封装反映了事物的相对独立性
尽可能隐藏对象的内部实现细节,控制对象的修改及访问的权限
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方式
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
由private修饰为私有的属性 + 提供set/get公共的访问方法
封装之后,不可直接访问属性,仅可通过get/set公共访问进行访问,可以在方法内部对数据进行过滤
访问修饰符
private
子主题
defalut
protected
public
继承
程序中的继承,是类与类之间特征和行为的一种赠与或获得
构成继承关系的要求:两个类之间必须满足"is a"的关系
选择父类:功能越精细、重合点越多,越接近直接父类
父类的抽象:在一组相同或类似的类中,抽取出共性的特征和行为,定义在父类中,实现重用
定义子类时:class 子类 extends 父类
产生继承关系后,子类可以使用父类中的属性和方法,也可以定义子类独有的属性和方法
Java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加
不可继承:父类构造方法、父类中由private修饰的成员、父子类不在同一个包时由default修饰的成员
方法的覆盖(重写)
概念
父类提供的方法无法满足子类需求、可在子类中定义相同的方法进行覆盖
要求
子主题
子主题
子主题
子主题
子主题
执行
方法覆盖后,优先执行子类覆盖后的版本
this关键字
指这个类的当前实例
两种用法
第一种用法:调用当前实体的属性和方法
this(),this(参数列表)--调用无参、有参构造,按参数的类型、个数、顺序匹配对应的有参构造;
必须定义在构造方法中的第一句话
this调用构造方法的语句只能出现一次
super关键字
代表父类
两种用法
使用" super. "的形式在子类中访问父类的属性和方法(解决属性遮蔽、方法覆盖调用
this调用构造方法的语句只能出现一次;
必须定义在构造方法中的第一句话;
使用" super() "、" super(实参) "在子类构造方法的首行,调用父类的构造方法,如果没有显示书写,则默认调用父类无参构造super()
同一个子类的构造方法中,super()、this()不可同时存在
构建子类对象时,先构建父类对象
多态
概念:父类引用指向子类对象,从而产生多种形态
父类引用仅可调用父类中所声明的属性和方法,不可调用子类独有的属性和方法
实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行父类中的方法
两种应用场景
使用父类作为方法形参的数据类型,使方法参数的类型更为宽泛
使用父类作为方法返回值实现多态,使方法可以返回不同的子类对象
任何一个子类都可以自动类型提升,提升为父类类型(宽泛的类型)
好处:达到统一编码,降低耦合度,减少冗余代码
可替换性(substitutability
可扩充性(extensibility)
接口性(interface-ability)
灵活性(flexibility)
可扩充性(extensibility)
接口性(interface-ability)
灵活性(flexibility)
三个关键字
abstract
概念:似是而非的,像却又不是,具备某种对象的特征,但不完整
抽象类:不能new对象,但可以声明引用
不一定有抽象方法,但有抽象方法的类一定是抽象类。
子类继承抽象类后,必须覆盖父类中所有的抽象方法,否则,子类还是抽象类。
抽象方法:只有方法声明,没有方法实现。(必须包含在抽象类中)
与private、final、static不能同时使用
static
概念:static可以修饰属性、方法和代码块,即为静态属性(类属性)、静态方法(类方法),静态代码块
静态成员(静态属性)
静态成员是全类所有对象共享的额成员,全类中只有一份,不因创建多个对象而产生多份,不必创建对象
可直接通过类名访问,也支持通过对象访问
静态方法
允许直接访问静态成员,不能直接访问实例成员
不允许使用this、super关键字
因为this或super都代表对象,都需要先创建对象
可被继承
不能覆盖,没有多态
定义工具类里,方法建议用static
静态代码块
类加载的执行环节,执行地位和静态属性一致,只有首次加载类时,需要执行,仅一次
类内可以定义多个静态代码块,定义序即执行序
只能使用静态属性
加载时机
子主题
动态代码块
执行:每当创建一次对象,就优先于构造器执行一次
类内可以定义多个动态代码块,定义序即执行序
可以使用静态属性和非静态属性;
类加载
时机
当前类创建对象
当前子类创建对象
调用当前类的静态属性、方法
Class.forName("全类名")(反射技术)
JVM首次使用某个类时,通过CLASSPATH查找该类的.class文件,并将.class文件中对类的描述信息加载到内存中,进行保存
final
final表示不可改变的
修饰属性
这个属性称为常量
一般建义全大写字母表示,多个单词之间用下划线连接
在定义时必须初始化赋值;
修饰方法
不能被重写
修饰类
不能被继承
常用类
内部类
概念:再一个类的内部再定义一个完整地类
特点
编译之后可生成独立的字节码文件
Outer$Inner.class
内部类可直接访问外部类的私有成员,,而不破坏封装。
可为外部类提供必要的内部功能组件。
成员内部类
在类的内部定义,与实量、实例方法同级别的类。
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
Outer out=new Outer();
Inner in=out.new inner();
Inner in=out.new inner();
当外部类、内部类存在重名属性时,会优先访问内部类属性。
不能定义静态成员
静态内部类
不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。
只能直接访问外部类的静态成员(实例成员需实例化外部类对象)
匿名内部类
没有类名的局部内部类(一切特征都与局部内部类相同)
必须继承一个父类或者实现一个接囗
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
优点:减少代码量。
缺点:可读性较差
局部内部类
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为 final。
Object类
超类、基类,所有类的直接或间接父类,位于继承树的最顶层
任何类,如没有书写 extends显示继承某个类,都默认直接继承 Ob ject类,否则为间接继承。
Object类中所定义的方法,是所有对象都具备的方法
object类型可以存储任何对象
作为参数,可接受任何对象
作为返回值,可返回任何对象
方法
getClass方法 public final Class<?> getClass()
返回引用中存储的实际对象类型。
应用:通常用于判断两个引用中实际存储对象类型是否一致。
hash Code方法 public int hashCode()
返回该对象的十进制的哈希码值。
哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值。
哈希码并不唯一,可保证相同对象返回相同哈希码,尽量保证不同对象返回
不同哈希码。
不同哈希码。
toString()方法 public string tostring()
返回该对象的字符串表示(表现形式)。
可以根据程序需求覆盖该方法,如:展示对象各个属性值。
equals()方法 public boolean equals(object obj)
默认实现为(this=obj),比较两个对象地址是否相同
可进行覆盖,比较两个对象的内容是否相同
equals()方法覆盖步骤:
比较两个引用是否指向同一个对象。
判断obj是否为null
判断两个引用指向的实际对象类型
强制类型转换。
依次比较各个属性值是否相同。
比较两个引用是否指向同一个对象。
判断obj是否为null
判断两个引用指向的实际对象类型
强制类型转换。
依次比较各个属性值是否相同。
子主题
finaliz方法
当对象被判定为垃圾对象时,由JWM自动调用此方法,用以标记垃圾对象,进入回收队列。
垃圾对象:没有有效引用指向此对象时,为垃圾对象。
垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
自动回收机制:JM的内存耗尽,一次性回收所有垃圾对象
手动回收机制:使用 System.gcQ;通知JWM执行垃圾回收
包装类
概念
基本数据类型所对应的引用数据类型
Object可统一所有数据,包装类的默认值是null
包含
子主题
子主题
子主题
子主题
子主题
子主题
子主题
子主题
子主题
转型方法
由其父类Number提供6个共性方法,常用作自动拆箱
byteValueO
+以byte形式返回指定的数值。
doubleValue o
以 doubl形式返回指定的数值。
float Value O
以1at形式返回指定的数值。
int Value o
以int形式返回指定的数值。
long value o
以1ong形式返回指定的数值。
short Value o
以 short形式返回指定的数值。
+以byte形式返回指定的数值。
doubleValue o
以 doubl形式返回指定的数值。
float Value O
以1at形式返回指定的数值。
int Value o
以int形式返回指定的数值。
long value o
以1ong形式返回指定的数值。
short Value o
以 short形式返回指定的数值。
parseXXX() 将字符串转换为包装类
每种子类的valueOf()将数值转为基本类型
通过基本类型构建
通过String构建
注意:在使用字符串构建数字型包装类型对象时,要保证类型的兼容,否则产生NumberFormatException。
装箱拆箱
拆箱
包装类转为基本类型
装箱
基本类型装为包装类
JDK5之后,提供自动装箱、拆箱,简化使用包装类的编程过程
自动装箱时,会调用valueOf方法,Byte、Short、Integer、Long,
四种整数包装类型都提供了对应的cache缓冲区,将常用的256个数字提 前创建对象并保存在数组中,实现复用。
String
String
字符串是常量,创建之后不可改变。
字符串字面值存储在字符串池中,可以共享
String s= new String( CHello”);//生两个对象,堆、池各存储一个
常用方法
indexOf(str[,local])
从左向右查询,查询子串首次出现的下标,如果查不到,则返回-1;local默认为0;
子主题
子主题
子主题
子主题
子主题
StringBuilder
可变字符串
JDK5发布,线程不安全,运行效率快
StringBuffer
可变字符串
JDK1.0发布,线程安全,运行效率慢
BigDecima
作用:精确计算浮点数
包:Java.math.BigDecimal
构造函数
BigDecimal(int)
BigDecimal(double)
BigDecimal(long)
BigDecimal(String)
方法
计算
add(BigDecimal)
subtract(BigDecimal)
multiply(BigDecimal)
divide(BigDecimal)
除法: BigDecimal (BigDecimal bd, int scal, RoundingMode mode)
参数scal:指定精确到小数点后几位。
参数mode指定小数部分的取舍模式,通常采用四舍五入的模式,
取值为 BigDecima1. ROUND HALF UP。
转化
toString()
floatValue()
doubleValue()
longValue()
intValue()
格式化
NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制
注意事项
当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用Double.toString(double)方法,然后使用BigDecimal(String)构造方法,将double转换为String。要获取该结果,请使用static valueOf(double)方法。
接口
概念
接口是一种能力和约定
特殊的抽象类,用interface修饰
没有构造方法,不能创建对象
其中的属性都是公开静态常量,默认用publicstaticfinal修饰
其中的方法都是公开抽象方法,默认用public static
规范:任何类在实现接口时,必须覆盖接口中所有的抽象方法,否则此类还是抽象类
实现类
Java单继承,当父类的方法种类无法满足子类需求时,可实现接口来扩充子类的能力
关系用implements表示
可以多实现,为一个类扩充多种能力
public class 实现类 implements 接口1,接口2,接口3{
实现抽象方法时,访问修饰符必须是public
多态
接口应用同父类引用一样,可以声明为引用,指向实现类对象,仅可调用接口中所声明的方法,无法调用实现类独有方法
接口引用指向实现类对象时,需要调用实现类独有方法,可强转回实现类本身类型,进行调用
接口回调
集合
概念
对象的容器,存储对象的对象,可代替数组
集合是容器的工具,定义个对多个对象进行操作的常用方法
位置:java.util.*
与数组区别
数组声明了它容纳的元素的类型,而集合可以不声明。
数组的长度是固定的,集合长度是可以改变的。
数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。集合只能存应用类型
数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的
集合以接口和类的形式存在,具有封装,继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂的操作,大大提高软件的开发效率。
泛型
概念
参数化类型、类型安全的集合,强制集合元素的类型必须一致。
特点
编译时即可检查,而非运行抛出异常
访问时,不必类型转换(拆箱)。
不同泛型之间引用不能相互赋值,泛型不存在多态。
数据结构
数组结构
树结构
链表结构
Collection体系集合
Collection父接口:代表一组任意的对象,无序、无下标
List
有序、有下标、元素可以重复
ArrayList
数组结构存储,
查询快,增删慢。
JDK1.2发布,运行效率快,线程不安全
每次扩容只会增加50%
多线程环境下,Collections 的 synchronized(List) 方法将其转换成线程安全的容器后再使用
只保证在修改数据时不会有并发问题;
但在使用迭代器时任然会报错,迭代器在获取数据时会检查集合是否被修改过
但在使用迭代器时任然会报错,迭代器在获取数据时会检查集合是否被修改过
初始容量10
LinkedList
链表结构存储,
查询慢,增删快
线程不安全
子主题
比ArrayList更占内存
其节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素
Vector
数组结构存储
查询快 ,增删慢
JDK1.0发布,运行效率慢,线程安全
每次扩容增加1倍
实现类独有方法(都与下标相关)
void add(int index,Object obj):给指定位置添加元素;
Object get(int index):获得指定位置的元素
boolean addAll(nt index, Collection c)将一个集合中的元素添加到此集合中的index位置
List subList(int fromIndex, int toIndex返回 omIndex和 toIndex之间的集合元素。
子主题
Set
无序、无下标、元素不可重复
HashSet父类
基于HashCode实现元素不重复
当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
存入自定义必须实现重写类的hashset和equals方法,指定比较策略
无顺序性
使用的底层结构是hashmap
LinkedHashSet
底层实现是哈希表和链表(linkedhashmap)
保持了HashSet的速度,还能按照插入元素的顺序维持元素顺序(有序)
SortedSet接口
TreeSet
基于排列顺序实现元素不重复。
实现了SortedSet接口,对集合元素自动排序。
有顺序性
底层实现是红黑树(自平衡二叉树)
存入自定义必须实现Comparable接口,指定排序规则。
通过重写CompareTo方法确定是否为重复元素。
无实现类独有方法
Queue
BlockingQueue
ArrayBlockingQueue
LinkedBlockingQueue
Dqueue
双端队列
poll()和 remove()区别
相同点
都是返回第一个元素
不同点
如果没有元素
poll()返回null
remove()会抛出异常NoSuchElementException
poll()返回null
remove()会抛出异常NoSuchElementException
父类方法(10种)
int size()
返回集合的长度
Boolean isEmpty()
判断是否为空
Boolean contains()
判断是否包含
Iterator<泛型>(迭代器)
Object[] toArray()
将集合转换为数组
add(对象类型)
remove(对象),建议先查后删,用迭代器遍历查询到后,再执行删除
boole containsAll
是否包含另一个集合
removeAll
移除所有元素
removeif(Predicate filter)
需要实现Predicate接口
Map接口
父接口特点:存储一对数据(Key-Value),无序、无下标,键不可重复(重复会覆盖),值可重复
HashMap接口【重点】
JDK1.2版本提供,线程不安全,运行效率快
允许用null作为Key或Value
HashMap底层是链表数组
存入自定义必须实现重写类的hashset和equals方法,指定比较策略
LinkedHashMap
有序,保存了记录的插入顺序
非线程安全
哪些对象可以存入
对象可比较
重写hashset和equals方法
实现comparable接口
compareto(a,b)
实现compareto接口
a.compare(b)
初始容量16
每次扩容增加75%
Hashtable
JDK1.0版本提供,线程安全,运行效率慢
不允许用null作为Key或Value
Properties
Key和Value都是String类型
方法
setProperty();存值
getProperty();读取值
常用于配置文件的读取
SortedMap接口
TreeMap
可以对Key做自动排序
存入自定义必须实现Comparable接口,指定排序规则。
通过重写CompareTo方法确定是否为重复元素。
方法
Set<k> keySet()
返回所有的键值集合
Collection<v> values()
返回所有的值的集合
entrySet()
返回所有键值对集合
子主题
V put(K key,V value)
根据键的值存入值,如果键存在会覆盖值
Object get(Object key)
去除对应的值
迭代器
(Iterator)
只能单向遍历
迭代器允许调用者在迭代过程中移除元素。
ListIterator
只能遍历List
可以双向遍历List
对Iterator的扩展
异常
概念:程序在运行过程中出现的特殊情况
分类
Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中
Error:JVM、硬件、执行逻辑错误,不能手动处理
Exception:程序在运行和配置过程中产生的问题,可处理
RuntimeException:运行时异常,可处理,可不处理
CheckedException:受查异常,必须处理
产生
自动抛出异常:当程序在运行时遇到不符合规范的代码或结果时,会产生异常
手动抛出异常:throw new 异常类型("实际参数");
结果:相当于遇到return语句,导致程序因异常而终止
传递
按照方法的调用链反向传递,如果始终没有处理异常,最终会由JVM进行默认处理(打印堆栈跟踪信息)
受查异常:throws 异常类型 声明异常,修饰在方法参数列表后端
由于运行时异常,是可处理可不处理,所以无需声明异常
处理
try{}catch(Exception e){}finally{}
常见异常处理结构
try{}
catch(Exception e){}
catch(Exception e){}
try{}
catch(){}
finally{}
catch(){}
finally{}
注意:多重catch情况下,异常捕获的顺序要遵循从子(小)到父(大)的顺序,父类异常在最后
自定义异常
需要继承Exception或Exception的子类,常用RuntimeExceptio
无参构造方法
String message参数调用父类有参构造方法
异常方法覆盖
方法名、参数列表、返回值类型必须和父类相同
子类的访问修饰符和父类相同或比父类更宽
子类中的方法,不能抛出比父类更宽泛的异常,可以抛出更多的异常。
java进阶
多线程
概念
进程
真正运行时的程序,称之为进程
单核cpu,在任何时间点上,只能运行一个进程
宏观并行,微观串行
线程
轻量级进程
程序中的一个顺序控制流程,也是CPU调度的基本单位
进程可以单个或多个线程组成,批次完成不同的工作,交替执行。称之为多线程。
JVM是一个进程,当中默认包含了主线程main
线程的组成
CPU时间片
运行数据
栈空间
存储线程需要使用的局部变量,每个线程都拥有独立的栈
堆空间
存储线程需要使用的对象,多个线程可以共享堆中的对象
常见方法
创建多线程方式
extends Threa
implements Runnable(callable)
线程的状态
(创建)
休眠 sleep(long millis);
放弃 yield();
结合 join();
(等待)
线程安全
概念
临界资源:共享资源(同一对象),一次仅允许一个线程使用,才能保证其正确性
原子操作:不可分割的多步操作,被视作为一个整体,其顺序和步骤不可打乱或缺省
保证执行代码的完整性
不同的任务用同一个属性锁住
保证临界资源争抢的安全性
同一个任务用多个线程完成,用***.class锁住
线程的通信
等待
wait();
通知(唤醒)
notify();
在等待队列中随机唤醒一个线程
notifyAll()
唤醒等待队列中所有的线程
synchronized
同步代码块 synchronized(临界资源对象)
同步方法,方法修饰加synchornized
线程的状态(阻塞)
Lock锁
JDK5加入,与synchronized比较,显示定义,结构更灵活
void lock();上锁
void unlock();释放锁
boolean tryLock();//尝试获取锁
ReentrantLock
重入锁
最多持有2147483648把锁
ReadWriteLock
ReentrantReadWriteLock
一种支持一写多读的同步锁,读写分离,可分配读锁、写锁
多次分配读锁,多个读操作可以并发执行
互斥规则
写-写:互斥,阻塞
读-写:互斥,读阻塞写、写阻塞读
读-读:不互斥、不阻塞
在读操作远远大于写操作的环境中,可在保障线程安全的情况下,提高运行效率
线程安全的集合
Collections中的工具方法
以synchronized开头的方法
JDK1.2提供,接口统一、维护性高,但是性能没有提升,均以synchronized实现
CopyOnWriteArrayList
线程安全的ArrayList,加强版读写分离
写有锁,读无锁,读写之间不阻塞,优于读写锁
写入时,先copy一个容器副本,再添加新元素,最后替换引用
CopyOnWriteArraySet
底层是CopyOnWriteArrayList
在添加新元素时,使用addIfAbsent();添加,遍历数组
如果重复了,则抛弃掉副本(复制的数组)
ConcurrentHashMap
JDK1.7
初始容量16段(Segment),使用分段锁设计
不对整个Map加锁,而是对每个Segment加锁
当多个对象存入同一个Segment时,才需要互斥
最理想的状态为16个对象分别存入16个Segment,并行数量16个
JDK1.8
Node+CAS+synchronize
Queue 队列
FIFO
抛出异常的方法
返回特殊值的方法(推荐)
ConcurrentLinkedQueue
线程安全、可高效读写的队列,高并发下性能最好的队列
采用的是无锁、CAS比较交换算法
V:要更新的变量 E:预期值 N:新值
只用当V==E时,V=N,否则标识已被更新过,则取消当前操作
BlockingQueue 阻塞队列
put 阻塞添加
take 阻塞移除
可用于解决消费者、生产者的问题
ArrayBlockingQueue
数组结构实现,有界队列,手工固定上限
LinkedBlockingQueue
链表结构实现,无界队列(默认上限是Integer.MAX_VALUE)
线程池
线程容器,可以设定线程分配的数量上限
预先创建线程对象,存入池中,并实现重用池中的线程对象
避免频繁的创建、销毁
Executor 顶级接口
ExecutorService 线程池接口
Executors 工厂类
newFixedThreadPool(int nThreads);手动固定线程池的数量
newCachedThreadPool();动态数量线程池
Callable<V>接口
public V call() throws Exception{}
JDK5加入,与Runnbale类似,都代表了一个线程任务
call方法,具有泛型返回值,可以声明异常
Future接口
异步接收ExecutorService.submit();方法返回的结果。包含了call方法的返回值
V get();以阻塞形式等待Future中的异步处理结果(call的返回值)
IO流
概念
内存与存储设备之间传输数据的通道
分类
按方向
输入流
将存储设备中的内容读入到内存中
输出流
将内存中的内容写入到存储设备中
按单位
字节流
以字节为单位,可以读写所有的数据(万能流)
字符流
以字符为单位,只能读写文本数据
一个字符=两个字节,一个汉字是一个字符;
按功能
节点流
具有实际传输数据的读写功能
过滤流
在节点流的基础之上增强功能
字节流
InputStream 字节输入流
OutputStream 字节输出流
对象字节流
ObjectOutputStream
ObjectInputStream
序列化、反序列化
概念:使用对象字节流传输对象的过程
必须实现Serializable接口
保证其属性均可序列化
读取到文件末尾:java.io.EOFException
transient修饰的属性为临时属性,不参与序列化
字符流
Reader
FileReader
File类
代表了物理盘符中的一个文件或文件夹
FileFilter接口
对获取文件进行过滤,满足条件的文件或文件夹才能保存下来
方法
createNewFile()
创建一个新文件
MKdir()
创建一个新目录
Delete()
输出文件或空目录
Exisits()
判断File对象是否存在
isDirectory()
是否是目录
isFile()
是否是文件
getName()
取得名字
getPath()
获得相对目录
length()
获得文件的长度
listFiles()
列出目录中所有的内容
renameTo(File file)
修改文件名为
字符编码
IS0-8859-1收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。
UTF-8针对 Uni code的可变长度字符编码
GB2312 简体中文
GBK 简体中文、扩充
BIG5 台湾,繁体中文
NIO,BIO,AIO
网络编程
网络
由点和线构成的,标识诸多对象间的相互联系
计算机网络
为实现资源共享和信息传递,通过通信线路连接起来的若干主机(Host)
互联网:点与点相连
万维网:端与端相连
物联网:物与物相连
网络编程:让计算机与计算机之间建立连接、进行通信
网络模型:OSI开放式系统互联
第一层:物理层(双绞线、光导纤维)
第二层:链路层(MAC)
第三层:网络层(IP地址)
第四层:传输层(TCP、UDP)
第五层:会话层(断点续传)
第六层:表示层(对数据转换以及加密)
第七层:应用层(HTTP、FTP、SMTP)
TCP/IP模型
一组用于实现网络互联的通信协议,分为了四层
第一层:网络接口层(以太网、ADSL)
第二层:网络层(分配地址、传送数据,IP协议)
第三层:传输层(文本数据,协议是TCP、UDP协议)
第四层:应用层(负责传送最终形态的数据,协议为HTTP、FTp)
TCP/UDP
TCP:传输控制协议
是一种面向连接、可靠的、基于字节流的传输层通信协议。数据大小无限制。
建立连接的过程需要三次握手, 断开连接的过程需要四次挥手
三次握手
客户端向服务端发起连接
服务端接收请求并进行确认
客户端对服务端的响应进行确认
四次挥手
客户端发起挥手请求
服务器端接收挥手请求
服务器发起关闭连接
客户端进入关闭连接的状态
UDP:用户数据报协议
是一种无连接的传输层协议,提供面向事务的简单、不可靠信息传送服务
每个包的大小是64KB
HTTP协议
HTTP请求
请求行
请求方法
GET
POST
OPTIONS
TRACE
Others
请求路径(即请求的相对路径)
请求协议
HTTP/1.1
HTTP/1.0
Others
请求头信息
Host(必须)
Cookie(模拟登陆)
Content-Type(PosT必须)
Content-Length(PoST必须)
Referer(HTTP访问的来源)
Others
请求主体信息(POST必须)
JSON
XML
HTTP响应
响应行
协议板本
状态码
1XX:接收到请球,地续处理
2XX:请求成功
3XX:请求重定向
302:请求被临时由定向到另一个地址
304:Not Modified〔资源未修改,从本地取缓存】
301:请求按永久重定问到另一个地址
307:重定问中保特原有的post数据,防止数据委失
304:Not Modified〔资源未修改,从本地取缓存】
301:请求按永久重定问到另一个地址
307:重定问中保特原有的post数据,防止数据委失
4XX:客户端请求错误
404:没有找到请求文件
403:客户请访问错误
403:客户请访问错误
5XX:服务端出现问题
状态文字
对于状态码的文字解将
响应头信息
IP
互联网协议/网际协议地址
分配给互联网设备的唯一数字标签(标识)
IPV4
4字节32位整数,分成4段8位的二进制数
255.255.255.255
IPV6
16字节128位整数,分成8段十六进制整数
FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
回环地址
127.0.0.1
localhost
Port端口
在通信实体上进行网络通讯的程序的唯一标识
0~65535
Web服务器:80
FTP服务器:21
InetAddress
标识互联网协议(IP)地址对象。封装了与该IP地址对象相关的所有信息,并提供常用方法
无法直接创建对象,构造方法私有化。需要通过getXXX方法来获得
Socket
是网络中的一个通信节点
分为客户端Socket和服务端ServerSocket
通信要求:IP地址+端口号
基于TCP的网络编程
基于字节节点流
socket通信节点
socket.getInputStream
socket.getOutputStream
案例:服务器与客户端互发消息
单客户端与服务器持续收发消息
多客户段与服务收发消息
客户端收发消息独立
多客户端群聊
UDP编程
数据报通信方式
数据的携带用DatagramPacket
DatagarmSocket创建连接
DataGrampackets(byte[],int n,ip,port)数据包创建
send(packet)
receive(packet)
拆包:getData()
数据相关信息,将字节数组转为字符串
getLength
getAddres
getPort
设计模式
概念
一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
可简单理解为特定问的固定解决方法
《设计模式》书中描述了23种设计模式
工厂模式
开发中有一个非常重要的原则开闭原则,对拓展开放、对修改关闭。
主要负责对象创建的问题
可通过反射进行工厂模式的设计,完成动态的对象创建
单例模式
模板模式
好处
可重用代码、让代码更容易被他人理解、保证代码可靠性、重用性。
算法
二分查找法
排序
选择排序
冒泡排序
快速排序
JDK8新特性
Java8(又称业D18)是Java语言开发的一个主要版本。
Oracle公司于2014年3月18日发布Java8
Oracle公司于2014年3月18日发布Java8
Lamada表达式
概念
特殊的匿名内部类,语法更简洁,工整
允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递
语法
<函数式接口> <变量名>=(参数1,参数2)→{};
函数式接口FunctionalIntrface
函数式接口
Stream API
概念
流( Stream)与集合类似,但集合中保存的是数据,而 Stream中保存对集合或数组数据的操作
Stream 原料 工序 Stream
特点
Stream自己不会存储元素。
Stream不会改变源对象。相反,他们会返回一个持有结果的新 Stream
Stream操作是延迟执行的,会等到需要结果的时候才执行。
使用步骤
创建
中间操作
在一个或多个步骤中,将初始 Stream转化到另一个 Stream的中间操作
使用一个终止操作来产生一个结果。该操作会强制之前的延迟操作立即执行,在此之后,该Seam就不能使用了
创建方法
通过 Collection对象的 stream()或 parallelStream()方法
通过 Arrays类的 stream()方法
通过 Stream接口的of0、 iterate( generate方法
通过 Instream、 OnstReam、 Doublestream接口中的of、 range、 ange Closed方法。
中间操作
fter、lmt、skip、 distinct、 sorted、map、parallel
终止操作
日期API
localDate
Date TimeFormatter
时间格式化类
Instant、 Zoned类
Instant表示瞬间;和前面Date类似
Zoned表示时区信息。
JVM调优
JUC安全并发包
反射,注解
反射
类对象
任何类的类对象都是Class
每个类只有一个类对象
类的对象
使用new关键字创建出来的对象,是一个具体的实例对象
获得类对象的三种方式
实例.getClass()
类.class
Class.forName("全类名");
全类名:包名+类名
获得方法
getDeclaredMethods()获得所有方法
getDeclaredMethod(方法名,Class**...**参数类对象)获得一个方法
子主题
调用方法
invoke(实例, Object...实参的值)调用方法
常用方法
注解Anotation
概念
代码里的特殊标记程序可以读取注解,一般用于替代配置文件
Class类型封装类(任意类)的成员信息,包括:属性、方法、构造。
开发人员可以通过注解告诉类如何运行。
典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运行类。
定义注解
使用@interface关键字
注解中只能包含属性
注解属性类型
枚举类型
String类型
基本数据类型
Cass类型
注解类型
以上类型的一维数组
常见注解@Override、@Deprecated
元注解:注解中的注解
@Retention 注解的生效时间RetentionPoclicy(枚举类)
Class
注解记录在class文件中,运行Java程序时, JVM不会保留,此为默认值
runtime:
注解记录在 class文件中,运行Java程序时,JVM会保留,程序可以通过反射获取该注释
source
编译时直接丢弃这种策略的注释
@Target 表示注解用于修饰那些成员ElementType(枚举类)
Class
Mehod
Field
strutor
getDeclaredAnnotation
获得注解
子主题
数据库
MySQL
基础
概念
数据库:数据库是“按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合
分类
状结构数据库
层次结构数据库
关系结构数据库
Oracle、DB2、 MYSQL SQL Server,以表格(Tabe)存储,多表间建立关联关系,通过分类、合并、连接、选取等运算实现访问
非关系型数据库
ElastecSearch、 MongoDB、 Redis,多数使用哈希表,表中以键值( key-value)的方式实现特定的指针指向的特定数据。
安装和使用
安装
一路下一步
端口号
默认为3306
字符编码方式
建议UTF-8
服务名称
默认是MySQL,不建议修改
环境变量设置
path=${安装路径}\bin
超级管理员账户一定是root
记好管理员密码
卸载
1.双击安装包进行卸载删除。
第二步:删除目录:
把C:\ProgramData下面的MySQL目录干掉。(隐藏目录)
把C:\Program Files (x86)下面的MySQL目录干掉。
把C:\ProgramData下面的MySQL目录干掉。(隐藏目录)
把C:\Program Files (x86)下面的MySQL目录干掉。
使用
启动MySQL的服务
计算机-->右键-->管理-->服务和应用程序-->服务-->找到mysql服务
登录
mysql -uroot -p密码
mysql默认自带了4个数据库。
|information_schema |
| mysql |
| performance_schema |
| test
| mysql |
| performance_schema |
| test
退出
exit;
客户端使用
Navicat for MySQL
服务器配置
基础语句
查看所有数据库
SHOW DATABASES;
选中数据库
use 库名;
创建数据库
creata database 库名 character set utf8;
删除数据库
drop database 库名;
查看mysql数据库的版本号
select version();
查看当前使用的是哪个数据库
select database();
查看库中的所有表
show databases;
创建表
创建表create table 表名( 字段 字符);
查询语句
基本查询
select * from 表名;
别名
字段 as ‘别名’
去重
distinct 字段
排序查询
select 字段 from 表名 order by 排序字段 排序规则
asc 升序
desc 降序
条件查询
select 字段 from 表名 where 判断条件
等值判断
=
逻辑判断
and or not
不等值判断
< > <= >= != <>
区间判断
between and
null判断
IS NULL ,IS NOT NULL
枚举查询
in(值1,值2,值3)
模糊查询
like 条件语句
_(单个字符)
%(任意个字符)
分支结构查询
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 结果
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
ELSE 结果
时间函数
SYSDATE()
当前系统时间
NOW()
当前系统时间
YEAR()
获得知道日期的年份
新增一个列:alter table 表 add column 列名 类型
修改列类型:alter table 表 modify 列名 新类型
修改列名:alter table 表 change 原列名 新列名 类型
删除列:alter table 表 drop 列名
修改列类型:alter table 表 modify 列名 新类型
修改列名:alter table 表 change 原列名 新列名 类型
删除列:alter table 表 drop 列名
SQL语句分类
数据查询语言(Data Query Language, DQL)
SELECT,FROM,WHERE,GROUP BY,HAVING和ORDER BY
数据定义语言 (Data Definition Language, DDL)
CREATE、ALTER与DROP
数据操纵语言(Data Manipulation Language, DML)
INSERT、UPDATE、DELETE
数据控制语言 (Data Control Language,DCL)
GRANT 和 REVOKE
多表查询语句
常见函数
约束语句
进阶
索引,索引原理和数据结构
用户权限管理
三大范式
视图,存储过程
ER图 ,Power Desiner
行专列,列转行
事务
概念
原理
四大特性
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
Explain
概念
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MYSQL是如何处理你的SQL语句。分析你的查询语句或是表结构的性能瓶颈
列的含义
id
id列的编号是select的序列号,有几个select就有几个id
id相同,执行顺序由上到下
id不同,如果是子查询,id的序号递增,id值越大优先级越高,越先被执行
d相同又不同,注意:id为NULL最后执行
select_type
表示对应行是简单还是复杂的查询
simple
简单查询。查询不包含子查询和union
primary
复杂查询中最外层的select
subquery
包含在select中的子查询(不在from子句中)
derived
包含在from子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)
UNION
若第二个SELECT出现在UNION之后,则标记为UNION
UNION RESULT
从UNION表获取结果的SELECT
table
显示这一行的数据是关于哪张表
type
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围
最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
NULL
mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可 以单独查找索引来完成,不需要在执行时访问表
一般来说,得保证查询达到range级别,最好达到ref
JDBC
概述
在实际开发中,当用户的数据发生改变时,不可能通过客户端操作执行SQL语句,因为操作量过大,无法保证效率和正确性。
JDBc( Java Database Connectivity)Java连接数据库的规范(标准),可以使用Java语言连接数据库完成CRUD操作。
Java中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式。由数据库厂商提供驱动实
连接流程
基本使用
查询封装(ORM)
注入攻击解决
事务控制
前端
HTML5
CSS
JavaScript
JQuery
BootStrap
LayUI
Vue
java面试
理论
微服务
将一个单体应用,拆分成多个
分布式
一个应用,分别部署在不同的服务器
CAP理论
在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性),不能同时成立。
只能要么保证AP,要么保证CP
Consistency(一致性)
值所有节点在同一时间数据完全一致
Availability(可用性)
服务一直可用,而且是正常相应时间
Partition Tolerance(分区容错性)
指分布式系统在遇到网络分区(即某些节点之间的网络连接中断)时,仍能够继续正常工作的能力。
Base理论
Base 理论的核心思想是最终一致性,即使无法做到强一致性(Strong Consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual Consistency)。
基本可用(Basically Available)
基本可用本质是一种妥协,也就是出现节点故障或者系统过载时,通过牺牲非核心功能的可用性,保障核心功能的稳定运行。
实现基本可用的几个策略:
1、流量削峰(不同地区售票时间错峰出售)
以订票系统设计为例,在春运期间,开始借票前后会出现及其海品的请求峰值。
可以在不同的时间。出售不同区域的票,将访问请求错开,削弱请求峰值。
2、延迟响应,异步处理(买票排队,基于队列先收到用户买票请求,排队异步处理,延迟响应)
还以订票系统为例。用户提交购票请求后,往往会在队列中排队等待处理。可能几分钟或十几分钟后:系统才开始
处理,然后响应处理结果。
3、体验降级(看到非实时数据,采用缓存数据提供服务)
以互联网系统为例,若出现网络热点申件,产生了海量的突发流量,系统过载,大虽图片因为网路超时无法显示,
那么可以用小图片代替原始图片,降低图片的清晰度和大小,提升系统处理能力。
4、过载保护溶断/限流,直接拒绝掉一部分请求,或者当清求队列满了,移除部分清求,保证整体系统可
把接收到的清球放在指定的队列中排队处理,如果请求等待时间超时,这时直接拒绝超时清球:如果队列满了之
后,就清除队列中一定数量的非邦队请求,保护系统不过载,实现系统堪本可用。
5、故障隔离(出现故障,做到故障隔离,避免影响其他服务)
1、流量削峰(不同地区售票时间错峰出售)
以订票系统设计为例,在春运期间,开始借票前后会出现及其海品的请求峰值。
可以在不同的时间。出售不同区域的票,将访问请求错开,削弱请求峰值。
2、延迟响应,异步处理(买票排队,基于队列先收到用户买票请求,排队异步处理,延迟响应)
还以订票系统为例。用户提交购票请求后,往往会在队列中排队等待处理。可能几分钟或十几分钟后:系统才开始
处理,然后响应处理结果。
3、体验降级(看到非实时数据,采用缓存数据提供服务)
以互联网系统为例,若出现网络热点申件,产生了海量的突发流量,系统过载,大虽图片因为网路超时无法显示,
那么可以用小图片代替原始图片,降低图片的清晰度和大小,提升系统处理能力。
4、过载保护溶断/限流,直接拒绝掉一部分请求,或者当清求队列满了,移除部分清求,保证整体系统可
把接收到的清球放在指定的队列中排队处理,如果请求等待时间超时,这时直接拒绝超时清球:如果队列满了之
后,就清除队列中一定数量的非邦队请求,保护系统不过载,实现系统堪本可用。
5、故障隔离(出现故障,做到故障隔离,避免影响其他服务)
软状态(Soft State)
软状态(弱状态)·>允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不
同节点的数据副本存在数据诞迟。
同节点的数据副本存在数据诞迟。
最终一致性(Eventually Consistent)
上面说软状态,然后不可能一直是软状态,必须有个时间期那限。在期限过后。应当保证所有副本保特贸据一致性。
从而达到傲据的最终一致性。这个时间期哪限取决于网络延时,系统负载。数据复制方案设计等等因素。
从而达到傲据的最终一致性。这个时间期哪限取决于网络延时,系统负载。数据复制方案设计等等因素。
分布式事务
分布式事务是相对本地事务而言的,对于本地事务,利用数据库本身的事务机制,就可以保证事务的ACD
特性。
特性。
实现方案
2PC
3PC
TCC
Saga事务
MQ
最大努力通知
CAS操作
CAS(Compare and Swap)操作是一种原子操作,用于实现无锁并发。
它的基本原理是:先比较内存中的值和期望值是否相等,如果相等,则将新值写入内存中;否则不做任何操作。整个操作是原子性的,不会被其他线程中断。
缺点
开销大
只能确保一个共享变量
ABA问题
java基础
jvm
jvm的组成原理
JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载器)、Execution engine(执行引擎);两个
组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。
·Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data areal中的method area。
·Execution engine(执行引擎):执行classes中的指令。
·Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。
.Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。
组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。
·Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data areal中的method area。
·Execution engine(执行引擎):执行classes中的指令。
·Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。
.Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。
作用:首先通过编译器把Java代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存
中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是JVM的一套指令集规
范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),
将字节码翻译成底层系统指令,再交由CPU去执行,而这个过程中需要调用其他语言的本地库接口
(Native Interface)来实现整个程序的功能。
中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是JVM的一套指令集规
范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),
将字节码翻译成底层系统指令,再交由CPU去执行,而这个过程中需要调用其他语言的本地库接口
(Native Interface)来实现整个程序的功能。
jvm的类加载机制
Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而类加载器的工作就
是把class文件从硬盘读取到内存中。
是把class文件从硬盘读取到内存中。
类装载方式,有两种:
1.隐式装载, 比如new 方式生成对象时,隐式调用类装载器加载对应的类到jvm中;
2.显式装载,通过class.forname()等方法,显式加载需要的类;
Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是
基类)完全加载到jvm中,其他类需要的时候才加载。这是为了节省内存开销。
1.隐式装载, 比如new 方式生成对象时,隐式调用类装载器加载对应的类到jvm中;
2.显式装载,通过class.forname()等方法,显式加载需要的类;
Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是
基类)完全加载到jvm中,其他类需要的时候才加载。这是为了节省内存开销。
类装载分为以下 5 个步骤:
加载:根据路径找到 class 文件然后导入;
验证:检查加载的 class 文件的正确性;
准备:给类中的静态变量分配内存空间;
解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而直接引用直接指向内存中的地址;
初始化:对静态变量和静态代码块执行初始化工作。
使用:
卸载:
加载:根据路径找到 class 文件然后导入;
验证:检查加载的 class 文件的正确性;
准备:给类中的静态变量分配内存空间;
解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而直接引用直接指向内存中的地址;
初始化:对静态变量和静态代码块执行初始化工作。
使用:
卸载:
主要有一下四种类加载器:
1. 启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用。
2. 扩展类加载器(extensions class loader):它用来加载Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。
3.系统类加载器(system class loader): 它根据Java 应用的类路径(CLASSPATH)来加载Java类。一般来说, Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它。
4.用户自定义类加载器,通过继承java.lang.ClassLoader类的方式实现。
双亲委派机制:
如果一个类加载器收到了类请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加
载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没
找到所需的类)时,子加载器才会尝试去加载类。
当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果
此时父类不能加载,反馈给子类,由子类去完成类的加载。
如果一个类加载器收到了类请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加
载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无法完成加载请求(它的搜索范围中没
找到所需的类)时,子加载器才会尝试去加载类。
当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果
此时父类不能加载,反馈给子类,由子类去完成类的加载。
线程
线程
线程和进程的区别
一个运行中的程序就是一个进程,一个进程可以包含多个进程,进程
进程是系统资源分配的基本单位,线程是CPU调度的基本单位
进程间不能共享数据段地址,但同进程下的线程可以
线程的五种状态
准备状态
就绪状态
运行状态
阻塞状态
死亡状态
创建线程的方式
1.集成thread类
2.实现runable
3.实现callable
sleep()方法和对象的wait()方法都可以让线程暂停执行,有什么区别
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。
线程的优先级
synchronized和lock的区别
1、synchronized是Java的关键字,jvm级别,lock是一个接口
2、synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3、synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;lock必须手动unlock来释放锁,可能引起死锁的发生
4、synchronized只能等待锁的释放,不能响应中断;lock等待锁过程中可以用interrupt来中断等待
5、synchronized锁适合代码少量的同步问题;Lock锁适合大量同步的代码的同步问题
wait,notify和notifyAlli这些方法不在thread类里面
JAVA提供的锁是对象级的而不是线程级的锁。
每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wit(0方法就有意义了。
如果wait(O方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。
简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object中因为锁属于对象。
每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wit(0方法就有意义了。
如果wait(O方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。
简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object中因为锁属于对象。
多线程
并发容器
string,stringbuffer,stringbuilder的区别
1.String是不可变的,如果尝试去修改,会新生成一个字符串对象,StringBuffer和StringBuilder是可变的
2.StringBuffer是线程安全的,StringBuilder是线程不安全的,所以在单线程环境下StringBuilder效率会更高
泛型中extends和super的区别
1.<?extends T>表示包括T在内的任何T的子类
2.<?super T>表示包括T在内的任何T的父类
==和equals方法的区别
==:如果是基本数据类型,比较是值,如果是引用类型,比较的是引用地址
equals:具体看各个类重写equals方法之后的比较逻辑,比如String类,虽然是引用类型,但是String类中重写了equals方法,方法内部比较的是字符串中的各个字符是否全部相等。
下列哪些类可以被继承()
A.java.lang.Thread
B.java.lang.Number
C.java.lang.Double
D.java.lang.Math
E.java.lang.String
F.java.lang.ClassLoader
B.java.lang.Number
C.java.lang.Double
D.java.lang.Math
E.java.lang.String
F.java.lang.ClassLoader
//todo
//todo
>增加内嵌Tomcat:容器的连接数;
>使用异步,业务代码添加@aysnc注解、启动类添加@EnableAsync注解;
>默认Tomcat容器改为Undertow(Tomcat:5000,Undertow:8000);
>不使用@Spring BootApplication,精确指定自动配置类;
>JVM启动参数调优:
>使用异步,业务代码添加@aysnc注解、启动类添加@EnableAsync注解;
>默认Tomcat容器改为Undertow(Tomcat:5000,Undertow:8000);
>不使用@Spring BootApplication,精确指定自动配置类;
>JVM启动参数调优:
spring
Spring框架中使用了哪些设计模式及应用场景?
1.工厂模式
在各种BeanFactory以及ApplicationContext创建中都用到了
2.模版模式
在各种BeanFactoryl以及ApplicationContext实现中也都用到了
3.代理模式
Spring AOP利用了Aspecj AOP实现的!Aspecj AOP的底层用了动态代理
4,策略模式
加载资源文件的方式,使用了不同的方法,比如:ClassPathResourece,FileSystemResource,ServletContextResource,UrIResource但他f们都有共同的接口Resource;
在Aop的实现中,采用了两种不同的方式,JDK动态代理和CGLIB代理
在Aop的实现中,采用了两种不同的方式,JDK动态代理和CGLIB代理
5.单例模式
比如在创建bean的时候
6.现察者模式
springe中的ApplicationEvent,.ApplicationListener,ApplicationEventPublisher
7.适配器模式
MethodBeforeAdviceAdapter,ThrowsAdviceAdapter,AfterReturningAdapter
8.装饰者模式
源码中类型带Wrapper或者Decorator的都是
spring全家桶有哪些
Spring Framework
Spring MVC
Spring Boot
Spring Data
Spring Cloud
Spring Security
@autowired和resource的区别
@Resource
bean注入
Resource默认按照ByName自动注入
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。
属于java
@Autowired
bean注入
Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的
required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用
required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用
属于spring
如何实现AOP,项目哪些地方用到了AOP?
利用动态代理技术来实现AOP,比如JDK动态代理或CgLib动态代理,利用动态代理技
术,可以针对某个类生成代理对象,当调用代理对象的某个方法时,可以任意控制该方
法的执行,比如可以先打印执行时间,再执行该方法,并且该方法执行完成后,再次打
印执行时间。项目中,比如事务、权限控制、方法执行时长日志都是通过AOP技术来
实现的,凡是需要对某些方法做统一处理的都可以用AOP来实现,利用AOP可以做到
业务无侵入。
术,可以针对某个类生成代理对象,当调用代理对象的某个方法时,可以任意控制该方
法的执行,比如可以先打印执行时间,再执行该方法,并且该方法执行完成后,再次打
印执行时间。项目中,比如事务、权限控制、方法执行时长日志都是通过AOP技术来
实现的,凡是需要对某些方法做统一处理的都可以用AOP来实现,利用AOP可以做到
业务无侵入。
spring mvc
SpringMVC
执行流程
子主题
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。
spring boot
Spring Boot的配置文件有哪几种格式?它们有什么区别
主要有.properties和.yml格式,它们的区别主要是书写格式不同。另外,yml格式不支持@PropertySource注解导入配置。
Spring Boot的核心配置文件有哪几个?它们的区别是什么?
Spring Boot的核心配置文件是application和bootstrap配置文件
application配置文件主要用于Spring Boot项目的自动化配置
bootstrap配置文件有三个应用场景
使用Spring Cloud Config配置中心时,需要在bootstrap配置文件中添加连接到配置中心的配置属性,来加载外部配置中心的配置信息:
一些固定的不能被覆盖的属性;
一些加密或解密的场景:
请描述Spring Boot自动装配的过程
@EnableAutoConfiguration注解、@Configuration注解和@ConditionalOnClassi注解组成了Spring Boot自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。具体是通过maveni读取每个starter中的spring.factories.文件,该文件配置了所有需要被创建在spring容器中的bean。
介绍Spring Bootl的启动流程
首先,Spring Boot]项目创建完成会默认生成一个名为*Application的入口类,我们是通过该类的main方法启动Spring Bootl项目的。在main方法中,通过SpringApplication的静态方法,即run方法进行SpringApplication类的实例化操作,然后再针对实例化对象调用另外一个run方法来完成整个项目的初始化和启动。SpringApplication调用的run方法的大致流程:
1、获取SpringApplicationListener监听器;
2、启动所获取到的所有监听器:
3、初始化ConfigurableEnvironment(配置文件);
4、打印Banner图标
5、创建容器ConfigurableApplicationContext;
6、准备容器ConfigurableApplicationContext;
7、初始化容器ConfigurableApplicationContext;
8、监听器通知容器启动完成:
9、监听器通知容器正在运行;
除了上述核心操作,u方法运行过程中还涉及启动时长统计、异常报告、启动日志、异常处理
@Transactional失效的场景
//todo
Spring Boot是否可以使用XML配置?Spring Boot可以兼容老Spring项目吗
Spring Boot推荐使用Java配置同时支持XML配置,通过@ImportResource注解加载XML配置;
可以兼容,使用@ImportResource注解导入老Spring项目配置文件。
application.propertiesi和bootstrap.properties?有何区别;
bootstrap比applicaton优先加载,配置在应用程序上下文的引导阶段生效,而且boostrap里面的属性不能被覆盖;
application,用于spring boot项目的自动化配置。
4、什么是YAML,有什么优点。
YAML是一种可读的数据序列化语言,它通常用于配置文件。
优点:
配置有序
支持数组,数组中的元素可以是基本数据类型或者对象
简洁方便
配置有序
支持数组,数组中的元素可以是基本数据类型或者对象
简洁方便
spring cloud
Springcloud五大组件
eureka注册中心
zuul网关
ribbob服务调用
config配置中心
hystrix熔断器
消息队列有哪些作用
1,解调:使用消息队列作为两个系统直接的通讯方式。两个系统不需要相互依赖了
2.异步:系统A给消容队列发送完消息之后,就可以继续其他事情了
3.流量削峰:如果使用消息队列的方式来调用某个系统,那么消息将在队列中排队,由消费者白己控制消费速度
死信队列是什么?延时队列是什么?
1.死信认列也是一个消息队列,它是用来存放那些没有被成功消费的消息的,通常可以用来作为消息重试
2.延时认列通常是用来存放需要在指定时间被处理的元泰的队列,通常可以用来处理一些具有过期性操作的业务,比如十分中内未支付则取消订单
线上接口响应很慢一般是哪些问题?
1、数据库问题
数据库数据量过大
深度分页问题
查询未命中索引
表没有建立索引
join连表过多
2、业务代码问题
代码逻辑冗余
循环调用
3、JVM、线程池问题
线程个数过多或者过少
JVM设置不合理
4、机器性能问题
磁盘IO,CPU性能太差、内存太小
幂等性的理解
幂等性:一个接口多次调用没有副作用;
场景:用户重复操作,代码重试,消息重复消费,网络波动等:
解决方法:唯一索引去重,Token+Redis,状态机,乐观锁,分布式锁,全局唯一号等;
数据库
简述sql语言
概念
SQL语言介绍 SQL(Structure Query Languge,结构化查询语言)是一种数据库专用的计算机语言,不管是Oracle、MS SQL 、Access、MySQL或其他公司的数据库,也不管数据库建立在大型主机或个人计算机上,都可以使用SQL语言来访问和修改数据库的内容。虽然不同公司的数据库软件多多少少会增加一些专属的SQL语法,但大体上,它们还是遵循ASNI(美国国家标准协会)制定的SQL标准。因为SQL语言具有易学习及阅读等特性,所以SQL逐渐被各种数据库厂商采用,而成为一种共通的标准查询语言。只要你学会SQL,即可操作各种数据库如Visual Foxpro、Access、dBase等等。总之,SQL语言是各种数据库都可以使用的数据库查询语言。 SQL语言不仅仅具有查询数据库的功能,而且可以对数据库完成选取、增删、更新与跳转等各种操作。
特点
1. 综合统一
SQL则集数据定义语言DDL、数据操纵DML、数据控制语言DCL的功能于一体,语言风格统一,可以以独立完成数据库生命周期中的全部活动,包括:
定义关系模式,插入数据,建立数据库;
对数据库中的数据进行查询和更新;
数据库重构和维护;
数据库安全性、完整性控制; 等一系列操作要求。
这就为数据库应用系统的开发提供了良好的环境。特别是用户在数据库系统投入运行后,还可根据需要随时地逐步地修改模式,并不影响数据库的运行,从而使系统具有良好的可扩展性。
定义关系模式,插入数据,建立数据库;
对数据库中的数据进行查询和更新;
数据库重构和维护;
数据库安全性、完整性控制; 等一系列操作要求。
这就为数据库应用系统的开发提供了良好的环境。特别是用户在数据库系统投入运行后,还可根据需要随时地逐步地修改模式,并不影响数据库的运行,从而使系统具有良好的可扩展性。
2. 高度非过程化
而用SQL进行数据操作,只要提出“做什么”,而无须指明“怎么做”,因此无需了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性
3. 面向集合的操作方式
非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而SQL采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
4. 以同一种语法结构提供多种使用方式
SQL既是独立的语言,又是嵌入式语言。 作为独立的语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作;作为嵌入式语言,SQL语句能够嵌入到高级语言程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL的语法结构基本上是一致的。这种以统一的语法结构提供多种不同使用方式的做法,提供了极大的灵活性与方便性。
5. 语言简洁,易学易用
SQL功能极强,但由于设计巧妙,语言十分简洁,完成核心功能只有9个动词,如表所示。SQL接近英语口语,因此容易学习,容易使用。
分类
数据查询语言(Data Query Language, DQL)
SELECT,FROM,WHERE,GROUP BY,HAVING和ORDER BY
数据定义语言 (Data Definition Language, DDL)
CREATE、ALTER与DROP
数据操纵语言(Data Manipulation Language, DML)
INSERT、UPDATE、DELETE
数据控制语言 (Data Control Language,DCL)
GRANT 和 REVOKE
事务控制语言(Trasactional Control Languag,TCL)
commit、rollback。
MySql慢查询如何优化
1.检查是否走了索引,如果没有则优化SQL利用索引
2.检查所利用的索引,是否是最优索引
3.检查所查字段是否都是必须的,是否查询了过多字段,查出了多余数据
4.检查表中数据是否过多,是否应该进行分库分表了
5.检查数据库实例所在机器的性能置,是否太低,是否可以造当增加资源
事务
四大特性
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
连接池有什么作用
由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的),为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。池化技术在Java开发中是很常见的,在使用线程时创建线程池的道理与此相同。基于Java的开源数据库连接池主要有:C3P0、Proxool、DBCP、BoneCP、Druid等。
前端
GET与POST区别
(1) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(2) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(3) 安全性问题。使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。
收藏
0 条评论
下一页