Java学习
IDEA使用 -> Java语法 -> Web基础 -> 数据库基础 -> JavaWeb框架(JDBC, Maven, MyBatis, )
一、Java基础
基础数据类型
- 数据类型:short、int、byte、char、long、float、double、boolean
- 包装类型:Short、Int、Byte、Character、Long、Float、Double、Boolean
- long变量后加L或l、float变量后加F或f,double可加可不加
- === IEEE754标准 ===
- === 变量间的转换===
运算符
- == 和 != 适用于所有对象,用于比较对象的引用是否相同
- 引用:Java 中一切都是对象,但操作的标识符实际是对象的一个引用
- equals()方法用于比较内容是否相通;equalsIgnoreCase()忽略大小写;==用于比较对象在内存中的地址是否相同
流程控制语句
数组
- 将a1[]赋值给a2[]只是复制了一个引用,即 a2 和 a1 是相同数组的不同名称
- foreach用法:for(int age:ages){}
面向对象编程
- 类
- 类中方法体外的变量是成员变量,也可能是用static修饰的类变量也叫静态变量。方法、构造方法或者语法块的是局部变量,会自动销毁
- 对象
- 定义类的时候不会为类开辟内存空间,但是一旦创建了对象,系统就会在内存中为对象开辟一块空间,用来存放对象的属性值和方法。
- 构造方法
- 引用与对象实例
- String s = new String(“123”);
- s是引用,在栈空间;new String()是对象,放在heap;new String(“123”)是实例,放在heap,这里是String,”123”放在常量池
- 实例可以说是一个对象,但是不能说一个对象是一个实例,根据构造方法的不同会形成不同给的实例
- static
- 被 static 修饰的方法是静态方法,静态方法不依赖于对象,不需要将类实例化便可以调用,由于不实例化也可以调用,所以不能有 this,也不能访问非静态成员变量和非静态方法。但是非静态成员变量和非静态方法可以访问静态方法。
- final
- 封装
- private getter() setter()
- this是当前对象(new String())
- 继承
- 子类拥有父类除 private 以外的所有属性和方法、子类可以拥有自己的属性和方法、子类可以重写实现父类的方法、Java 中的继承是单继承,一个类只有一个父类
- 子类构造方法需要调用父类的构造方法时,在子类的构造方法体里最前面的位置:super()
- 方法重载与重写
- 重载:方法名相同,但参数不同的多个方法
- 重写:返回值类型,参数类型及个数,和方法名都必须一致
- 多态
- 多态的实现方式:继承父类进行方法重写,抽象类和抽象方法,接口实现
- 多态有三个必要条件:继承、重写和向上转型(即父类引用指向子类对象)
- 抽象类
- 抽象类中可以包含普通的方法,也可以没有抽象方法
- 接口
- 接口不能用于实例化对象
- 接口不能用于实例化对象。
- 接口中方法只能是抽象方法、default 方法、静态方法。
- 接口成员是 static final 类型。
- 接口支持多继承。
- 内部类
- 内部类的成员变量 / 方法名可以和外部类的相同
- 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
- 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
- 内部类允许继承多个非接口类型
- 成员内部类的定义:内部类 对象名 = 外部类对象.new 内部类()
- 静态内部类
- 静态内部类不能直接访问外部类的非静态成员,但可以通过
new 外部类().成员
的方式访问 - 如果外部类的静态成员与内部类的成员名称相同,可通过
类名.静态成员
访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过成员名
直接调用外部类的静态成员 - 创建静态内部类的对象时,不需要外部类的对象,可以直接创建
内部类 对象名 = new 内部类();
- 静态内部类不能直接访问外部类的非静态成员,但可以通过
- 匿名内部类
常用类
- Arrays
- StringBuilder
- 在经常改变字符串内容时不用String;StringBuilder 是线程不安全的,效率较高;而StringBuffer 是线程安全的,效率较低;StringBuffer 有同步锁,StringBuilder 没有,单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer
- Calendar
- Date
- Math
- System
- Random
泛型
- 只能是引用类型,参数可有多个
- 可以用使用 extends 语句或者 super 语句 如
表示类型的上界,T 只能是 superClass 或其子类, 表示类型的下界,K 只能是 childClass 或其父类 - 可以是通配符类型,比如常见的 Class<?>。单独使用 ? 可以表示任意类型。也可以结合 extends 和 super 来进行限制
集合框架
ArrayList在使用的时候默认的初始化对象数组的大小长度为10,如果空间不足采用2倍形式进行容量的扩充,如果保存大数据的时候有可能造成垃圾的产生以及性能的下降,但是这个时候可以使用LinkedList子类保存
Vector类的操作方法采用的都是synchronize同步处理,而ArrayList并没有进行同步处理,所有Vector类中方法在多线程访问的时候属于线程安全的,但是性能不如ArrayList高,所以在考虑到线程并发访问的情况下才会去使用Vector子类
判断重复元素的判断处理就是hashCode()与equals()两个方法共同完成
HashMap中的方法都属于异步操作(非线程安全),HashMap允许保存的数据为空,Hashtable中的方法都属于同步操作(线程安全),Hashtable不允许保存null数据,否则会出现NullPointException异常。
初始化容量扩充为16,当保存内容的容量扩充超过了与阈值*0.75=12时,就会进行容量的扩充。在进行扩充的时候HashMap采用的成倍的扩充模式即:每一次扩充两倍
Iterator
异常处理
- try的意思是试试它所包含的代码段中是否会发生异常
- catch当有异常时抓住它,并进行相应的处理,使程序不受异常的影响而继续执行下去
- throw是在程序中明确引发异常。出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw
- throws的作用是如果一个方法可以引发异常,而它本身并不对该异常处理,那么它必须将这个异常抛给调用它的方法。出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型
- finally是无论发不发生异常都要被执行的代码
Lambda表达式
- Lambda 表达式优先用于定义功能接口在行内的实现,即单个方法只有一个接口
- Lambda 表达式让匿名类不再需要,这为 Java 增添了简洁但实用的函数式编程能力
- 方法引用可以通过方法的名字来引用其本身。方法引用是通过::来描述的
- 构造器引用。语法是Class::new,或者更一般的 Class
::new,要求构造器方法是没有参数; - 静态方法引用。语法是 Class::static_method
- 特定类的任意对象方法引用。它的语法是 Class::method
- 特定对象的方法引用,它的语法是 instance::method
- 构造器引用。语法是Class::new,或者更一般的 Class
函数式接口
Stream流
- 元素序列:Stream 以序列的形式提供了特定类型的元素的集合。根据需求,它可以获得和计算元素,但不会储存任何元素
- 源:Stream 可以将集合、数组和 I/O 资源作为输入源
- 聚集操作:Stream 支持诸如 filter、map、limit、reduce 等的聚集操作
- 流水技术:许多 Stream 操作返回了流本身,故它们的返回值可以以流水的行式存在。这些操作称之为中间操作,并且它们的功能就是负责输入、处理和向目标输出。collect() 方法是一个终结操作,通常存在于流水线操作的末端,来标记流的结束
- 自动迭代:Stream 的操作可以基于已提供的源元素进行内部的迭代,而集合则需要显式的迭代
- flatMap:Stream
mergerStream = Stream.of(stream1, stream2, stream3).flatMap((i) -> i
io编程
- 接口 DataInput 和 DataOutput,设计了一种较为高级的数据输入输出方式:除了可处理字节和字节数组外,还可以处理 int、float、boolean 等基本数据类型,这些数据在文件中的表示方式和它们在内存中的一样,无须转换,如 read(), readInt(), readByte()…; write(), writeChar(), writeBoolean()… 此外,还可以用 readLine() 方法读取一行信息。
- 将匿名对象 写入到file中,注意:被写入的对象必须实现了Serializable接口:ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file)); objectOutputStream.writeObject(new User(“shiyanlou”, “password”));static class User implements ==Serializable==
- NIO是面向缓存的、非阻塞的 IO,而标准 IO 是面向流的,阻塞的 IO
网络编程
- Socket(IP,Port) ServerSocket(Port)
- TCP和UDP
- HttpURLConnection
多线程
创建线程的方法:
继承 Thread 类并重写它的 run()方法,然后用这个子类来创建对象并调用 start() 方法
定义一个类并实现 Runnable 接口,实现 run() 方法,当一个线程已经继承了另一个类时,就建议你通过实现Runnable接口来构造
Synchronized
- 对普通方式使用,将会锁住当前实例对象
- 对静态方法使用,将会锁住当前类的 Class 对象
- 对代码块使用,将会锁住代码块中的对象
线程池
concurrent
JDBC
- 导入 JDBC 驱动: 只有拥有了驱动程序我们才可以注册驱动程序完成连接的其他步骤
- 注册 JDBC 驱动程序:这一步会导致 JVM 加载所需的驱动类实现到内存中,然后才可以实现 JDBC 请求
- 数据库 URL 指定:创建具有正确格式的地址,指向到要连接的数据库
- 创建连接对象:最后,代码调用 DriverManager 对象的 getConnection() 方法来建立实际的数据库连接
- Statement, CallableStatement, PreparedStatement和ResultSet
- 事务
反射
- Class 类没有公共构造方法,可以通过以下方法获取 Class 实例。
- Object 提供的 getClass() 方法
- 类名.Class
- Class.forName(String className) 方法,className 为类的全限定名
正则表达式
- //Pattern类 正则表达式的编译表示
- Pattern pattern = Pattern.compile(“^[a-zA-Z0-9_!#$%&’*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$”);
- String[] emails = {“shiyanlou@shiyanlou.com“, “shiyanlou”};
- for (String email : emails) {
- //Matcher 通过解释Pattern对字符序列执行匹配操作的引擎
- Matcher matcher = pattern.matcher(email);
- System.out.println(email + “匹配结果:” + matcher.matches());
- }
设计模式
- 中介模式
- 代理模式
- 责任链模式
Web基础
CSS
JS
HTML
Java Web框架
Maven
- 目录结构
- groupId:所需Jar包的项目名 artifactId:所需Jar包的模块名 version:所需Jar包的版本号
- pom.xml详解:https://blog.csdn.net/lovequanquqn/article/details/81627807)
MySql
事务(Transaction)
1、开启:begin;或start transaction; 2、提交:commit; 3、回滚:rollback;
MyBatis(持久层)
入门:
1、pom.xml配置,,resources创建mybatis-config.xml、logback和UserMapper.xml
2、User类 3、加载配置文件,获取SQLSessionFactory 4、获取SqlSession对象
5、执行Sql后释放资源
HTTP
Tomcat
Servlet
JSP
会话技术
Filter
1Listener
AJAX
Vue
Element
Spring
Spring MVC
Spring Boot
Netty
Spring Security
IDEA使用 -> Java语法 -> Web基础 -> 数据库基础 -> JavaWeb框架(JDBC, Maven, MyBatis, )
一、Java基础
基础数据类型
- 数据类型:short、int、byte、char、long、float、double、boolean
- 包装类型:Short、Int、Byte、Character、Long、Float、Double、Boolean
- long变量后加L或l、float变量后加F或f,double可加可不加
- === IEEE754标准 ===
- === 变量间的转换===
运算符
- == 和 != 适用于所有对象,用于比较对象的引用是否相同
- 引用:Java 中一切都是对象,但操作的标识符实际是对象的一个引用
- equals()方法用于比较内容是否相通;equalsIgnoreCase()忽略大小写;==用于比较对象在内存中的地址是否相同
流程控制语句
数组
- 将a1[]赋值给a2[]只是复制了一个引用,即 a2 和 a1 是相同数组的不同名称
- foreach用法:for(int age:ages){}
面向对象编程
- 类
- 类中方法体外的变量是成员变量,也可能是用static修饰的类变量也叫静态变量。方法、构造方法或者语法块的是局部变量,会自动销毁
- 对象
- 定义类的时候不会为类开辟内存空间,但是一旦创建了对象,系统就会在内存中为对象开辟一块空间,用来存放对象的属性值和方法。
- 构造方法
- 引用与对象实例
- String s = new String(“123”);
- s是引用,在栈空间;new String()是对象,放在heap;new String(“123”)是实例,放在heap,这里是String,”123”放在常量池
- 实例可以说是一个对象,但是不能说一个对象是一个实例,根据构造方法的不同会形成不同给的实例
- static
- 被 static 修饰的方法是静态方法,静态方法不依赖于对象,不需要将类实例化便可以调用,由于不实例化也可以调用,所以不能有 this,也不能访问非静态成员变量和非静态方法。但是非静态成员变量和非静态方法可以访问静态方法。
- final
- 封装
- private getter() setter()
- this是当前对象(new String())
- 继承
- 子类拥有父类除 private 以外的所有属性和方法、子类可以拥有自己的属性和方法、子类可以重写实现父类的方法、Java 中的继承是单继承,一个类只有一个父类
- 子类构造方法需要调用父类的构造方法时,在子类的构造方法体里最前面的位置:super()
- 方法重载与重写
- 重载:方法名相同,但参数不同的多个方法
- 重写:返回值类型,参数类型及个数,和方法名都必须一致
- 多态
- 多态的实现方式:继承父类进行方法重写,抽象类和抽象方法,接口实现
- 多态有三个必要条件:继承、重写和向上转型(即父类引用指向子类对象)
- 抽象类
- 抽象类中可以包含普通的方法,也可以没有抽象方法
- 接口
- 接口不能用于实例化对象
- 接口不能用于实例化对象。
- 接口中方法只能是抽象方法、default 方法、静态方法。
- 接口成员是 static final 类型。
- 接口支持多继承。
- 内部类
- 内部类的成员变量 / 方法名可以和外部类的相同
- 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
- 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
- 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便
- 内部类允许继承多个非接口类型
- 成员内部类的定义:内部类 对象名 = 外部类对象.new 内部类()
- 静态内部类
- 静态内部类不能直接访问外部类的非静态成员,但可以通过
new 外部类().成员
的方式访问 - 如果外部类的静态成员与内部类的成员名称相同,可通过
类名.静态成员
访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过成员名
直接调用外部类的静态成员 - 创建静态内部类的对象时,不需要外部类的对象,可以直接创建
内部类 对象名 = new 内部类();
- 静态内部类不能直接访问外部类的非静态成员,但可以通过
- 匿名内部类
常用类
- Arrays
- StringBuilder
- 在经常改变字符串内容时不用String;StringBuilder 是线程不安全的,效率较高;而StringBuffer 是线程安全的,效率较低;StringBuffer 有同步锁,StringBuilder 没有,单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer
- Calendar
- Date
- Math
- System
- Random
泛型
- 只能是引用类型,参数可有多个
- 可以用使用 extends 语句或者 super 语句 如
表示类型的上界,T 只能是 superClass 或其子类, 表示类型的下界,K 只能是 childClass 或其父类 - 可以是通配符类型,比如常见的 Class<?>。单独使用 ? 可以表示任意类型。也可以结合 extends 和 super 来进行限制
集合框架
ArrayList在使用的时候默认的初始化对象数组的大小长度为10,如果空间不足采用2倍形式进行容量的扩充,如果保存大数据的时候有可能造成垃圾的产生以及性能的下降,但是这个时候可以使用LinkedList子类保存
Vector类的操作方法采用的都是synchronize同步处理,而ArrayList并没有进行同步处理,所有Vector类中方法在多线程访问的时候属于线程安全的,但是性能不如ArrayList高,所以在考虑到线程并发访问的情况下才会去使用Vector子类
判断重复元素的判断处理就是hashCode()与equals()两个方法共同完成
HashMap中的方法都属于异步操作(非线程安全),HashMap允许保存的数据为空,Hashtable中的方法都属于同步操作(线程安全),Hashtable不允许保存null数据,否则会出现NullPointException异常。
初始化容量扩充为16,当保存内容的容量扩充超过了与阈值*0.75=12时,就会进行容量的扩充。在进行扩充的时候HashMap采用的成倍的扩充模式即:每一次扩充两倍
Iterator
异常处理
- try的意思是试试它所包含的代码段中是否会发生异常
- catch当有异常时抓住它,并进行相应的处理,使程序不受异常的影响而继续执行下去
- throw是在程序中明确引发异常。出现在方法体中,用于抛出异常。当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw
- throws的作用是如果一个方法可以引发异常,而它本身并不对该异常处理,那么它必须将这个异常抛给调用它的方法。出现在方法的声明中,表示该方法可能会抛出的异常,允许throws后面跟着多个异常类型
- finally是无论发不发生异常都要被执行的代码
Lambda表达式
- Lambda 表达式优先用于定义功能接口在行内的实现,即单个方法只有一个接口
- Lambda 表达式让匿名类不再需要,这为 Java 增添了简洁但实用的函数式编程能力
- 方法引用可以通过方法的名字来引用其本身。方法引用是通过::来描述的
- 构造器引用。语法是Class::new,或者更一般的 Class
::new,要求构造器方法是没有参数; - 静态方法引用。语法是 Class::static_method
- 特定类的任意对象方法引用。它的语法是 Class::method
- 特定对象的方法引用,它的语法是 instance::method
- 构造器引用。语法是Class::new,或者更一般的 Class
函数式接口
Stream流
- 元素序列:Stream 以序列的形式提供了特定类型的元素的集合。根据需求,它可以获得和计算元素,但不会储存任何元素
- 源:Stream 可以将集合、数组和 I/O 资源作为输入源
- 聚集操作:Stream 支持诸如 filter、map、limit、reduce 等的聚集操作
- 流水技术:许多 Stream 操作返回了流本身,故它们的返回值可以以流水的行式存在。这些操作称之为中间操作,并且它们的功能就是负责输入、处理和向目标输出。collect() 方法是一个终结操作,通常存在于流水线操作的末端,来标记流的结束
- 自动迭代:Stream 的操作可以基于已提供的源元素进行内部的迭代,而集合则需要显式的迭代
- flatMap:Stream
mergerStream = Stream.of(stream1, stream2, stream3).flatMap((i) -> i
io编程
- 接口 DataInput 和 DataOutput,设计了一种较为高级的数据输入输出方式:除了可处理字节和字节数组外,还可以处理 int、float、boolean 等基本数据类型,这些数据在文件中的表示方式和它们在内存中的一样,无须转换,如 read(), readInt(), readByte()…; write(), writeChar(), writeBoolean()… 此外,还可以用 readLine() 方法读取一行信息。
- 将匿名对象 写入到file中,注意:被写入的对象必须实现了Serializable接口:ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file)); objectOutputStream.writeObject(new User(“shiyanlou”, “password”));static class User implements ==Serializable==
- NIO是面向缓存的、非阻塞的 IO,而标准 IO 是面向流的,阻塞的 IO
网络编程
- Socket(IP,Port) ServerSocket(Port)
- TCP和UDP
- HttpURLConnection
多线程
创建线程的方法:
继承 Thread 类并重写它的 run()方法,然后用这个子类来创建对象并调用 start() 方法
定义一个类并实现 Runnable 接口,实现 run() 方法,当一个线程已经继承了另一个类时,就建议你通过实现Runnable接口来构造
Synchronized
- 对普通方式使用,将会锁住当前实例对象
- 对静态方法使用,将会锁住当前类的 Class 对象
- 对代码块使用,将会锁住代码块中的对象
线程池
concurrent
JDBC
- 导入 JDBC 驱动: 只有拥有了驱动程序我们才可以注册驱动程序完成连接的其他步骤
- 注册 JDBC 驱动程序:这一步会导致 JVM 加载所需的驱动类实现到内存中,然后才可以实现 JDBC 请求
- 数据库 URL 指定:创建具有正确格式的地址,指向到要连接的数据库
- 创建连接对象:最后,代码调用 DriverManager 对象的 getConnection() 方法来建立实际的数据库连接
- Statement, CallableStatement, PreparedStatement和ResultSet
- 事务
反射
- Class 类没有公共构造方法,可以通过以下方法获取 Class 实例。
- Object 提供的 getClass() 方法
- 类名.Class
- Class.forName(String className) 方法,className 为类的全限定名
正则表达式
- //Pattern类 正则表达式的编译表示
- Pattern pattern = Pattern.compile(“^[a-zA-Z0-9_!#$%&’*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$”);
- String[] emails = {“shiyanlou@shiyanlou.com“, “shiyanlou”};
- for (String email : emails) {
- //Matcher 通过解释Pattern对字符序列执行匹配操作的引擎
- Matcher matcher = pattern.matcher(email);
- System.out.println(email + “匹配结果:” + matcher.matches());
- }
设计模式
- 中介模式
- 代理模式
- 责任链模式
Web基础
CSS
JS
HTML
Java Web框架
Maven
- 目录结构
- groupId:所需Jar包的项目名 artifactId:所需Jar包的模块名 version:所需Jar包的版本号
- pom.xml详解:https://blog.csdn.net/lovequanquqn/article/details/81627807)
MySql
事务(Transaction)
1、开启:begin;或start transaction; 2、提交:commit; 3、回滚:rollback;
MyBatis(持久层)
入门:
1、pom.xml配置,,resources创建mybatis-config.xml、logback和UserMapper.xml
2、User类 3、加载配置文件,获取SQLSessionFactory 4、获取SqlSession对象
5、执行Sql后释放资源