知识清单

本文全面介绍了Java编程语言的核心技术,包括面向对象编程的三大特性、多线程编程、网络编程、JSP与Servlet、Spring框架及Hibernate等。此外还详细探讨了数据结构与算法的相关知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java语言知识


1. 面向对象的三个特征

继承(Inheritance),封装(Encapsulation),多态(Polymorphism)

2. 多线程

线程安全问题

线程安全问题指多个线程修改同一对象时可能产生的冲突问题。

StringBuilder是非线程安全的,StringBuffer是线程安全的;

HashMap是非线程安全的,HashTable是线程安全的;


3. 网络编程



JSP和Servlet


1. JSP的三个编译指令

page, include, taglib

<%@编译指令名 属性名=“属性值”...%>

2. JSP的7个动作指令

jsp:forward
jsp:param
jsp:include
jsp:plugin
jsp:useBean
jsp:setProperty
jsp:getProperty

3. JSP的9个内置对象

application: 在整个web应用中共享信息
config: 配置信息
exception: 在错误数理页面中使用
out: 输出流
page: 页面本身
pageContext: 在此页面中共享信息
request: 封装客户端请求参数
response: 响应
session: 会话中共享信息

4. Servlet的生命周期

加载和实例化
初始化   init()
处理请求 service()
服务结束 destroy()

Spring和SpringMVC


1. MCV架构的含义


2. Spring的两个主要技术

DI 依赖注入

AOP 面向切面编程


Hibernate


1. .cfg.xml 文件的作用

存放数据库连接信息

2. .hbm.xml 文件的作用

存放类与数据库表的映射关系

3. Hibernate工作流程


数据库


1. SQL的增删改查操作


计算机网络


1, HTTP协议

请求报文格式

请求行:  方法 URL 版本
首部行1: 首部字段名: 值
...
首部行2: 首部字段名: 值

实体主体
实体主体只有当方式为POST时不为空

举例

GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/4.0
Accept-language: fr

响应报文格式

状态行:   版本 状态码 短语
首部行1: 首部字段名:值
...
首部行n: 首部字段名:值

实体主体
举例

HTTP/1.1 200 OK
Connection: close
Date: Thu, 03 Jul 2007 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Sun, 06 May 2007 09:23:24 GMT
Content-Length: 6821
Content-Type: text/html

(data data data ....)
状态码对应关系

200    OK
301    Moved Permanently
400    Bad Request
404    Not Found
505    Http Version Not Supported
Cookie工作原理

4部分
在HTTP响应报文中有一个cookie首部行(Set-cookie: 识别码);
在HTTP请求报文中有一个cookie首部行(cookie: 识别码);
在用户端系统中保留一个cookir文件,由用户的浏览器管理;
在Web站点有一个后端数据库。

2, TCP/IP协议


数据结构


1. 数组


1, 一维数组

1,排序算法:

a, 快速排序

b, 冒泡排序选择排序插入排序希尔排序(Shell)

c, 归并排序

d, 桶排

e, 给定一个未排序的整数数组,找到第一个缺失的正整数

 f, 给定一个区间集合,合并所有重复的区间

g, 给定一个非重合的区间集合,在这个集合里插入一个新区间


2,二分查找

a, 给定两个已经排好序的数组,寻找两个数组的中位数,要求时间复杂度为O(log n)

b, 一个已经排序的数组,从中间某点,后半部分被移到前面,在这个半有序的数组中查找元素

c, 在一个已经排序的数组里,寻找给定值,如果找不到这个值,返回应该插入的位置

d, 在一个已经排序的数组里,寻找给定值的下标范围


3,删除元素

a, 删除有序数组重复的元素,要求在原地进行

b, 给定一个数组和一个值,删除数组里所有等于此值的元素,要求原地进行


4,合并

a, 合并两个有序数组A和B,将B合并到A里,可以保证A有足够的空间


2,矩阵

1,给定一个N*N的矩阵,编写一个方法,将矩阵旋转90度,只能用常数额外空间

2,给定一个m*n的矩阵,编写一个方法,如果一个元素是0,把其所在的行和列的所有元素都置0,要求原地实现

3,给定一个m*n的矩阵,编写一个方法,螺旋输出矩阵元素

