文章目录
- 基础 + jvm
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - 注意:url−不是uri!!! - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 基本
- 反射
- 正则表达式
- 前端
基础 + jvm
- 格式 + 常识
- - 1:可以用作标识符的是 - 【易误】
- <mark>String 就是个类名,不是关键字,可以作为标识符</mark>
- <mark>$ 可以作为标识符</mark>
- - 2 : 下列数组的声明有哪些是对的? - 【易误】
可行的
int[] aaa ;
int[] bbb = new int[2];
int[] ccc = new int[]{1,2,3} ;
- String
- - 1 : 编译 String String=”String” - 【好题】
Java 里面 String 就是一个类!!!(当然,有点特殊)
String 不是关键字 。
- - 2:String 拼接(反编译分析) - 【好题】
- - - 分析:
字符串拼接时,
-
如果用引用代表要拼接的字符串, 如:
String b2 = a0 + "ccc" //a0 是常量池中"ccc"的引用
编译时会new StringBuilder,通过StringBuilder拼接。
拼接结果的引用会指向堆中new 出来的StringBuilder -
如果没有引用,直接是常量池中字符串的拼接,如
String b1 = "ccc" + "ccc" ;
编译时,会看常量池中有没有拼接结果,如"cccccc"
有,结果的引用就直接指向常量池,如直接指向常量池中的"cccccc"
没有,就在常量池中添加常量。
- - - 测试:
Part 0 : 完成测试代码
用 <mark>工具 javap -c</mark> StringEqualTest.class
反编译下面代码,分析
Part1 : String常量对比
/* * 1. 常量对比 */
String a = "cc" ;
String b = "cc" ;
String c = "------------------" ;
boolean flag = a == b ;
c = "------------------" ;
System.out.println(flag); // true
c = "------------------" ;
Part2:String常量拼接对比
String a0 = "ccc" ;
String a1 = "cccccc" ;
String a ;
a = "----------------";
String b = a0+a0 ;
a = "----------------";
String b1 = "ccc" + "ccc" ;
a = "----------------";
String b2 = a0 + "ccc" ;
a = "----------------";
System.out.println(a1 == b1); //true
System.out.println(b1 == b ); //false
System.out.println(b2 == b ); // false
- - 3 : new String 创建多少个对象? - 【好题】
- String s = new String(“abc”) ;
一个:常量池有"abc",创建堆String
两个:常量池没有"abc",创建常量池"abc",堆String
- 数组
- - 1. 存储在数组中的数据都属于同一数据类型 ? - 【易误】
- - - 一种解释
long[] l ={1,2 , 3L , (byte)1}; //不报错
- - - 另一种解释
向上造型
public class Test {
public static void main(String[] args) {
B[] as = new B[] {
new A() ,
new B()
};
}
}
class A extends B {}
class B {}
文章目录
- 基础 + jvm
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - 注意:url−不是uri!!! - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 基本
- 反射
- 正则表达式
- 前端
Java 技术规范
XML 属于 Java 技术规范 - 【记!】
- 《javaEE的十三个技术规范》 - https://www.cnblogs.com/nixuebing/p/4152411.html
文章目录
- 基础 + jvm
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - 注意:url−不是uri!!! - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 基本
- 反射
- 正则表达式
- 前端
线程
- - 1 : corePoolSize、maximumPoolSize、 - 【理解】
-
Java 线程 - 参数:https://blog.csdn.net/aitangyong/article/details/38822505
- corePoolSize:线程池的基本大小,
- maximumPoolSize:线程池中允许的最大线程数,
-
什么是workqueue
Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。
https://www.cnblogs.com/sky-heaven/p/10690782.html
- - 2 : 线程方法 - start()/notify()/wait()/sleep() - 【常识】
- 《sleep和wait的区别,以及源码解读 - java - 总结的超好!》https://blog.csdn.net/LawssssCat/article/details/103324195
- - 3. 每个对象都有多个的同步锁。( 错的!) - 【理解】
- - 4 。 在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放。 - 【理解】
文章目录
- 基础 + jvm
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - 注意:url−不是uri!!! - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 基本
- 反射
- 正则表达式
- 前端
异常
- - 1: 那种异常是检查型异常 / 需要在编写程序时声明? 【记!!!】
<mark>RuntimeException及其子类型不用显示声明</mark>:
RuntimeException子类
1 NullPointerException,这个不用多说了。
2 NumberFormatException,字符串转化成数字时。
3 ArrayIndexOutOfBoundsException, 数组越界时。
4 StringIndexOutOfBoundsException, 字符串越界时。
5 ClassCastException,类型转换时。
6 UnsupportedOperationException,该操作不支持,一般子类不实现父类的某些方法时。
7 ArithmeticException,零作为除数等。
8 IllegalArgumentException,表明传递了一个不合法或不正确的参数
**
继承RuntimeException的异常:
<mark>大多数错误并不是由于程序本身有问题</mark>,而是运行时输入在某些case下导致的,有更多的不确定性。
而且Java开始的时候并没有异常处理机制,所以从<mark>兼容性</mark>到<mark>实现代价</mark>来讲就设计成这个样子了。
- - 2. 如果某异常继承 RuntimeException,则该异常可以不被声明? - 【理解】
- Java中抛出RuntimeException为什么不用显示声明 - https://blog.csdn.net/hongchangfirst/article/details/50681244
总结如下 ↓ ↓ ↓ ↓
继承RuntimeException的异常:
<mark>大多数错误并不是由于程序本身有问题</mark>,而是运行时输入在某些case下导致的,有更多的不确定性。
而且Java开始的时候并没有异常处理机制,所以从<mark>兼容性</mark>到<mark>实现代价</mark>来讲就设计成这个样子了。
RuntimeException类型的异常:
- ArithmeticException:数学计算异常。
- <mark>NullPointerException</mark>:空指针异常。
- NegativeArraySizeException:负数组长度异常。
- ArrayOutOfBoundsException:数组索引越界异常。
- <mark>ClassNotFoundException</mark>:类文件未找到异常。
- <mark>ClassCastException</mark>:类型强制转换异常。
- SecurityException:违背安全原则异常。
非RuntimeException类型的常见异常:
- <mark>NoSuchMethodException</mark>:方法未找到异常。
- <mark>IOException</mark>:输入输出异常。
- EOFException:文件已结束异常。
- <mark>FileNotFoundException</mark>:文件未找到异常。
- NumberFormatException:字符串转换为数字异常。
- SQLException:操作数据库异常
文章目录
- 基础 + jvm
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - 注意:url−不是uri!!! - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 基本
- 反射
- 正则表达式
- 前端
MySQl - 数据库
- - 1 : JDBC 基本 - 流程 - 【简单】
之前没概念,学了jdbc之后,就非常简单了。下面放入具体的代码
首先,导入jar包:mysql-connector-java-5.1.32.jar
下载链接:
- mysql官网:https://dev.mysql.com/downloads/
- 网上各个版本:https://mvnrepository.com/artifact/mysql/mysql-connector-java
- 我的下载:https://download.csdn.net/download/LawssssCat/12011431
@Test
public void testFindAll() throws ClassNotFoundException, SQLException {
//1. 注册数据库驱动(Driver) - 导入jar包:mysql-connector-java
Class.forName("com.mysql.jdbc.Driver") ;
/** * 解释: * ------- * jdbc:jdbc服务 * mysql:使用mysql的jdbc服务 * localhost:使用本地的mysql的jdbc服务 * 3306:使用本地的3306端口的mysql的jdbc服务 * ------- * jt_db 使用的数据库 * characterEncoding=utf-8 设置编码utf-8 * * 面向接口编程 - 思想 */
//2. 获取数据库连接
/*Connection conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/jt_db?characterEncoding=utf-8", "root", "root");*/
Connection conn = DriverManager.getConnection(
"jdbc:mysql:///jt_db",
"root",
"root");
/** * statement : 声明 */
//3. 获取传输器
Statement stat = conn.createStatement();
String sql = "select * from account;";
//4. 执行SQL语句,返回执行结果
ResultSet rs = stat.executeQuery(sql);
/** * 理解ResultSet结构: * +----+------+-------+ * | id | name | money | 表头 ←—————————— 指向1 rs.next() true/false * +----+------+-------+ ←—————————— 指向2 true rs.get类型("列名") * | 1 | tony | 1000 | ... * | 2 | tom | 1000 | ... * | 3 | andy | 1000 | ←—————————— 指向n true rs.get类型("列名") * +----+------+-------+ ←—————————— 指向n false rs.get类型("列名") */
//5. 处理结果
while (rs.next()) {
int id = rs.getInt("id") ;
String name = rs.getString("name");
double money = rs.getDouble("money");
System.out.println(id+" : "+ name+" : "+ money);
}
//6. 释放资源
rs.close();
stat.close();
conn.close();
}
- - 2 : Connection 获取 PreparedStatement接口 的方法 (prepareStatement) - 【记】
- - 3 . 可以声明多个列一起作为主键,称为联合主键 - 【记】
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` varchar(25) DEFAULT NULL,
`sess_id` varchar(255) DEFAULT NULL,
`keyword` varchar(25) NOT NULL,
`url_n` varchar(3) DEFAULT NULL,
`s_n` varchar(3) DEFAULT NULL,
`select_url` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`,`keyword`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
《mysql的联合主键(组合主键)》 - https://blog.csdn.net/yiqiu3812/article/details/92847056
文章目录
- 基础 + jvm
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - 注意:url−不是uri!!! - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 基本
- 反射
- 正则表达式
- 前端
Servlet
基本
- - 1 . <.url-pattern>
- 注意:url−不是uri!!! - 【记!!!】
- URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,
- 而URL则必须提供足够的信息来定位,是绝对的。
《URI和URL的区别比较与理解》 - https://blog.csdn.net/qq_32595453/article/details/80563142
- - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- Servlet的生命周期【可以】由Servlet实例控制
- init()方法在创建完Servlet实例后对, 【Servlet 容器】调用该方法进行初始化
初始化阶段步骤:
Ø Servlet容器加载servlet类,把它的. Class文件中的数据读到内存中。
Ø Servlet容器创建servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。此外servlet容器还会使得servletConfig对象与当前的web应用的servletContext对象关联。
Ø Servlet容器创建servlet对象。
Ø Servlet容器调用servlet对象的init(ServletConfig config)方法。
通过初始化步骤,创建了servlet对象和servletConfig对象,并且servlet对象与servletConfig对象关联,而servletConfig对象又与当前对象的servletContext对象关联。当servlet容器完成servlet后,servlet对象只要通过getServletContext()方法就能得到web应用的servletContext对象。
- 《Servlet的生命周期——初始化、运行、销毁全部过程》 - https://www.cnblogs.com/lixuwu/p/5676164.html
4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- 乱码问题
- - 1. HTTP 协议不支持非 ISO8859-1 的字符 - 【记!!!】
- - 2. 对于get方式提交的请求参数,我们需要自己手动的经过将乱码先编码再解码的过程解决乱码。 - 【理解!!】 【好题】
发送get请求的时候,
- 首先页面会进行
UTF-8
编码, ---------》 (html 文件的保存编码)
↓
↓ (文件路径 ------》 uri 上的路径,如:http://12.70.0.1:8080/file/你好!
)
↓ - 然后传送的时候http又对页面进行
ISO-8859-1
编码,
↓
↓ (uri 上的路径,如:http://12.70.0.1:8080/file/你好!
------》 请求头文件,如:http://127.0.0.1:8080/file/%1f%ff
)
↓ - 而传输中实际上还有一个针对于url的编码。
然后服务器拿到数据以后,
- 首先会针对于url编码自动解码,
- 但是http中的
ISO-8859-1
没进行解码,
↓
↓(要 tomcat 服务器帮忙,或者手动设置) - 默认request.getCharacterEncoding=ISO-8859-1
↓ - 还有页面的
utf8
也没有解码。
所以出现乱码现象。
总之get请求,经历过三次编码—页面的声明编码,https传送编码,url编码。而其中,url的编码服务器是会自动解码的。(URL是针对那种get请求后面携带中文参数发给服务器,比如下载功能、预览功能。)
/
《 解决 Get 和 Post 和客户端,get请求URL传中文参数等乱码问题 》https://blog.csdn.net/ITBigGod/article/details/83750336
- - 3. doGet() 乱码可以通过response.setContentType(“text\html,charset=utf-8”);来解决 错! - 【理解!】 【好题】
-
Response.setContentType(MIME)的作用是使客户端的浏览器区分不同种类的数据,
并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。
(处理 doPost 乱码问题) -
而 doGet 是服务器的锅 (看问题2)
(所以 doGet 要在 tomcat 中设置 第二次解码的格式 )
反射
- - 1 . 在运行中分析类的能力
文章目录
- 基础 + jvm
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - 注意:url−不是uri!!! - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 基本
- 反射
- 正则表达式
- 前端
正则表达式
-
负整数
^-[0-9]*[1-9][0-9]*$
-
非正整数
^(-\d+|(0+))$
文章目录
- 基础 + jvm
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - 注意:url−不是uri!!! - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 错! ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 错!↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, Servlet 调用该方法进行初始化 错! - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 基本
- 反射
- 正则表达式
- 前端
前端
- JavaScript
- - 1 . 伪随机数 random
javaScript - api 工具 https://www.w3cschool.cn/javascript/dict
- 向上取舍 ceil
- 向下取舍 floor
- 四舍五入 round