文章目录
- 基础 + jvm
- - 格式 + 常识
- - String
- - - 1 : 编译 String String=”String” - 【好题】
- - - 2:String 拼接(反编译分析) - 【好题】
- - - 3 : new String 创建多少个对象? - 【好题】
- - 数组
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 ↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, 调用该方法进行初始化 - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 反射
- 正则表达式
- 前端
基础 + jvm
- 格式 + 常识
- - 1:可以用作标识符的是 - 【易误】
- String 就是个类名,不是关键字,可以作为标识符
- $ 可以作为标识符
- - 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 : 完成测试代码
用 工具 javap -c 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
- - 格式 + 常识
- - String
- - - 1 : 编译 String String=”String” - 【好题】
- - - 2:String 拼接(反编译分析) - 【好题】
- - - 3 : new String 创建多少个对象? - 【好题】
- - 数组
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 ↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, 调用该方法进行初始化 - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 反射
- 正则表达式
- 前端
Java 技术规范
XML 属于 Java 技术规范 - 【记!】
- 《javaEE的十三个技术规范》 - https://www.cnblogs.com/nixuebing/p/4152411.html
文章目录
- 基础 + jvm
- - 格式 + 常识
- - String
- - - 1 : 编译 String String=”String” - 【好题】
- - - 2:String 拼接(反编译分析) - 【好题】
- - - 3 : new String 创建多少个对象? - 【好题】
- - 数组
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 ↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完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
- - 格式 + 常识
- - String
- - - 1 : 编译 String String=”String” - 【好题】
- - - 2:String 拼接(反编译分析) - 【好题】
- - - 3 : new String 创建多少个对象? - 【好题】
- - 数组
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 ↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, 调用该方法进行初始化 - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 反射
- 正则表达式
- 前端
异常
- - 1: 那种异常是检查型异常 / 需要在编写程序时声明? 【记!!!】
RuntimeException及其子类型不用显示声明:
RuntimeException子类
1 NullPointerException,这个不用多说了。
2 NumberFormatException,字符串转化成数字时。
3 ArrayIndexOutOfBoundsException, 数组越界时。
4 StringIndexOutOfBoundsException, 字符串越界时。
5 ClassCastException,类型转换时。
6 UnsupportedOperationException,该操作不支持,一般子类不实现父类的某些方法时。
7 ArithmeticException,零作为除数等。
8 IllegalArgumentException,表明传递了一个不合法或不正确的参数
**
继承RuntimeException的异常:
大多数错误并不是由于程序本身有问题,而是运行时输入在某些case下导致的,有更多的不确定性。
而且Java开始的时候并没有异常处理机制,所以从兼容性到实现代价来讲就设计成这个样子了。
- - 2. 如果某异常继承 RuntimeException,则该异常可以不被声明? - 【理解】
- Java中抛出RuntimeException为什么不用显示声明 - https://blog.csdn.net/hongchangfirst/article/details/50681244
总结如下 ↓ ↓ ↓ ↓
继承RuntimeException的异常:
大多数错误并不是由于程序本身有问题,而是运行时输入在某些case下导致的,有更多的不确定性。
而且Java开始的时候并没有异常处理机制,所以从兼容性到实现代价来讲就设计成这个样子了。
RuntimeException类型的异常:
- ArithmeticException:数学计算异常。
- NullPointerException:空指针异常。
- NegativeArraySizeException:负数组长度异常。
- ArrayOutOfBoundsException:数组索引越界异常。
- ClassNotFoundException:类文件未找到异常。
- ClassCastException:类型强制转换异常。
- SecurityException:违背安全原则异常。
非RuntimeException类型的常见异常:
- NoSuchMethodException:方法未找到异常。
- IOException:输入输出异常。
- EOFException:文件已结束异常。
- FileNotFoundException:文件未找到异常。
- NumberFormatException:字符串转换为数字异常。
- SQLException:操作数据库异常
文章目录
- 基础 + jvm
- - 格式 + 常识
- - String
- - - 1 : 编译 String String=”String” - 【好题】
- - - 2:String 拼接(反编译分析) - 【好题】
- - - 3 : new String 创建多少个对象? - 【好题】
- - 数组
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 ↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完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
- - 格式 + 常识
- - String
- - - 1 : 编译 String String=”String” - 【好题】
- - - 2:String 拼接(反编译分析) - 【好题】
- - - 3 : new String 创建多少个对象? - 【好题】
- - 数组
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 ↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, 调用该方法进行初始化 - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 反射
- 正则表达式
- 前端
Servlet
基本
- - 1 . <.url-pattern>
-
- 【记!!!】
- 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实例控制
- 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
- - 格式 + 常识
- - String
- - - 1 : 编译 String String=”String” - 【好题】
- - - 2:String 拼接(反编译分析) - 【好题】
- - - 3 : new String 创建多少个对象? - 【好题】
- - 数组
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 ↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, 调用该方法进行初始化 - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 反射
- 正则表达式
- 前端
正则表达式
-
负整数
^-[0-9]*[1-9][0-9]*$
-
非正整数
^(-\d+|(0+))$
文章目录
- 基础 + jvm
- - 格式 + 常识
- - String
- - - 1 : 编译 String String=”String” - 【好题】
- - - 2:String 拼接(反编译分析) - 【好题】
- - - 3 : new String 创建多少个对象? - 【好题】
- - 数组
- Java 技术规范
- 线程
- 异常
- MySQl - 数据库
- Servlet
- 基本
- - - 1 . `<.url-pattern>` - - 【记!!!】
- - - 2 . 一个Servlet中可以转发两次 ↓ - 【记】
- - - 2。 response 最终输出的是转发过程中最后一个节点的数据 - 【记!!!】
- - - 3 . 【生命周期】 - Servlet的生命周期由Servlet实例控制 ↓ ↓ ↓ ↓ - 【坑!】
- - - 3 . 【生命周期】 - init()方法在创建完Servlet实例后对, 调用该方法进行初始化 - 【坑】
- 4. 定时刷新可以实现在跳转之前的这段时间输出数据到客户端浏览器 - 【理解】
- - 乱码问题
- 反射
- 正则表达式
- 前端
前端
- JavaScript
- - 1 . 伪随机数 random
javaScript - api 工具 https://www.w3cschool.cn/javascript/dict
- 向上取舍 ceil
- 向下取舍 floor
- 四舍五入 round