4,给定一个整数n,构造一个n*n矩阵,将1到n^2的元素按螺旋顺序放置在矩阵里

5,一个矩阵,每一行,从左到右有序,并且下一行的第一个元素大于上一行的最后一个元素,在此矩阵中进行查找


3,双指针问题

1. 盛水最多的容器

给定一列整数a1,a2...an. 每一个代表(i, ai),与(i, 0)连成一条竖直线,两条竖直线和X轴组成一个容器,找到两条竖直线,使得形成的容器装水最多,返回装水量。

2. 3数和

给定一个整数数组,有三个元素a,b,c使得 a+b+c = 0, 找出所有这些组合

3. 最接近目标值的3数和

给定一个整数数组,有三个元素a,b,c使得a+b+c最接近一个给定的目标值,返回这三数的和

4. 4数和

给定一个整数数组,有四个元素a,b,c,d使得a+b+c+d = target,找出所有这些组合,每一个组合里的数字按递增排列

5. 给定一组非负整数代表海拔图,计算下雨后能盛多少水


6. 给定一个数组包括0,1,2,整理这个数组保证相同元素相邻同时按照0,1,2的顺序递增,要求一趟遍历完成同时常数额外空间

7. 一个IP地址由四部分组成,每一部分从0到255,。给定一个包含数字的字符串,返回它可能代表的所有IP地址的组合

8. 重新安排0和1,使得0在数组左边,1在数组右边


4,全排列衍生问题

给定一个数组,是一列整数得全排列,计算这个全排列的下一个全排列

一个1,2,...,n的集合总共有n!个全排列,给定n和k,返回第k个全排列

5,最大和子数组

给定一个数组,找到子数组的最大和

6. 杨辉三角

给定行数,生成杨辉三角

给定一个数字K,返回杨辉三角的第K行(K从0开始)


2. 链表


1,有环链表

a. 判断链表是否有环

b. 判断链表是否有环,如果有找到环开始的节点

c. 将一个链表后面k个元素旋转到前面


2,反转链表

a. 反转链表m和n之间的部分,其他部分保持不变

b. 从头到尾两两翻转单连表上的节点

c. 给定一个单链表,每k个节点为一组,反转链表


3,链表查找


4,删除链表节点

 a, 删除单链表从后往前数第n个节点

 b, 一个有序链表,删除链表中得重复元素,使得每个元素只出现一次

 c,  一个有序链表,删除链表中的重复元素,只剩下原来链表中不重复的元素

 d, O(1) 时间删除链表节点

把下一个节点的值赋给当前节点,再删除下一个节点

5,合并链表

a, 合并k个有序链表,作为一个链表返回

b, 合并两个有序链表

6. 重构链表

a, 给定一个链表和一个值x,分割链表,使小于x的节点在左边,大于等于x的节点在右边

b, 给定一个链表L1->L2->L3 ...... Ln-1 -> Ln, 返回L1->Ln->L2->Ln-1....

c, 用插入排序给链表排序

d, 在O(nlogn)的时间里给链表排序


7. 拷贝链表

a, 一个链表,每一个节点还有额外一个指针指向链表中任意一个节点,返回这个链表的一个深拷贝

b, 

8. 数学运算模拟

a, 两数相加。给定两个链表表示两个非负整数,数字是按照反向存放的,即低位在前,高位在后。将两数相加,以链表形式返回他们的和


9. 判断两链表是否相交

解法一: 链表1接在链表2后面,得到的链表有环则说明有公共节点

解法二: 两个链表都遍历到最后一个节点,如果最后一个节点是一个节点,则说明有公共节点


10. 已知两链表相交,找到第一个交点

先计算两链表长度,较长的链表先遍历长度差,再一起遍历,直到两指针相等


3. 二叉树


1, 先序中序后序遍历,递归非递归

2, 层序遍历

3, Z形层序遍历二叉树(蛇形遍历)

4, 从下到上层序遍历二叉树

5, 给定一个整数n,问有多少个不同的二叉查找树(BST)可以用来存放1...n的元素

6, 给定一个整数n,返回所有可以用来存放1...n元素的不同的二叉查找树

