01 2023 档案
摘要:正则表达式 1. 学习目标 掌握正则表达式的作用 掌握正则表达式的语法 了解常见的正则表达式 2. 内容讲解 2.1 正则表达式的概念 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻
阅读全文
摘要:public String regist(String varifyCode, String uname , String pwd , String email, HttpSession session, HttpServletResponse response) throws IOExceptio
阅读全文
摘要:Kaptcha 验证码 为什么使用验证码 验证码:通过让用户填写验证码并在服务器端检查,防止浏览器端使用程序恶意访问。 如何实现验证码 Kaptcha 如何使用 添加 jar 包 Kaptcha.jar 注意!需要工件 filters.jar 在 web.xml 文件中注册 KaptchaServl
阅读全文
摘要:Cookie介绍 ①本质 在浏览器端临时存储数据 键值对 键和值都是字符串类型 数据量很小 ②Cookie在浏览器和服务器之间的传递 [1]没有Cookie的状态 在服务器端没有创建Cookie并返回的情况下,浏览器端不会保存Cookie信息。双方在请求和响应的过程中也不会携带Cookie的数据。
阅读全文
摘要:Filter 拦截未登录用户 未登录用户可以访问登录页面、商城首页等,但不能使用添加购物车、结账等功能 因此,要判断是否登录,若未登录,点击结账则跳转到登录页面 Filter 拦截所有页面,再设置未登录用户可以访问的白名单 @WebFilter( urlPatterns = {"*.do","*.h
阅读全文
摘要:1. 无法获取 html 页面提交的参数 从 jdk8 开始可以获取方法形参的名称,需要设置 IDEA - Setting - Build, Excecution, Deployment - Compiler - Java Compiler 在 Additional command li
阅读全文
摘要:Servlet + thymeleaf 的java开发“套路”: 拷贝 myssm包 新建配置文件applicationContext.xml或者可以不叫这个名字,在web.xml中指定文件名 在web.xml文件中配置: 配置前缀和后缀,这样thymeleaf引擎就可以根据我们返回的字符串进行拼接
阅读全文
摘要:login 出现的错误 URL没修改,用的还是fruitdb rsmd.getColumnName() 和 rsmd.getColumnLabel() SELECT fid AS id FROM ... .getColumnName() -> fid getColumnLabel() -> id C
阅读全文
摘要:1. pojo 根据数据库设计创建实体类 包括属性、实体间关系和 set&get 方法 public class Topic { private Integer id; private String title; private String content; private Date topicD
阅读全文
摘要:1. 熟悉QQZone业务需求 1) 用户登录 2) 登录成功,显示主界面。左侧显示好友列表;上端显示欢迎词。如果不是自己的空间,显示超链接:返回自己的空间;下端显示日志列表 3) 查看日志详情: - 日志本身的信息(作者头像、昵称、日志标题、日志内容、日志的日期) - 回复列表(回复者的头像、昵称
阅读全文
摘要:Listener 监听 xxx 对象的 xxx 过程 ServletContextListener 监听ServletContext对象的创建与销毁 | 方法名 | 作用 | | : : | : : | | contextInitialized(ServletContextEvent sce) |
阅读全文
摘要:ThreadLocal 线程本地变量,常用方法 get() set(obj),通过 set 方法在当前线程上存储数据,通过 get 方法在当前线程中获取数据 set 方法源码分析 public void set(T value) { Thread t = Thread.currentThread()
阅读全文
摘要:事务管理 什么是事务? try{ setAutoCommit(false); 事务操作... commit(); }catch(Exception e){ rollback(); } 目的是为了事务操作结果的一致性,事务操作中的所有操作必须同时成功,否则所有操作都回滚。 1 - DAO层进行事务管理
阅读全文
摘要:Filter **生命周期:**init -> doFilter -> destroy 同一个请求路径 /demo01.do 中,Filter 会在 Servlet 前拦截请求 Filter 和 Servlet 类似,可以在 web.xml 中配置映射也可以直接使用 @WebFilter("/dem
阅读全文
摘要:IOC Inversion of Control 控制反转 之前,在 Servlet 中,我们创建 service 对象:FruitService fruitService = new FruitServiceImpl(); 如果是在 Servlet 的某个方法中创建对象,则 这个 fruitSer
阅读全文
摘要:BeanFactory - IOC - DI 依赖/耦合 软件系统中,层与层间存在依赖关系,称为耦合 设计原则:高内聚低耦合 -- 层内组成代码高度聚集,层间关系低耦合(理想情况-零耦合) 如何实现低耦合? 底层代码的改动不影响上层代码 如何实现修改 FruitService 层,其他层,如 Fru
阅读全文
摘要:MVC = Model + View + Controller 视图层(View):用于做数据展示以及和用户交互的一个界面 控制层(Controller):能够接受客户端的请求,具体的业务功能还是需要借助于模型组件来完成 模型层(Model):模型分很多中,pojo/vo、业务模型组件、数据访问层组
阅读全文
摘要:Servlet 设置初始化参数 Servlet 的初始化,两个 init 方法,如果想在初始化时做一些准备工作,可以重写 init 方法 无参 init() public void init(){ } 带参 init( ServletConfig config ) public void init(
阅读全文
摘要:优化controller controller 中的所有方法有共同点,可以抽取出来处理,设置成公用,优化方法中的内容 FruitController 中的所有方法都需求进行重定向或转发,统一交给中央控制器处理 中央控制器调用了 FruitController 中的方法,只需要设置返回值,就能将任务交
阅读全文
摘要:DispatcherServlet - 设置中央控制器 创建核心控制器,拦截所有请求进行处理,然后将请求发送给相应 xxController = 调用 xxController 方法处理请求 将原本的 xxServlet 改为 xxController,不拦截请求,只处理转发到控制器的请求 = 通过
阅读全文
摘要:mvc优化 - reflect 将所有 Servlet 方法放在一个 FruitServlet 中,通常项目会有许多 Servlet 方法,会导致 FruitServlet 非常庞大,判断 operate 参数的语法非常长,维护困难 switch(operate){ case "index": in
阅读全文
摘要:mvc优化 一个项目通常有许多 xxServlet 类,比如 AddServlet、DelServlet、EditServlet、IndexServlet、UpdateServlet 等等,这些类中实现的方法有许多相同的对象,相同的参数 优化目的是,将 所有 Servlet 类整合到一个 Fruit
阅读全文
摘要:模糊查询 在首页添加支持模糊查询的输入框 模糊查询的表单提交请求使用的是 post 方法,因为需要传给服务器查询关键字 查询结果跳转页面还是首页,只需要在 IndexServlet 中重写 doPost 方法,根据 request 中的关键字查询即可 首页的查询框 <form th:action="
阅读全文
摘要:分页功能 首页不进行分页会显示所有数据,因此分页,每页显示5条数据 首页查询数据时,SQL语句添加 LIMIT 限制,根据页码获取数据 FruitDAOImpl 调用父类 BaseDAO 的 executeQuery 方法时,传入的SQL语句结构使用 LIMIT 限制,将页码作为占位符参数传入 @O
阅读全文
摘要:3. 点击删除按钮从数据库中删除数据 点击按钮调用 js 中的 delFruit(fid) 方法,需要传入 fid 调用 js 中的方法以及传入参数的 thymeleaf 语法 <!-- 方法1 字符串拼接 易错不推荐使用 --> th:onclick="'delFruit('+${fruit.fi
阅读全文
摘要:1. 点击水果名称跳转到编辑相应水果信息的页面 主页中设置跳转超链接 <td><a th:text="${fruit.fname}" th:href="@{/edit.do(fid=${fruit.fid})}">苹果</a></td> 跳转到 /edit.do 同时传入相应水果的fid -- ke
阅读全文
摘要:设置基础路径 当前页面上的所有路径都自带基础路径为“前缀”,是绝对路径
阅读全文
摘要:Servlet 中的四种保存作用域 可以认为有四个:page、request、session、application page 页面级别,几乎不再使用 request 一次请求响应范围 request.setAttribute("uname","lili"); session 一次会话范围 requ
阅读全文
摘要:1. Servlet 继承关系以及生命周期 Servlet 接口: init() , service() , destroy() GenericServlet 抽象子类:abstract service(); HttpServlet 抽象子类:实现了 service 方法,在 service 方法内
阅读全文
摘要:Thymeleaf 基础 将java内存中的数据加载到在 html页面上,称为渲染 而 Thymeleaf 就是一种实现视图渲染的技术 添加Thymeleaf的jar包 新建一个Servlet类ViewBaseSevlet 无需手写,搬运即可 在web.xml文件中添加配置 <!-- 配置上下文参数
阅读全文
摘要:服务器内部转发 servlet1{ request.getRequestDispatcher("servlet2").forward(request, response); } servlet1 将请求转发给 servlet2 由 servlet2 响应请求 一次请求响应的过程,对于客户端而言是同一
阅读全文
摘要:session的保存作用域 向当前 session 保存作用域保存一个键值对数据 HttpSession session = request.getSession(); session.setAttribute(key, value); sessionID 相同时,根据 key 可以获取 value
阅读全文
摘要:Session HTTP无状态: 服务器无法判断两次请求是否为同一个客户端发送的 无状态的现实问题:第一次请求添加商品到购物车,第二次请求结账,如果不能判断是同一个用户就会导致混乱 解决方法:会话跟踪技术 会话跟踪技术 客户端第一次发请求给服务器,服务器获取 session,获取不到,则创建新的,然
阅读全文
摘要:HTTP协议 Hyper Text Transfer Protocol 超文本传输协议 确定了请求和响应的数据格式:请求报文与响应报文 Http是无状态的 请求 请求行+请求消息头+请求主体 请求行 POST/dynamic/target.jsp HTTP/1.1 请求方式+访问地址URL +HTT
阅读全文
摘要:Servlet的生命周期 init -> service -> destroy 默认情况下,开始容器(Tomcat)后, 第一次请求时,Servlet会进行实例化、初始化(调用 init() ),然后服务 从第二次情况开始,每一次都是服务(调用 service() ),只有第一次访问会初始化 当容器
阅读全文
摘要:Servlet的继承关系 继承关系 javax.servlet.Servlet 接口 javax.servlet.GenericServlet 抽象类 javax.servlet.http.HttpServlet 抽象类 相关方法 -- 重点查看 service 方法 javax.servlet.S
阅读全文
摘要:Servlet html中,form表单的 method = post | action = add 发送到服务器后根据 add 映射到相对应的服务器 需要在 web.xml 中配置服务器映射 用户发送请求,action = add, 项目中, web.xml 配置 servlet-name = A
阅读全文
摘要:高级应用层封装 BaseDao 基本每个数据表都应该有一个对应的 DAO 接口及其实现类,发现对所有表的操作(增、删、改、查)代码重复度很高,所以可以抽取公共代码,给这些 DAO 的实现类可以抽取一个公共的父类,称为 BaseDao CRUD分为 DQL 和 非DQL,因此只需封装两个方法 封装 非
阅读全文
摘要:Druid - 获取连接与回收连接封装 v1.0版本工具类 内部包含一个连接池对象 对外提供获取连接和回收连接的方法 小建议: 工具类的方法,写出静态,方便外部调用 实现: 属性 连接池对象 [实例化一次] 单例模式 静态代码块 static { 全局调用一次 } 方法 对外提供连接的方法 回收外部
阅读全文
摘要:Druid连接池 connection复用,节约了创建和销毁连接的性能消耗,同时提升了响应速度 但连接池有连接数量限制,达到“最大连接数”时,没有连接的用户只能等待 javax.sql.DataSource接口 规范连接池获取连接的方法 规范连接池回收连接的方法 DataSource = 第三方连接
阅读全文
摘要:事务 JDBC默认每条语句都是进行事务提交 1.关闭自动事务提交 connection.setAutoCommit(false); 2.手动提交或回滚 connection.commit(); connection.rollback(); 3.使用try-catch整合1 2 try{ connec
阅读全文
摘要:批量插入 package com.atguigu.api.preparedStatement; import org.junit.Test; import java.sql.*; public class PSOtherPart { //使用普通循环插入 10000 条数据 --> 21832ms
阅读全文
摘要:主键回显 只发生在插入数据时,返回插入的数据在数据库中自增长的主键值 package com.atguigu.api.preparedStatement; import org.junit.Test; import java.sql.*; public class PSOtherPart { /**
阅读全文
摘要:preparedStatement 使用方式总结 1.注册驱动 2.获取连接 3.编写SQL语句结构 4.创建preparedStatement并且传入SQL语句结构 5.占位符赋值 6.发送SQL语句,并获取结果 7.结果集解析 8.关闭资源 使用API总结 //1.注册驱动 方案1:调用静态方法
阅读全文
摘要:JDBC实现CRUD 其中对SELECT语句进一步优化 package com.atguigu.api.preparedStatement; import org.junit.Test; import java.sql.*; import java.util.ArrayList; import ja
阅读全文
摘要:SQL语句优化 statement --> preparedStatement SQL语句的拼接受限,对于①多条语句和②复杂类型无法实现操作,且易受③注入攻击 statement 只适合静态SQL语句,动态SQL语句的实现易受注入攻击 preparedStatement 提前知道语句结构可以避免受到
阅读全文
摘要:JDBC六步骤详细信息 - 模拟登录 package com.atguigu.api.statement; import com.mysql.cj.jdbc.Driver; import java.sql.*; import java.util.Properties; import java.uti
阅读全文
摘要:JDBC - 技术路线 接口在开发中的作用、驱动配置、JDBC编程六步、Statement完成增、删、改、连接数据库的信息在属性资源文件中配置、安装PowerDesigner、设计用户表、Statement演示登录时SQL注入问题、PreparedStatement解决SQL注入、Statement
阅读全文
摘要:数据库三范式 数据库中表的设计依据 第一范式 要求任何一张表必须有主键,每一个字段原子性不可再分 必须有唯一非空列作为主键 比如邮箱和手机号不能存储在一列中,应该分为两列,确保每一列的原子性 第二范式 建立在第一范式基础上,要求所有非主键字段完全依赖主键,不要产生部分依赖 一般出现在联合主键中,非主
阅读全文
摘要:视图 View 使用简单、数据安全、数据独立 = 将SELECT语句封装 视图(View)是虚拟存在的表,并不在数据库中真实存在,在使用视图时动态生成 视图只保存查询的 SQL 逻辑,不保存查询的结果 创建视图 CREATE [OR REPLACE] VIEW view_name(列名列表) AS
阅读全文
摘要:SQL优化 插入数据 批量插入 插入多条数据时,执行批量插入,但批量插入也不建议插入超过1k条 几百万数据时,多次批量插入 INSERT INTO table_name VALUES (..) (..) (..) ...; 手动事务提交 默认每一条DML语句都会开启\提交一次事务 手动开启事务,将多
阅读全文
摘要:SQL性能分析 SQL执行频率 通过 SHOW [SESSION|GLOBAL] STATUS 命令可以提供服务器状态信息,通过以下指令可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次 SHOW GLOBAL STATUS LIKE 'Com_______'; /
阅读全文
摘要:索引 什么是索引 索引相当于一本书的目录,为了缩小扫描范围而存在、提高查询效率的一种数据结构 一张表的一个字段可以添加索引,多个字段也可以联合起来添加索引 在任何数据库中,主键都会自动添加索引,另外在MySQL中,一个字段如果有 UNIQUE 约束,也会自动添加索引 优点 提高数据检索的效率,降低数
阅读全文
摘要:事务 TRANSACTION 什么是事务? 一个事务就是一个完整的业务逻辑 -- 划分一个最小的业务单元,整个操作同时完成同时失败 只有 DML语句 - INSERT、DELETE、UPDATE 才会涉及事务 为什么使用事物? 业务需要多条 SQL - DML语句才能完成,确保这些语句同时完成或失败
阅读全文
摘要:约束 什么是约束?约束的作用 在表的创建时,加入约束对表中数据进行规范,确保数据完整性、有效性 常见约束 非空约束 NOT NULL -- 不能为NULL DROP TABLE IF EXISTS t_vip; CREATE TABLE t_vip( id INT, name VARCHAR(255
阅读全文
摘要:INSERT 插入多条记录 INSERT INTO t_user (id, name, birth, create_time) VALUES (3, 'hehe', '1990-01-01', NOW()), (4, 'haha', '1990-01-01', NOW()), (5, '@@', '
阅读全文
摘要:DML基本语法 - 增删改 DATE 和 DATETIME 两个类型的区别 DATE 是短日期:只包括 年-月-日 默认格式: %Y-%m-%d DATETIME 是长日期:包括 年-月-日-时-分-秒 默认格式: %Y-%m-%d %h:%i:%s DROP TABLE IF EXISTS t_u
阅读全文
摘要:DDL 基本语法 创建学生表,包括学号、姓名、年龄、性别、邮箱地址 CREATE TABLE t_student( no INT, name VARCHAR(32), sex CHAR(1) DEFAULT 'm', age INT(3), email VARCHAR(255) ); 删除学生表 t
阅读全文
摘要:表的创建 CREATE TABLE 表名( 字段名1 数据类型, 字段名2 数据类型, ... 字段名 数据类型 ); 表名 以 t_ 或 tbl_ 开始,可读性强 MySQL中常见的数据类型 varchar 变长字符串,根据实际数据长度动态分配空间,节省空间,但效率较低,需给出长度
阅读全文
摘要:LIMIT 显示部分结果 **作用:**将查询结果集的一部分取出,通常使用在分页查询中 -- 百度默认分页:一页显示10条记录 用法: 1 LIMIT (start_index = 0) length 2 LIMIT start_index, length LIMIT 在 ORDER BY 后执行
阅读全文
摘要:UNION 合并查询结果集 例子:查询工作岗位是 MANAGER 和 SALESMAN 的员工 SELECT ename,job FROM emp where job = 'manager' or job = 'salesman'; SELECT ename,job FROM emp where j
阅读全文
摘要:子查询 可以在哪里使用子查询? SELECT .. (SELECT) .. FROM .. (SELECT) .. WHERE .. (SELECT) .. WHERE 子句中的子查询 例子:找出比最低工资高的员工姓名和工资 WHERE 子句中不能使用分组函数 MIN() 因此,1 查询最低工资 S
阅读全文
摘要:多表连接 语法: SELECT ... FROM A (INNER) JOIN B ON A-B连接条件 (RIGHT) JOIN C ON A-C连接条件 (LEFT) JOIN D ON A-D连接条件 例子:找出每个员工的部门名称、工资等级以及上级领导,要求显示员工名、领导名、部门名、薪资、薪
阅读全文
摘要:外连接 表A 与 表B 进行连接查询 **内连接 INNER JOIN:**查询出匹配条件的记录 A B 表没有主次关系 => 平等连接 **右外连接 RIGHT JOIN:**查询出匹配条件的记录 + 表B中不匹配条件的记录 => 表B为主表 **左外连接 LEFT JOIN:**查询出匹配条件的
阅读全文
摘要:内连接 - 自连接 将一张表看作两张表 例子:查询员工的上级领导,要求显示员工名和对应的领导名 SELECT a.ename AS 员工, b.ename As 领导 FROM emp a INNER JOIN emp b ON a.mgr = b.empno;
阅读全文
摘要:内连接 - 等值连接 例子:查询每个员工所在部门名称,显示员工名和部门名 SELECT e.ename, d.dname FROM emp e INNER JOIN dept d ON e.deptno = d.deptno; //WHERE ... SQL99 连接条件与筛选分离,连接条件独立,逻
阅读全文
摘要:DISTINCT - 去重 查询结果去除重复记录,原表数据不修改 SELECT DISTINCT job FROM emp; DISTINCT 只能出现在所有字段的最前方,如果使用在两字段间,则字段的记录数量相互矛盾 DISTINCT 出现在两个或多个字段前,表示这些字段联合起来去重,只有每个字段都
阅读全文
摘要:单表查询总结 语句顺序 SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... 执行顺序 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY FROM从某张表
阅读全文
摘要:分组查询 为什么需要分组查询? 在实际应用中,可能需要先进行分组,再对每一组数据进行操作 什么是分组查询? SELECT ... FROM ... WHERE ... GROUP BY ... ORDER BY ... 以上关键字顺序不能随意变换 ★★★执行顺序:FROM > WHERE > GRO
阅读全文
摘要:分组函数 又称多行处理函数 特点:输入多行,输出一行 共5个:count 计数、sum 求和、avg 平均值、max 最大值、min 最小值 多行处理函数在使用时必须先进行分组,然后才能使用 如果不对数据进行分组,整张表默认为一组 自动忽略null,不需要提前对null进行处理 分组不能直接使用在W
阅读全文
摘要:数据处理函数 又被称为单行处理函数 特点:一个输入对应一个输出,相应的多行处理函数:多个输入(处理多条记录)一个输出 常见函数: lower 转换为小写 upper转换为大写 SELECT LOWER(ename) FROM emp; //在字段上直接使用 SELECT UPPER(ename) F
阅读全文
摘要:DQL 简单查询 查询一个字段 SELECT 字段名 FROM 表名; select 和 from 都是关键字,字段名和表名是标识符 查询两个或多个字段 使用逗号 "," 隔开 SELECT deptno,dname FROM dept; 查询所有字段 写上所有字段,用逗号隔开 写上 * ,表示全部
阅读全文
摘要:MySQL基本信息查询操作 所有SQL语句以 ; 结尾 SQL语句不区分大小写 查询数据库有哪些表 SHOW TABLES; 查看表中全部数据 SELECT * FROM emp; 查看表的结构 DESC emp; //返回 | Field | Type | Null | Key | Default
阅读全文
摘要:数据库介绍 什么是数据库? Database,简称DB -- 存储数据的仓库,在一堆文件中存储特定格式的数据。 什么是数据管理系统? DatabaseManagement,简称DBMS,专门用来管理数据库中的数据,对数据进行增删改查。 常见的DBMS:MySQL,Oracle,MS SQLserve
阅读全文
摘要:反射 获取注解信息 什么是ORM? Object relationship Mapping -- 对象关系映射(数据库关系) 类 -> 表 类中属性 -> 表的字段 类的对象 -> 表中的记录 通过注解联系属性与数据库字段 package annotation; import java.lang.a
阅读全文
摘要:反射 获取泛型信息 ParameterizedType:表示一种参数化类型,比如Collection GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型 TypeVariable:是各种类型变量的公共父接口 WildcardType:代表一种通配符类型表达式
阅读全文
摘要:元注解 meta-annotation 注解其他注解 这些类型和它们所支持的类在java.lang.annotation包中找到 @Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方) @Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期 RUNTIME
阅读全文
摘要:Annotation 注解 **Comment 注释:**给人看 **Annotation 注解:**不仅给人看,程序也会读取(编译器等) public class _Annotation { public static void main(String[] args) { User user =
阅读全文
摘要:反射 - 练习 反射机制的优势很明显:它可以实现动态创建对象和编译,体现出语言很大的灵活性,这也是反射被广泛用于各种框架中的最主要原因。 反射机制的缺点也是显而易见的:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的
阅读全文
摘要:类加载器 Java的类主要分为3种 Java核心类库:String, Object ... JVM软件平台开发商 自己声明定义的类:User, Child ... 相应的类加载器也有3种 -- Java17 BootClassLoader 启动类加载器 -- 加载Java核心类库 -- 加载类时,采
阅读全文
摘要:反射 对象获取自身的类对象 再通过类对象获取类中的属性、方法、权限等 public class _Reflect { public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {
阅读全文
摘要:线程安全问题 多个线程并发执行时,修改了共享内存中共享对象的属性,导致数据冲突问题 线程 t1 和线程 t2 都修改和读取同一个对象 user,由于并发执行,t1写入后没有直接读取,此时 t2 也在执行,进行写入,然后 t1 t2 再分别读取,此时对象的数据是 t2写入的结果,t1的写入被覆盖了。
阅读全文
摘要:wait和sleep方法比较 含义 wait:等待,需要等待其他对象来结束该状态 sleep:休眠,一定时长后自动醒来 从属关系 wait:Object类中声明定义的方法,成员方法,所有对象都可使用 sleep:Thread类中声明定义的静态方法,只有线程类对象可使用 使用方式 wait:只能使用在
阅读全文
摘要:Synchronized 同步 方法被synchronized 关键字修饰后成为同步方法 多线程访问同步方法时,只能顺序访问,每次访问只有一个执行 Hashtable -- 方法同步:对一个对象的增删改查等同时只能执行一个,效率低,换来数据的一致性 HashMap -- 方法异步:可以同时执行许多操
阅读全文
摘要:线程池 线程对象的容器 4种比较常见的线程池 创建固定数量的线程对象 ExecutorService executorService = Executors.newFixedThreadPool(3); 根据需要动态创建线程线程 -- 线程数量够用时复用,数量不够时创建新线程 ExecutorSer
阅读全文
摘要:构建线程的三种方式 方式1:自定义线程类继承Thread 方式2:创建线程对象时传递运行逻辑 方式3:创建线程对象时传递实现了Runnable接口的类的对象 public class ThreadWork { public static void main(String[] args) throws
阅读全文
摘要:线程执行方式 串行执行:多个线程连接成串,按序执行 并发执行(默认):多个线程独立,谁抢到CPU执行器,谁就执行 public class _Thread { public static void main(String[] args) throws Exception{ //TODO Thread
阅读全文
摘要:进程与线程 process 进程:运行中的程序 一个process可以包含多个thread thread线程:类似流水线中的段,实现进程中的一个功能 一个Java进程至少包含一个主线程-main线程,其中运行着main方法 线程6种状态 线程创建与运行 public class _Thread {
阅读全文
摘要:序列化与反序列化 序列化:将对象转换为字节读取至文件中 反序列化:将文件中的字节输出为对象 public class FileObject { public static void main(String[] args) throws Exception{ //TODO IO 序列化&反序列化 //
阅读全文
摘要:IO - 文件 - 字符流 BufferedReader\PrintWriter 每次传输一行数据 public class FileString { public static void main(String[] args) throws Exception{ //TODO IO 文件复制 //
阅读全文
摘要:buffer public class FileCopy_Buffer { public static void main(String[] args) throws Exception{ //TODO IO 文件复制 //数据源文件对象 File srcFile = new File("E:\\.
阅读全文
摘要:文件复制 基本的文件流传输 问题:效率不高,每次只能传输一个数据,大量数据传输时需要反复开关阀门 public class FileCopy { public static void main(String[] args) throws Exception{ //TODO IO 文件复制 //数据源
阅读全文
摘要:IO - 文件 IO = 数据 + 流操作 数据源 -> Input -> Stream(管道 - 流转)-> Output - 数据目的地 Java学习的重点 = Input + Stream + Output Stream 不唯一、不相同 文件对象基本操作 public class IO_Fil
阅读全文
摘要:Collection-Exception public class _Exception { public static void main(String[] args) { //TODO Collection Exception //TODO ArrayList list = new ArrayL
阅读全文
摘要:Arrays工具类常用方法 public class Util { public static void main(String[] args) { //TODO Collection 工具类 -- 方法常为静态,通过类名直接访问 // Arrays int[] is = {1, 5, 4, 3,
阅读全文
摘要:Iterator Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和HashSet等集合。迭代器 it 的三个基本操作是 next 、hasNext 和 remove。 为什么要使用迭代器? 普通的for遍历访问集合键值对数据时,要取出全
阅读全文
摘要:Hashtable与HashMap比较 Hashtable基本方法与HashMap大同小异 不同点: 实现方式不同 -- 继承的父类不同 底层结构的容量不同:HashMap(16) Hashtable(11) HashMap的key和value都可以为null,Hashtable的key和value
阅读全文
摘要:HashMap Hash -- Hash算法根据key计算hash函数来存放数据、处理冲突(链地址法-红黑二叉树) => 无序存储,重复丢弃 Map -- 键值对<key, value>中key是唯一的,作为value的索引 基本操作 public class Map { public static
阅读全文
摘要:Queue - ArrayBlockingQueue 底层实现 -- 数组 Array(数组) - Blocking(创建对象时的容量,多了就堵塞) - Queue(先进先出) public class _Queue { public static void main(String[] args)
阅读全文
摘要:HashSet 底层实现是数组 + 链表 数据存放时的索引通过内部Hash算法确定 -- 增加数据是无序的 Hash算法 -- 索引相同时根据内容是否相同决定是否丢弃,内容不相同则采用链地址法处理冲突 内容比较的方法需要重写 hashCode() 和 equals() 方法 多线程中的线程池就用的H
阅读全文
摘要:比较ArrayList与LinkedList 底层实现 ArrayList是数组 - 顺序表 LinkedList是双向链表 增加第一条数据时LinkedList的更快 因为ArrayList默认初始化时创建容量为10的数组空间 而LinkedList只需修改头尾指针指向数据对象 顺序增加数据且Ar
阅读全文
摘要:Comparator 用于定义比较集合数据的标准 -- 实现集合数据排序时常用 public class Sort { public static void main(String[] args) { //TODO Collection 比较器排序 ArrayList list = new Arra
阅读全文
摘要:泛型 ArrayList 和 LinkedList 在存储数据前不用确定数据的类型 => 什么类型的数据都可以存放 导致了一个问题:一个集合中不同类型的数据经常要进行类型转换 因此在创建集合对象时通常要确定集合允许存放的数据类型 泛型:约束内部对象的使用场景 ArrayList<String> st
阅读全文
摘要:LinkedList 底层 双向链表 基础 增删改查 public class _LinkedList { public static void main(String[] args) { //TODO 集合 - Collection - LinkedList => 双向链表 //Linked(连接
阅读全文
摘要:ArrayList public class List { public static void main(String[] args) { //TODO ArrayList : Array + List //List : 列表,清单 -- 按照数据插入顺序进行存储 //Array : 数组,阵列
阅读全文
摘要:集合 Collection 数据的一种容器,用于容纳数据 Java提供了完整的集合框架 数组也是容器,为什么要使用集合? 数组使用不方便 数组索引范围由长度确定 不能动态修改容量 什么时候用到集合?集合的适用场景 处理不确定个数的数据 数据间有关系 对数据进行相同的逻辑处理 根据数据的不同,Java
阅读全文
摘要:比较 == ? equals? 结论: 所有的引用数据类型包括包装类型 都用equals 所有基本数据类型 都用== public class Compare { public static void main(String[] args) { //基本数据类型, == 比较数值 int i = 1
阅读全文
摘要:工具类 工具类无需创建对象就能使用,可以直接使用类中的属性和方法,一般都声明为静态 工具类对外提供的属性和方法都是公共的 提供丰富的方法和属性 自定义String工具类 -- StringUtil import java.nio.charset.StandardCharsets; import ja
阅读全文
摘要:日历类 public class CalenderTest { public static void main(String[] args) { //日历类 -- instance是日历对象 用来调用日历方法 instance.setTime instance.add等 //Calendar日历类直
阅读全文
摘要:日期类 public class DateTest { public static void main(String[] args) throws ParseException { //TODO 常见类和对象 //Date :日期类 //时间戳 :毫秒 System.out.println(Syst
阅读全文
摘要:包装类 常见的类和对象 byte short int long float double char boolean 包装类 public class DataType { public static void main(String[] args) { /* TODO 包装类 Byte b = nu
阅读全文
摘要:枚举 - enum 枚举是一个特殊的类,其中包含了一组特定的对象,这些对象不会发生改变 -- 一般全大写表示 枚举类不能在外部创建对象,枚举类的对象在枚举类的内部自行创建 public class Enum { public static void main(String[] args) { //打
阅读全文
摘要:final final修饰属性 -- 常量,初始化后不可修改 final修饰方法 -- 不能被子类重写 final修饰类 -- 不能被继承 final不能修饰构造方法 -- 构造方法本身就本能被重写,加了只会多余 final可以修饰传入方法的形参 -- 该形参在方法中只能作为常量使用,不可修改
阅读全文
摘要:private : 同类 default : 同类 \ 同包(路径) protected : 同类 \ 同包(路径)\ 子类(作为子类只能调用自己的父类而不能调用别的父类的方法,即使两个父类相同) public : 公共 //测试 protected 对象作为子类去调用父类方法 public cla
阅读全文
摘要:异常 ERROR 通常是灾难性的致命的错误,是程序无法控制和处理的 Exception 通常情况下是可以被程序处理的 抛出异常 - 捕获异常 五个关键字 :try catch finally throw throws public class Test { public static void ma
阅读全文
摘要:N种内部类 普通内部类 在外部类中的内部类 public class Outer { private int id = 10; public void out(){ System.out.println("这是外部类的方法"); } class Inner{ public void in(){ Sy
阅读全文
摘要:接口 普通类:只有具体的实现 抽象类:具体实现和规范(抽象方法)都有 接口:只有规范,没有方法 约束与实现分离 面向接口编程 接口的本质是最高规范、最大公约数 接口作用 约束 定义一些方法,留给其他类实现 接口中的类 public abstract 接口中的属性=常量 public static f
阅读全文
摘要:abstract 抽象类与抽象方法 //abstract 抽象类 --必须被继承,只能单继承 ( 接口可以多继承) public abstract class Action{ //abstract 抽象方法 只有方法名字,没有方法实现 //继承抽象类的子类,必须实现所有抽象方法,除非子类也是抽象类
阅读全文
摘要:多态 Student s1 = new Student(); Person s2 = new Student(); Object s3 = new Student(); Person s4 = new Person(); s1 s2 s3 都是Student类的对象,但各自能够调用哪些方法取决于左边
阅读全文
摘要:继承 本质是对一批类的抽象 extends ="扩展" 子类是父类的扩展 JAVA中类只有单继承,一个子类只能继承一个父类,一个父类可被多个子类继承 继承是类与类间的关系,此外类与类间还有依赖、组合、聚合等 子类(派生类) 父类(基类) 本质上是"is a "的关系 //学生 is 人, 派生类 子
阅读全文
摘要:封装 属性私有private:不允许直接更改对象的属性(private),而是提供额外操作属性的方法 get/set(public) 提高程序安全性,保护数据 隐藏代码实现细节 统一接口 提高系统的可维护性 public class Student { //属性私有 private String n
阅读全文
摘要:什么是面向对象 以类的方式组织代码,以对象的组织(封装)数据 封装 - 继承 - 多态 对象-具体 —— 类-抽象 设计:先有多个对象,再将对象共性抽象成类 代码:先有抽象类,再new具体对象 --先造模子然后就可以随意印姜饼人 关于对象的值传递 对于基本类型的实参 int/String 等 方法通
阅读全文
摘要:数组元素访问 普通for循环遍历所有下标 for(int i=0; i<arrays.length; i++) for-each循环 a:b 不使用下标 for(int array : arrays) 数组作方法入参/数组作返回值 多维数组 数组中的元素是数组 int[][] array = {{1
阅读全文
摘要:数组 长度确定,一旦创建大小不可改变 元素必须是相同类型 元素可以是任何数据类型,包括基本类型和引用类型 数组变量属于引用类型,数组也可以看作一个对象,其每个元素相当于该对象的成员变量 数组本身就是对象,Java中对象在堆中,因此数组中的元素无论是何类型,数组对象本身在堆中。 数组的声明创建 dat
阅读全文
摘要:方法 何为方法 Java方法是语句的集合,执行一个功能(原子性) 命名规则:首字母小写+驼峰 方法包含于类或对象中 方法的定义及调用 -- Java值传递 修饰符(可选) 返回值类型 方法名(参数类型 参数名(形参)){ ... 方法体 ... return 返回值; //终止方法
阅读全文