java学习路线打卡
- 有java基础,JavaSE学习暂时略过【多线程、网络编程、注解和反射】
- 有mysql基础
- 11.9开始javaweb两周学习打卡
- 11.22~11.29进行SSM学习
- 暂时安排如上
- 每日Leecode打卡
- 了解一些技术【maven、docker、git、linux】
2021.11.9打卡
Leecode学习
1 用两个栈实现队列
java中使用Stack会造成速度较慢,Stack继承了vector接口,而Vector底层是一个Object[]数组,需要考虑空间扩容和移位问题,可以使用LinkedList来做容器,其本身就是双向链表扩容消耗少。
2 包含min函数的栈
JavaWeb从入门到实战
1 基本概念
在java中,动态web资源开发的技术统称为javaWeb。
静态web,动态web【技术栈:Servlet、ASP、php】
2 web应用程序
可以提供浏览器访问的程序:
- a.html、b.html。。。多个web资源,这些资源可以被外界访问,对外界提供服务;
- 一个web应用有多部分组成:【html,css,js,jsp,servlet,java程序,jar包,配置文件】
1、静态web - .htm,.html这些都是网页的胡追,服务器上存在这些东西,可以直接进行读取。
- 存在的缺点:
(1)无法动态更新,所有用户看到都是同一页面
(2)无法和数据库交互(数据无法持久化,用户无法交互)
2、动态web
- 存在的缺点
1、加入服务器的动态web资源出现错误,需要重新编写我们的后台程序,重新发布【停机维护】;
2、他可以与数据库交互JDBC(数据持久化)
3 web服务器
1、技术讲解
ASP,基本一个页面都有几千行代码,页面几千极其混乱,维护成本较高
PHP,开发速度很快,功能很强大,跨平台,代码很简单,但是无法承载访问量大的情况
JSP/Servlet,B/S,C/S
2、服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息。
Apache Tomcat
4 Tomcat
- 安装Tomcat
- Tomcat启动和配置
- 配置
可以配置启动的端口号
Tomcat的默认端口号为:8080;
mysql:3306
http:80
https:443
可以配置主机的名称
默认的主机名为:localhost->127.0.0.1
默认网站应用存放的位置为:webapps
- 可以配置一个环境变量(可选择)
- 发布一个web网站
不会就先模仿
将自己写的网站,放到服务器Tomcat中指定的web应用的文化夹子webapps下,就可以访问了。
网站应有的结构:
2021.11.10打卡
Leetcode学习
1 从尾到头打印链表
以数组的形式返回结果,则直接倒序存放即可
2 反转链表
在本身的基础上逆置,思路:头指针指向的结点要作为链表的尾部,只需要将头结点和下一个结点断开即可,定义一个新的指针作为尾指针,引入新指针进行遍历即可。
3 复杂链表的复制
- 哈希表
- 链表的拼接和拆分
此处复制next结点很容易,难点在于将random结点也对应复制在新的链表上;拼接拆分法:先将新链表的next放置妥当,如果插入到原来的链表上,那么random即可利用原有的random指针直接对应。
javaweb路线
5 Http
5-1 什么是HTTP?
HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP上。
- 文本:html,字符串…
- 超文本:图片,音乐,视频,定位,地图…
- 80
https:安全的 - 443
5-2 两个时代
- http1.0
HTTP/1.0:客户端可以与web服务器端连接,只能获得一个web资源,断开连接 - http2.0
HTTP/1.1:客户端可以与web服务器端连接,可以获得多个web资源。
5-3 Http请求
- 客户端—发请求(Request)—服务器
百度
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get方法/post方法
Status Code: 200 OK 状态码:200
Remote Address: 14.215.177.39:443 远程地址
Referrer Policy: strict-origin-when-cross-origin
Accept: text/html 告诉浏览器它所支持的数据类型
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
1、请求行
- 请求行中的请求方式:GET
- 请求方式:GET,POST,HEAD,DELETE,PUT,TRACT…
2、消息头
5-4 Http响应
- 服务端—响应—客户端
Cache-Control: private 缓存控制
Connection: keep-alive 连接:保持活跃
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
refrush:告诉客户端多久刷新一次
location:让网页重新定位
- 响应状态码
200:请求响应成功
3**:请求重定向:你重新到我给你的新位置去
4xx:找不到资源【资源不存在】
5xx:服务器代码错误【502:网关错误】
6 Maven
为什么学习这个技术?
1、javaweb开发中,需要使用大量的jar包,我们手动趣导入
2、Maven自动帮我们导入和配置jar包
6-1 Maven项目架构管理工具
核心思想:约定大于配置【有约束,不要去违反】
Maven会规定好你该如何去编写我们的java代码,必须按照规范进行。
- 下载安装Maven
- 配置环境变量
M2_HOME maven目录下的bin目录
MAVEN_HOME maven的目录
在系统的path中配置:%MAVEN_HOME%\bin - 阿里云镜像
conf/setting.xml
设置mirrors - 本地仓库
创建本地仓库:localRepository - 在IDEA中使用Maven
启动IDEA
1、创建一个MavenWeb项目
MavenGAV
Maven仓库多了什么东西?
注意:IDEA中的Maven配置
2、创建一个普通的Maven项目 - 在IDEA中配置Tomcat
2021.11.11打卡
Leetcode学习
1 替换空格
java中学习StringBuilder类和String类
String创建的字符串存储在公共池中,而new创建的字符串对象在堆上。
参考“https://www.runoob.com/java/java-string.html”
== 注意==String类是不可改变的,所以一旦创建了String对象,那他的值就无法改变了。如果需要对字符串做很多修改,那么应该使用StringBuffer&StringBuilder,此时其对象能够被多次修改,并且不产生新的未使用对象。
- 在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
- StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于StringBuilder 的方法不是线程安全的(不能同步访问)。
- 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用StringBuilder 类。
最终的返回String toString()。
2 左旋转字符串
精选题解介绍:
- 字符串切片法
return s.substring(n, s.length()) + s.substring(0, n);
- 列表遍历拼接
- 字符串遍历拼接
注意:以上两种方法均可以利用求余运算检查代码
res.append(s[ i % len(s) ])
2021.11.12打卡
Leetcode学习
1 数组中重复的数字
本题ac很容易,学习以复杂度角度思考问题
1、时间复杂度O(n),空间复杂度O(n)
利用数据结构特点,直接想到利用哈希表可以实现
2、时间复杂度O(n),空间复杂度O(1)
原地置换:swap( nums[i],nums[nums[i]] )
sort排序:多种排序方式
集合框架体系
- 接口
- Collection【List】
- Map
- 具体类
- List【ArrayList,LinkedList】
- Map【HashMap】
LinkedList: 该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,该类没有同步方法,如果多个线程同时访问一个List,则必须自己实现访问同步,解决方法就是在创建List时候构造一个同步的List。
ArrayList: 该类也是实现了List的接口,实现了可变大小的数组,随机访问和遍历元素时,提供更好的性能。该类也是非同步的,在多线程的情况下不要使用。ArrayList 增长当前长度的50%,插入删除效率低。
HashSet: 该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为null的元素,但最多只能一个。
HashMap: HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。
Java.util中定义的类
Vector:该类和ArrayList非常相似,但是该类是同步的,可以用在多线程的情况,该类允许设置默认的增长长度,默认扩容方式为原来的2倍。
Stack:栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
Dictionary:Dictionary 类是一个抽象类,用来存储键/值对,作用和Map类相似。
在排序数组中查找熟悉1
高效执行代码,考虑面试官考察内容,有序数组中采用折半查找排序,时间复杂度为O(nlogn)。
0~n-1中缺失的数字
2021.11.13打卡
Leetcode学习
1 二维数组中的查找
每行从左到右递增,每列从上到下递增,可以将该矩阵顺时针旋转45°,此时的矩阵能被看作类似于二叉搜索树
若flag>root,则进入左子树;
若flag<root,则进入右子树;
此时的查找会比暴力算法更加高效。
2 旋转数组的最小数字
看见按序的数组,思考二分查找法。
3 第一个只出现一次的字符
利用hashmap实现,HashSet<Charater,Boolean>将是否重复出现填写在映射中;
时间复杂度O(n);空间复杂度O(1)。
2021.11.14打卡
Leetcode学习
1从上到下打印二叉树
1、特例处理:当树的根结点为空时,直接返回空列表;
2、初始化:打印结果列表res=[],包含根结点的队列queue=[root];
3、BFS循环:当队列为空时跳出;
出队时利用ArrayList接收val,比数组更加方便增添删除操作。
2 从上到下打印二叉树②
3 从上到下打印二叉树③
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
本题中BFS遍历即可,但是要向反向输出到列表内,需要将中间采用的列表使用LinkedList双端链表来连接。
2021.11.15打卡
Leetcode学习
1 树的子结构【for me难度高】
判断子结构需要两步:
1、调用函数isSubStructure(A,B)遍历树A,先访问到B树的根结点;
2、调用函数recur(A,B),判定树A包含树B。
recur(A, B) 函数:
- 终止条件:
当节点 B 为空:说明树 B 已匹配完成(越过叶子节点),因此返回 true ;
当节点 A 为空:说明已经越过树 A 叶子节点,即匹配失败,返回 false ;
当节点 A 和 B 的值不同:说明匹配失败,返回 false ; - 返回值:
判断 A 和 B 的左子节点是否相等,即 recur(A.left, B.left) ;
判断 A 和 B 的右子节点是否相等,即 recur(A.right, B.right) ;
isSubStructure(A, B) 函数: - 特例处理: 当 树 A 为空 或 树 B 为空 时,直接返回 false ;
- 返回值: 若树 B 是树 A 的子结构,则必满足以下三种情况之一,因此用或 || 连接;
以 节点 A 为根节点的子树 包含树 B ,对应 recur(A, B);
树 B 是 树 A 左子树 的子结构,对应 isSubStructure(A.left, B);
树 B 是 树 A 右子树 的子结构,对应 isSubStructure(A.right, B);
作者:jyd
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/solution/mian-shi-ti-26-shu-de-zi-jie-gou-xian-xu-bian-li-p/
来源:力扣(LeetCode)
public class main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}