7, 判断一棵二叉树是不是二叉查找树

8, 一棵二叉查找树有两个元素被错误交换位置,写一个程序恢复这颗二叉查找树

9, 给定两棵二叉树,写一个程序判断这两颗二叉查找树是否相等

10, 判断一棵二叉树是否对称

11, 计算二叉树的最长高度

12, 计算二叉树的最短高度

13, 从先序和中序序列中恢复二叉树

14, 从中序和后序序列中恢复二叉树

15, 把有序数组转变成二叉查找树

16, 把有序链表转变成二叉查找树

17, 判断一棵二叉树是不是平衡二叉树

18, 给定一棵二叉树和一个值,判断二叉树上是否存在一条根到叶子的路径,使得这条路径上节点的和等于这个值

19, 给定一棵二叉树和一个值,返回所有根到叶子的路径,这些路径满足节点的和等于这个值

20, 把一棵二叉树变成一个链表

21, 给定一个完全二叉树,除了left和right指针,每个节点加多个next指针,指向同一层中右边相邻节点

22, 给定一个任意二叉树,除了left和right指针,每个节点加多个next指针,指向同一层中右边相邻节点

23, 给定一个二叉树,计算两个节点间的最大路径和

24, 一棵二叉树,每一个根到叶子的路径代表一个数,求这些数的和


4. 图


1. 广度优先遍历

a, 单词梯I:给定两个单词start和end,和一个字典,找到从start到end最短的变换序列的长度

每次只能变换一个字符

每个中间单词都要在字典里

b, 单词梯II:给定两个单词start和end,和一个字典,找到从start到end所有的最短变换序列

c, 给定一个2D矩阵只包括 X 和 O,把所有被X包围的封闭区域中的O全部填成 X

d, 克隆一个无向图

2. 深度优先遍历

见回溯部分

3. 哈夫曼树


5. 队列和栈


1. 给定一列括号序列包含“{”,“}”,“(”,“)”, “[”,“]”, 判断这个括号序列是否合法

2. 一个字符串只包含"("和“)”,计算最长的有效括号组合

3. 直方图中最大的矩形

给定一个数组代表一个直方图,计算这个直方图中最大的矩形面积


4. 最大的矩阵面积

给定一个2D矩阵只包含0和1,计算全都是1的最大矩形的面积

5. 计算后缀表达式的值

如 ["2","1","+","3","*"] -> ((2+1)*3)->9


6. Hash


1. 给定一个字符串,计算没有重复字符的最长的子串长度

2. 给定一个字符串和一组单词,找到所有子串,这个子串是单词表里所有单词的连接,返回所有子串的开始下标

3. 异形词

给定一组字符串,返回所有异形词的组合。异形词是指所含字符相同但是顺序不同

4. 给定字符串S和T,在S中找到最小长度子串,这个子串包含T中所有字符

5. 最长连续序列

给定一个未排序数组,找到最长的连续元素的长度

如[100,4,200,1,3,2], 最长连续元素是[1,2,3,4], 所以返回4

6. LRU缓存

设计一个数据结构,最少使用缓存,支持一下方法:

get(key): 返回key对应的值,不存在返回-1

set(key, value): 设置或插入一个键值对。如果容量慢,在插入之前要删除最少使用的键值对

7. 给定一个2D矩阵的点集合,找到躺在一条直线上最大的点数


7. 字符串


1. 回文串

给定一个字符串,返回最长的回文子串

给定一个字符串,判断是不是回文串

2. 之字变换

一个字符串"PAYPALISHIRING" 按照给定的行数以之字形排列如下:

<span style="font-size:12px;">P   A   H   N
A P L S I I G
Y   I   R</span>
然后返回“PAHNAPLSIIGYIR”

写一个函数,给定一个字符串和一个行数,返回对应的之字变换

3. 最长公共前缀

写一个函数,返回一组字符串的最长公共前缀

4. 子串查找

写一个函数,查找一个字符串里是否出现给定子串needle, 返回子串下标

5. Count and Say

一个整数1,11,21,1211,111221, ...

1被读成“one 1” 或 11

11被读成“two 1s” 或 21

21被读成"one 2, one1“或1211

给定一个n,返回第n个序列

