从今年过完五一开始学,紧赶慢赶学了一个月才学完基础,花了两天的时间重新整理,整理的过程又有了新的收获,有了脉络以后对知识点的理解也更清晰了。翻过一座山还有更多的山,希望继续扎实地学习,每天都有新收获!
JAVA基础
开发环境
JDK
- 开发环境
JRE
- 运行环境
JVM
- 虚拟机
数据
基本数据类型
-
整数、小数、字符、布尔
-
类型转换
-
自动转换
- 小转大(2字节转4字节)
-
强制转换
- 大转小
-
引用数据类型
-
数组
-
类
-
抽象类
-
强制子类重写父类的方法,不让该类创建对象
-
可以有非抽象方法,也可以没有抽象方法
-
继承体系
- is… a,应该具备的内容
-
使用场合
- 需要定义子类的行为,又要为子类提供共性功能
-
-
内部类
- 成员内部类
- 局部内部类
- 匿名内部类
-
-
接口
-
功能的集合
- 具体的实现由接口的实现类完成
-
成员方法全抽象,成员变量必须为常量
-
优点
- 将功能的定义与实现分离,降低耦合性
- 可以多继承
-
继承体系
- like… a,额外的内容
-
方法
参数传递
-
基本数据类型
- 值
-
引用数据类型
- 地址
重载
- 看方法名和参数列表
重写
编码表
ASCII码
- 0-9:ASCII 48-57
- a-z:ASCII 97-122
- A-Z:ASCII 65-90
iso-8859-1
- 拉丁码表
简体中文码表
-
GB2312
-
GBK
- 两字节表示
unicode
-
国际标准码表
- 无论什么文字都用两字节存储
UTF-8
- 基于unicode
- 一个汉字占三个字节
面向对象
三大特征
-
封装
-
继承
-
好处
- 提高代码复用性
- 提供多态的前提
-
注意事项
- 只支持单继承
- 一个父类可以有多个子类
- 可多层继承
-
方法重写
-
注意点
- 子类方法覆盖父类方法,需保证权限大于等于父类权限
- 方法的返回值类型、函数名、参数列表需相同
-
-
-
多态
-
前提
- 有子父类关系/类实现接口
-
成员特点
-
成员变量
- 编译运行全看父类
-
成员方法
- 编译看父类,运行看子类
- 运行静态方法看父类,非静态方法看子类(对象才有多态性)
-
-
转型
-
向上转型
- 子类对象赋值给一个父类引用
-
向下转型
-
一个已经向上转型的子类对象,强制类型转换为子类对象
-
注意
- 若是直接创建父类对象,则无法向下转型
-
-
-
特点
-
好处
- 隐藏子类类型,提高代码的扩展性
-
弊端
- 无法使用子类特有功能
-
-
关键字
-
this
- 子类对象的引用
-
super
- 父类对象的引用
-
final
- 修饰的变量是常量,修饰的方法不能被覆盖
-
static
- 静态数据属于自己的类,非静态数据属于对象
代码块
-
局部代码块
-
构造代码块
- 优先于构造方法执行
-
静态代码块
- 优先于主方法、构造代码块执行
常用API
Object类
- equals()
- toString()
String类
- 固定数组长度
字符串缓冲区
-
StringBuffer类
- 可变数组长度
- 对字符序列进行增删等操作
-
StringBuilder类
- 类似StringBuffer,但不保证同步,运行更快
正则表达式
Date类
DtaeFormat类
- SimpleDateFormate类
Calendar类
基本数据包装类
-
基本数值转成字符串
- 34+""
- String.valueOf(34)
- Integer.toString(34)
-
自动装箱/自动拆箱
-
注意
- 当数值在 byte范围内,进行自动装箱,不会新创建对象空间而是使用原来已有的空间(地址不变)
-
System类
Math类
- 执行基本数学运算方法的工具类
Arrays类
- 数组工具类
大数据运算
-
BigInteger类
- 超过long型的整数的运算
-
BigDecimal类
- 浮点数据的高精度运算
Collections类
- 集合工具类
集合
Collection接口(根接口)
-
List接口
-
特点
- 有序、索引,可重复
-
ArrayList
- 底层是数组结构
- 不同步(线程不安全、运行速度快)
-
LinkedList
- 底层是链表
- 不同步
- 提供大量首尾操作方法
-
-
Set接口
-
特点
- 无序,不允许重复
-
HashSet
- 底层哈希表
- 存取快
- 线程不安全,运行速度快
-
linkedHashSet
- 继承HashSet
- 具有顺序,存储和取出的顺序相同
- 双向链表
-
泛型
-
编译后被擦出
-
好处
- 避免类型强转的麻烦
-
泛型类/方法/接口
-
通配符
泛型方法和泛型通配符的区别:
泛型方法允许泛型形参被用来表示方法的一个或者多个参数之间的类型依赖关系,或者方法返回值与参数之间的类型依赖关系。如果没有这种依赖关系,则应该使用泛型通配符
如果某个方法中一个形参的类型或返回值的类型依赖另一个形参的类型,则形参的类型声明不应该使用通配符
类型通配符既可以在方法声明中定义参数的类型,也可以用于定义变量的类型,但是泛型方法中的泛型形参必须在方法中声明
数据存储的常用结构
-
堆栈
- 先进后出
-
队列
- 先进先出
-
数组
- 查找快,增删慢
-
链表
-
多个节点间通过地址连接
- 查找慢,增删快
-
Map接口
HashMap<K,V>
-
链表和数组结合体
-
存储依赖
- hashCode()
- equals()
-
-
特点
- 元素存取顺序不保证
- 线程不安全
- 允许存储null值、null键
LinkedHashMap<K,V>
- 元素存取顺序一致
Hashtable<K,V>
-
用法同HashMap
-
特点
- 线程安全
- 不允许存储null值、null键
异常 Throwable类
抛出异常 throw
- 方法内部
声明异常 throws
- 类
捕获异常
- try…catch…finally
注意
- 父类方法抛异常,子类重写后可抛可不抛,若抛,抛出的异常不能大于父类异常
IO流
File类
- 文件和文件夹的创建删除等操作
- 文件过滤器
字节流
-
特点
- 可以读写任意文件
- 每次只操作一个字节
-
java.io.OutputStream
-
所有字节输出流的超类
-
FileOutputStream
- write(byte[] b)
- write(byte[], int off, int len)
- write(int b)
-
BufferedOutputStream
-
特点
- 缓冲流
- 可传递任意的字节输出流,提高写入效率
-
-
-
java.io.InputStream
-
所有字节输入流的超类
-
FileInputStream
- read()
- read(byte[] b)
-
BufferedInputStream
-
特点
- 缓冲流
- 可传递任意的字节输入流,提高读取效率
-
-
字符流
-
特点
- 只能写文本文件
-
java.io.Writer
-
所有字符输出流的超类
- 字符输出流写数据,必须先运行刷新功能 flush(),再进行流的关闭
-
FileWriter
- write(char[] cbuf)
- write(char[] cbuf, int off, int len)
- write(int c)
- write(String str)
- write(String str, int off, int len)
-
OutputStreamWriter
-
特点
-
转换流
转换流与子类区别:
当操作的字符文件使用的是默认编码表时,可以不用父类,直接由子类完成
当指定编码表时,必须用字符转换流 -
可指定编码表
-
字符流转字节流
-
-
子类
- FileWriter
-
-
BufferedWriter
-
特点
- 缓冲流
- 能传递 FileWriter、OutputStreamWriter
- 特有方法 newLine();
-
-
-
java.io.Reader
-
所有字符输入流的超类
-
FileReader
- read()
- read(char[] cbuf)
-
InputStreamReader
-
特点
- 转换流
- 可指定编码表
- 字节流转字符流
-
子类
- FileReader
-
-
BufferedReader
-
特点
- 缓冲流
- 能传递 FileReader、InputStreamReader
- 特有方法 readLine();
-
-
注意
- 所有IO流的操作只能针对文件,不能针对文件夹
Properties类
-
特点
- 键值都是字符串类型
- Hashtable子类,map中的方法都可以用
- 可持久化
序列化流与反序列化流
-
注意
-
对象必须支持 java.io.Serializable接口
-
static修饰的成员变量属于类,不属于对象,不能进行序列化与反序列化
-
transient瞬态关键字
- 被该关键字修饰的成员变量不会被序列化
-
防止序列号冲突,可设置固定序列号
- static final long serialVerdionUID
-
-
ObjectInputStream
-
反序列化流
- 用于从流中读取对象
-
-
ObjectOutputStream
-
序列化流
- 用于向流中写入对象
-
打印流
-
特点
- 不负责数据源,只负责数据目的
- 不会抛IOException异常,但会抛其他异常
- 为其它输出流添加功能
-
PrintStream
- 字节打印流
-
PrintWriter
- 字符打印流
-
注意
- 方法print()、println()走原样输出
- write()走码表
commons-IO工具包
-
FilenameUtils工具类
- 处理文件名
-
FileUtils工具类
- 文件操作
多线程 Thread类
特点
- 不提高运行速度,但能提高运行效率
创建新线程方法
-
继承 Thread类
-
实现 Runnable接口
-
好处
- 避免了继承 Thread类的单继承局限性
- 对线程对象和线程任务进行解耦
-
线程状态
- 新建状态
- 运行状态
- 受阻塞状态
- 休眠状态 sleep
- 等待状态 wait
- 死亡状态
线程池
-
使用方式
-
Runnable接口
- run()方法没有返回值
-
Collable接口
- run()方法可以有返回值
-
-
使用步骤
Executors:线程池创建工厂类
public static ExecutorService newFixedThreadPool(int nThreads):返回线程池对象
ExecutorService:线程池类
Future<?> submit(Runnable task):获取线程池中的某一个线程对象,并执行
Future submit(Callable task):获取线程池中的某一个线程对象,并执行
Future接口:用来记录线程任务执行完毕后产生的结果。
V get() 获取 Future对象中封装的数据结果
线程同步
-
方式
-
同步代码块
Synchronized(锁对象){
可能会产生线程安全问题的代码
}-
注意
- 同步代码块中的锁对象可以任意,但多个线程时,要使用同一个锁对象才能保证线程安全性
-
-
同步方法
public synchronized void method(){
可能会产生线程安全问题的代码
}public static synchronized void method(){
可能会产生线程安全问题的代码
}-
注意
- 同步方法中的锁对象是 this
- 静态同步方法中的锁对象是 本类类名.class
-
-
Lock接口
- ReentrantLock()
-
-
死锁
-
前提
- 多线程的同步嵌套
-
-
等待唤醒机制
-
线程之间的通信
- 多个线程在处理同一个资源,但线程任务不相同
-
涉及方法
- wait()
- notify()
- notifyAll()
-
注意
- 这些方法在同步中才有效
- 使用时必须标明所属锁,等待与唤醒必须是锁对象
-
数据库
SQL语句
-
数据库操作
-
创建数据库
- create database 数据库名
-
查看数据库
- show databases;
- show create database 数据库名;
-
删除数据库
- drop database 数据库名;
-
切换数据库
- use 数据库名;
-
查看正在使用的数据库
- select database();
-
-
表操作
-
创建表
- create table 表名(字段名 类型(长度) 约束,);
-
主键
- primary key auto_increment
-
查看表
- show tables
- desc 表名
-
删除表
- drop table 表名
-
修改表结构
添加列:
alter table 表名 add 列名 类型(长度) 约束;
修改列的类型长度及约束:
alter table 表名 modify 列名 类型(长度) 约束;
修改列名
alter table 表名 change 旧列名 新列名 类型(长度) 约束;
删除列
alter table 表名 drop 列名;
修改表名
rename table 表名 to 新表名;
修改表的字符集
alter table 表名 character set 字符集; -
插入表记录
- insert into 表 (列1,列2…) values (值1,值2…)
- insert into 表 values (全列值)
-
更新表记录
- update 表名 set 字段名=值,字段名=值 where 条件;
-
删除记录
-
delete from 表名 where 条件;
-
truncate table 表名;
- 直接将表删除,重新建表,auto_increment将置为零,重新开始
-
-
-
查询语句
-
查询的语法
1.查询指定字段信息
select 字段1,字段2,…from 表名;2.查询表中所有字段
select * from 表名;3.去除重复记录
select distinct 字段 from 表名;4.别名查询,使用的关键字as 可省略
//表别名格式:
select * from 表名 (as) 别名;//列别名格式:
select 字段名 (as) 别名 from 表名;5.对列进行运算
select pname,price+10000 from product; -
条件查询
- select 字段 from 表名 where 条件
-
排序查询
-
order by 列名 [desc][asc];
-
注意
- 存在条件,先过滤条件 where查询的结果再排序
-
-
聚合函数
-
作用
- 可实现纵向查询,对一列的值进行计算,返回单个值
-
常用函数
- count
- sum
- max
- min
- avg
-
-
分组查询
-
select 字段1,字段2… from 表名 group by 被分组的列名 having 条件;
-
注意
- 必须跟随聚合函数
- select查询的时候,被分组的列要出现在 select选择列的后面
-
having 和 where区别
- having 是在分组后对数据进行过滤;where 是在分组前对数据进行过滤
- having 后面可以使用分组函数;where 后面不可以使用分组函数
-
-
JDBC
-
接口,java访问数据库的标准规范
-
开发步骤
-
注册驱动
- Class.forName(“com.mysql.jdbc.Driver”)
-
获得连接
- Connection con=DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb”,”root”,”root”)
-
获得执行语句平台
-
Statement stmt=con.createStatement();
-
PreparedStatement pst=con.prepareStatement(sql);
- void setXxx(int index,Xxx xx); //将指定参数设置为给定java的xx值
-
-
执行sql语句
- int row = stmt.executeUpdate(String sql);
-
处理结果集
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
//获取表中每列数据,使用 ResultSet接口的方法 getXXX(),接口参数中建议写String列名
sop(rs.getInt(“sid”)+" “+rs.getString(“sname”)+” "+rs.getDouble(“sprice”)) ;
} -
释放资源
- rs.close()
- stat.close()
- con.close()
-
DBUtils
-
核心功能
-
QueryRunner
- update(Connection con, String sql, Object…params)
- query(Connection con, String sql, ResultSetHandler rsh, Object…params)
-
ResultSetHandler接口
-
DbUtils类
-
-
事物
连接池 DBCP
-
公共接口 java.sql.DataSource
- 实现类 BasicDataSource
-
作用
- 当有成千上万用户访问数据库时,不是直接和数据库打交道,而是从连接池中得到实现放在池中的 Connection连接对象,而连接池只和数据库连接一次,保证了数据访问性能。
网络编程
UDP
-
特点
- 消耗资源小,通信效率高,通常会用于音频、视频和普通数据的传输例如视频会议
- 传输数据大小限制在 64KB以内
-
缺点
- 面向无连接,不能保证数据的完整性,不安全,重要数据传输不建议使用
-
网络通信
-
接收端
实现步骤:
1)创建 DatagramSocket对象,绑定端口号,要和发送端端口号一致
2)创建字节数组,接收发来的数据
3)创建数据包对象 DatagramPacket
4)调用 DatagramSocket对象方法 receive(DatagramPacket dp)接收数据,数据放在数据包
5)拆包:发送端的IP地址;接收到的字节个数;发送端的端口号
6)关闭资源 -
发送端
实现步骤:
1)创建 DatagramPacket对象,封装数据、接收的地址和端口
2)创建 DatagramSocket对象
3)调用 DatagramSocket类方法 send() 发送数据
4)关闭资源
-
TCP
-
特点
-
面向连接特性,可以保证传输数据的安全性
-
三次握手
- 第一次,客户端向服务器端发送连接请求,等待服务器确认
- 第二次,服务器端向客户端回送一个响应,通知客户端收到了连接请求
- 第三次,客户端再次向服务器端发送确认信息,确认连接
-
-
网络通信
-
服务器端
实现步骤:
创建服务器 ServerSocket对象(指定服务器端口号)
开启服务器,等待客户端的连接,当客户端连接后,可获取到连接服务器的客户端 Socket对象
给客户端反馈信息
关闭流资源(输出流、输入流、客户端) -
客户端
实现步骤:
创建客户端 Socket对象(指定要连接的服务器地址和端口号)
获取服务器端的反馈回来的信息
关闭流资源
-
-
注意
- 服务器端本身没有对流操作的功能,必须得到客户端对象才能对流进行操作
- public void shutdownOutput():禁用此 Socket的输出流,告知另一端数据写入完毕
反射
概念
- 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息及动态调用对象的方法的功能称为 java语言的反射机制
获取 Class对象的三种方式
- 通过 Object类中的 getObject()方法
- 通过 类名.class获取到字节码文件对象
- 通过 Class类中的方法,将类名作为字符串传递给 Class类中的静态方法 forName
注意
- 一个类在内存中只能有一个 Class对象
反射获取构造方法
-
公有
步骤:
获取到 Class对象
获取指定的构造方法
通过构造方法类 Constructor中的方法,创建对象
public T newInstance(Object…initargs) -
私有
步骤:
获取到 Class对象
获取指定的构造方法
暴力访问,通过 setAccessible(boolean flag)方法
通过构造方法类 Construct中的方法,创建对象
public T newInstance(Object… initargs)
反射获取成员变量
步骤:
获取 Class对象
获取构造方法
通过构造方法,创建对象
获取指定的成员变量(私有成员变量,通过 setAccessible(boolean flag)方法暴力访问)
通过方法,给指定对象的指定成员变量赋值或获取值
public void set(Object obj, Object value):在指定对象 obj中,将此 Field对象表示的成员变量设置为指定的新值
public Object get( Object obj):返回指定对象 obj中,此 Field对象表示的成员变量的值
反射获得成员方法
步骤:
获取 Class对象
获取构造方法
通过构造方法,创建对象
获取指定的方法(私有方法需开启暴力访问 setAccessible(boolean flag))
执行指定的方法
public Object invoke(Object obj, Object… args):执行指定对象 obj中,当前 Method对象所代表的方法,方法要传入的参数通过 args指定
XMind - Trial Version