6. 给定一个字符串由大小写字母和空格组成,返回最后一个单词的长度

7. 把一个字符串数组里的元素按顺序放在一个矩阵里,矩阵每行宽度为L

希望每行单词精良平均分配,即剩余的空格尽量平均分配在单词中间,不能平均分配的从左到右分配;

如果某行只有一个单词,则空格补在后面;

最后一行,单词之间只要一个空格,其他空格补在后面

8. 简化Unix风格的路径

path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

9. 给定一个字符串,按单词反转这个字符串

如 s = "the sky is blue",返回 ”blue is sky the“

10. 压缩字符串 

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能

例如,字符串"aabcccccaaa" 会变为 "a2b1c5a3"。若“压缩”后的字符串没有变短,则返回原先的字符串。

11. String Reduction

一个字符串由a,b,c组成,两个相邻的不同字符可以由第三个字符代替。重复这个过程,最后剩下的最短长度是多少?

如:bcab -> aab -> ac -> b

12. 字符串匹配

给定一个字符串s和一个模式串p,返回s中所有与p匹配的子串下标



算法


1. 动态规划


1. 最长公共子序列和最长公共子串

a, 给定两个字符串a 和 b, 求两个字符串的最长公共子序列。

b, 给定两个字符串a 和 b,求两个字符串所有的最长公共子串。

c. 最长递增子序列

2. 爬楼梯问题

有一个n 阶的楼梯,每次只能上 1 阶或 2 阶,问上到楼梯顶端有多少种方法。

3. 字符串分割

a, 给定一个字符串和一个单词集合,确定此字符串能否拆分成由这个集合里一个或者多个单词组成的序列

b, 给定一个字符串和一个单词集合,在字符串中加空格,保证每一个单词都是集合中的单词,返回所有可能的序列

4. 路径规划

a, 一个机器人放在m*n矩阵的左上角,每次只能右移一位或下移一位,问有多少条不同的路径可以走到矩阵右下角

b, 一个机器人放在m*n矩阵的左上角,每次只能右移一位或下移一位,矩阵中有一些障碍物标记为1,问有多少条不同的路径可以走到矩阵右下角

5. 三角形

给定一个三角形,计算从上到下和最小的路径,返回这个和

例如:

<span style="font-size:12px;">[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]</span>

返回 11 (2+3+5+1)

6. 回文分割

给定一个字符串s,分割它以保证每一个子串都是一个回文子串,返回最小切割数

7. 最小路径和

给定一个m*n的非负矩阵,每次只能往右或往下移动,找到一个从左上到右下的路径中最小的路径和

8. 最大矩形

给定一个2D的二值矩阵,找到全都是1的最大的矩阵并返回它的面积

9. 交叉字符串

给定字符转s1,s2,s3,判断s3是不是由s1和s2交叉而成

10. 编辑距离

给定两个单词w1,w2,计算最少需要多少步可以把w1转变成w2

允许的操作有三种,插入一个字符,删除一个字符,替换一个字符

11. 不同子序列

给定两个字符串S和T,计算S中有多少个不同的子序列等于T

12. 反编码

A~Z被编码为1~26,给定一个已经编码过的数字序列,计算有多少种反编码方式

13. 最佳时间买卖股票

a. 有一个数组,存放第 i 天的股票价格,只能买一次,卖一次,求最大利润

b. 有一个数组,存放第 i 天的股票价格,可以买卖两次,但必须卖了之后才能再买,求最大利润

c. 这个不是DP,放在这里统一。 有一个数组,存放第i天的股票价格,可以无限次买卖,求最大利润


2. 回溯(DFS)


1. 全排列问题

把一个数组的数的组合全部列出来,比如1和2列出来为1,2,12,21.

a. 没有重复元素的数的组合;

b. 有重复元素的数的组合;

c. 没有重复元素的全排列;第二种

d. 有重复元素的全排列。第二种

2. 数独

a, 写一个程序来解数独

b, 判断一个数独解是不是有效解

3. 数字序列的所有字母组合

给定一个电话键盘,和一个数组序列,计算这个数字序列所能代表的所有字母组合


4. 给定n对小括号,返回所有合法的括号组合

5. 给定一个整数集合和一个目标值,返回和等于这个目标值的所有整数组合,每个整数可以被使用多次

6. 给定一个整数集合和一个目标值,返回和等于这个目标值的所有整数集合,每个整数只能被使用一次

7. 通配符匹配

实现支持"?"和”*“的通配符匹配

<span style="font-size:12px;">'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab", "?*") → true
isMatch("aab", "c*a*b") → false</span>
8. 组合

给定两个数n和k,返回1...n中所有长度k的组合

给定一个没有重复元素整数集合,返回所有子集

给定一个有重复元素的集合,返回所有子集

9. 给定一个2D字符矩阵和一个单词,确定这个矩阵中是否能找到这个单词

每次只能向横向纵向相邻的位置搜索,每一个位置不能重复使用

10. 回文

给定一个字符串S,分割S保证每一个子串都是回文的。返回所有的分割组合

3. 递归

1.八皇后问题

a. 给定一个整数N,求N皇后问题的所有解。

b. 给定一个整数N,求N皇后问题总共有多少组解。

2. 正则表达式匹配

实现支持“.” 和 “*” 的正则表达式匹配

<span style="font-size:12px;">'.' Matches any single character.
'*' Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true</span>
3. 给定一个字符串s1, 可以表示成二叉树的形式

<span style="font-size:12px;">    great
   /    \
  gr    eat
 / \    /  \
g   r  e   at
           / \
          a   t</span>
要扰乱这个字符串,选择一个非叶子节点,交换它的两个孩子

<span style="font-size:12px;">    rgeat
   /    \
  rg    eat
 / \    /  \
r   g  e   at
           / \
          a   t</span>
说 rgeat 是great 的一个 scramble 字符串

如果继续交换

<span style="font-size:12px;">    rgtae
   /    \
  rg    tae
 / \    /  \
r   g  ta  e
       / \
      t   a</span>
说rgtae 也是great的一个scramble字符串

给定两个相同长度的字符串s1和s2, 判断他们是不是 scramble 字符串

4. 格雷码

格雷码是一个二进制计数系统,相继两个只差一个bit。给定一个整数n代表格雷码的位数,打印所有该位数的格雷码

例如,给定n=2,返回[0,1,3,2]

<span style="font-size:12px;">00 - 0
01 - 1
11 - 3
10 - 2</span>

4.位运算


1. 给定一个整数数组,除了一个元素,其他元素都出现两次,找到这个元素

2. 给定一个整数数组,除了一个元素,其他元素都出现三次,找到这个元素

3


5. 分治


6. 贪心算法


1. 哈弗曼编码(Huffman Coding)

用二进制来编码字符串“abcdabaa”,需要能够根据编码,解码回原来的字符串,最好需要多长的二进制字符串?

2. 跳跃游戏

给定一个非负整数数组,开始在0位,每一个数组元素代表从当前下标开始能往后走的最大步数,计算跳到最后需要的最小步数

给定一个非负整数数则,开始在0位,每一个数组元素代表从当前下标开始能往后走的最大步数,判断是否能跳到最后

3. 加油站问题

沿一个圈有N个加油站,每个加油站的量是gas[i]。有一辆车可以加无限油,从i到i+i花费cost[i]的油。

开始时没有油,找到一个加油站,从这里开始可以环绕所有加油站一周。

4. 发糖果

N个小孩站一排,每个小孩有个rating,给这些小孩发糖果,保证

每个小孩至少有一个糖果

rating高的小孩要比他的邻居得到更多糖果

问,至少需要多少糖果?


7. 数学运算


1. 反转整数

即把 123 变为 321, -123 变为 -321

2. 字符串转换为整数

3. 判断一个整数是不是回文

4. 整数转为罗马数字

5. 罗马数字转为整数

6. 不使用乘,除,取模运算来计算两整数相除

7. 给定两个字符串代表两个整数,计算两个整数相乘,结果以字符串表示

8. 实现pow(x,n)

9. 给定两个二值字符串,计算两个二值数之和

10. 给定一个字符串,判断这个字符串是否是一个有效数字

11. 给定一个数组代表一个非负整数,计算这个整数加1

12. 计算sqrt(x)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值