Java常考题:
https://blog.csdn.net/zys_1997/article/details/78105542
https://blog.csdn.net/zys_1997/article/details/78145818
智力题:
https://blog.csdn.net/zhongqi2513/article/details/62419185
https://blog.csdn.net/Hackbuteer1/article/details/6726419
https://blog.csdn.net/qq_41035588/article/details/80561278
https://blog.csdn.net/mybook201314/article/details/70791854
题型:
数字找规律、图片找规律、排列组合问题、逻辑推理
排列组合:
http://www.shuxuebang.com/mtbd_935.html
1、计数原理知识点
①乘法原理:N=n1·n2·n3·…nM (分步)
②加法原理:N=n1+n2+n3+…+nM (分类)
2、排列组合混合题的解题原则:
先选后排
先分再排
3、排列组合题的主要解题方法:
优先法:以元素为主,应先满足特殊元素的要求,再考虑其他元素. 以位置为主考虑,即先满足特殊位置的要求,再考虑其他位置.
捆绑法(集团元素法,把某些必须在一起的元素视为一个整体考虑)
插空法(解决相间问题)
间接法
去杂法,等等
在求解排列与组合应用问题时,应注意:
(1)把具体问题转化或归结为排列或组合问题;
(2)通过分析确定运用分类计数原理还是分步计数原理;
(3)分析题目条件,避免“选取”时重复和遗漏;
(4)列出式子计算和作答.
4、经常运用的数学思想是:
①分类讨论思想;
②转化思想;
③对称思想.
1.jsp 内置对象
(可以理解为servlet类 里面的 对象,直接使用; 查看jsp翻译后的java)https://www.cnblogs.com/leirenyuan/p/6016063.html
request :主要用于接受通过HTTP协议传送到服务器的数据。代表了客户端的请求信息(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
response:代表的是对客户端的响应,将JSP容器处理过的对象传回到客户端
session:对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。
session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。
与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
out: 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。
pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。
当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。
exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,
就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
--- EL(Expression Language) 是为了使JSP写起来更加简单。
属性范围在EL中的名称 |
Page |
PageScope ${pageScope.objectName} |
Request |
RequestScope |
Session |
SessionScope |
Application |
ApplicationScope |
---JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和 EL 表达式中可用:如:pageContext; ${pageContext.response} 为页面的响应对象赋值。
<%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.
---JSP指令:JSP中的指令共有三个:page、taglib、include。最常用的是page指令和taglib
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %> <!-- 设置b.jsp页面为错误页,在错误页中就可以使用exception隐藏对象了。--> <!-- 注意:一旦转发到错误页,那么Tomcat会把状态码设置为500,而不在是200了。-->
<html> <body>
<h1>出错啦!</h1>
<%=exception.getMessage() %>
</body>
----jsp中定义成员变量和成员方法:<%! %>
<%! int a=100;//定义全局变量,成员变量
public String sayHello(String name) //定义一个成员方法
{
return "hello,"+name;
}
%>
2.算法
1)递归
---输入n,求第n个斐波那契数
public static int f(int n) throws Exception {
if(n==0){
throw new Exception("参数错误!");
}
if (n == 1 || n == 2) {
return 1;
} else {
return f(n-1)+f(n-2);
}
}
---递归 输入n,求n!
public static long fac(int n){
if(n<=0) return 0;
else if(n==1) return 1;
else return n*fac(n-1);
}
---递归:实现字符串反转
public static String reverse(String originStr) {
if(originStr == null || originStr.length() <= 1)
return originStr;
return reverse(originStr.substring(1)) + originStr.charAt(0);
}
-----冒泡排序
static void sort_desc()
{
int[] a={88,500,4,200,90};//这个情况交换次数最多
for(int i=1;i<a.length;i++)//比4次
{
for(int y=0;y<a.length-i;y++) //在每一轮找最大的数的过程中,两两比较的次数
{
if(a[y]<a[y+1])
{
int tmp=a[y+1];
a[y+1]=a[y];
a[y]=tmp;
}
}
}
System.out.println(Arrays.toString(a));
}
-----水仙花数:一个三位数,其各位数字的立方和是其本身;153 = 1*1*1+5*5*5+3*3*3
public static void main(String[] args) {
System.out.println("100-1000中的水仙花数有:");
for(int i=100;i<1000;i++){
int ge = i%10;
int shi = i/10%10;
int bai = i/100;
//水仙花数判断要求
if(i == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
System.out.println(i);
}
}
}
---有1,2,3,4个数字,能组成多少个互不相同 且无重复数字 的三位数?都是多少?
public static void main(String[] args) throws Exception {
int i, j, k;
int m=0;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
for(k=1;k<=4;k++){
if(i!=j&&k!=j&&i!=k){
System.out.println(""+i+j+k);
m++;
}
}
System.out.println("能组成:"+m+"个");
}
----给定String,求此字符串的单词数量。字符串不包括标点,大写字母。例如 String str="hello world hello hi";单词数量为3,分别是:hello world hi。
public static void main(String[] args) throws Exception {
int count = 0;
String str="hello world hello hi";
String newStr="";
// HashMap<String,String> m=new HashMap<String,String>();
Set<String> m=new HashSet<>();
String [] a=str.split(" ");
for (int i=0;i<a.length;i++){
if(!m.contains(a[i])){
m.add(a[i]);
count++;
newStr=newStr+" "+a[i];
}
}
System.out.println("这段短文单词的个数是:"+count+","+newStr);
}
3.String类方法
https://blog.csdn.net/tomcmd/article/details/54881857
“==” 比较基本类型(的值);比较引用类型(的地址)
str.equals(str1) 比较字符串的内容
boolean equals(String) 判断两个字符串的内容是否一模一样
int str.length() 一个字符串的字符个数(一个中文是一个字符,一个英文是一个字符,一个转义字符是一个字符)
byte[] getBytes() 将一个字符串转换成字节数组
char[] toCharArray() 将一个字符串转换成字符数组
String[] split(",") 将一个字符串按照指定内容劈开
String toUpperCase() 将一个字符串全部转换成大写
String toLowerCase() 将一个字符串全部转换成小写
String replace(String,String) 将某个内容全部替换成指定内容
String replaceAll(String,String) 将某个内容全部替换成指定内容
String repalceFirst(String,String) 将第一次出现的某个内容替换成指定的内容
String substring(int) 从指定下标开始一直截取到字符串的最后
String substring(int,int) 从下标x截取到下标y-1对应的元素
String trim() 去除一个字符串的前后空格
char charAt(int) 得到指定下标位置对应的字符
int indexOf(String) 得到指定内容第一次出现的下标
int lastIndexOf(String) 得到指定内容最后一次出现的下标
-------- String和StringBuilder、StringBuffer的区别?
String是只读字符串,也就意味着String引用的字符串内容是不能被改变的;
StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改;
StringBuffer: 方法被 synchronized 修饰;效率低
StringBuilder:效率高
4.IO流常用的类
https://www.cnblogs.com/ygj0930/p/5827509.html
---字节流
---InputStream
---FileInputStream
---FilterInputStream----BufferedInputStream
---OutputStream
---FileOutputStream
---FilterOutputStream----BufferedOutputStream
---字符流
---Reader
---BufferedReader
---InputStreamReader----FileReader
---Writer
---BufferedWriter
---OutputStreamWriter----FileWriter
FileInputStream在创建时通过把文件名作为构造参数连接到该文件的字节内容,建立起字节流传输通道。
然后通过 read()、read(byte[])、read(byte[],int begin,int len) 三种方法从字节流中读取 一个字节、一组字节。
由于字节流是与硬件(存储介质)进行的读取,所以速度较慢。而CPU需要使用数据时通过read()、read(byte[])读取数据时就要受到硬件IO的慢速度限制。
我们又知道,CPU与内存发生的读写速度比硬件IO快10倍不止,所以优化读写的思路就有了:在内存中建立缓存区,先把存储介质中的字节读取到缓存区中。
CPU需要数据时直接从缓冲区读就行了,缓冲区要足够大,在被读完后又触发fill()函数自动从存储介质的文件字节内容中读取字节存储到缓冲区数组。
BufferedInputStream 内部有一个缓冲区,默认大小为8M,每次调用read方法的时候,它首先尝试从缓冲区里读取数据,
若读取失败(缓冲区无可读数据),则选择从物理数据源 (譬如文件)读取新数据(这里会尝试尽可能读取多的字节)放入到缓冲区中,
最后再将缓冲区中的内容返回给用户.由于从缓冲区里读取数据远比直接从存储介质读取速度快,所以BufferedInputStream的效率很高
--- Arrays
Arrays.sort() //数组排序
Arrays.toString(char[] a) //数组转成字符串
--- 包装类
基本数据类型: byte, int, short, long , boolean, char, float, double等
包装类型 : Byte,Integer,Short , Long, Boolean,Character,Float,Double等
Integer.valueOf() //string to integer
String.valueOf() /integer to string
5.相关子查询
相关子查询的执行过程:
1).取得父查询的候选行;
2).用候选行被子查询引用列的值执行子查询;
3).用来自子查询的值确认或取消候选行;
4).重复步骤1、2、3,直到父查询中无剩余的候选行。
相关子查询的特点:
1).不能独立执行,依赖于主查询
2).主查询执行检索一条信息,子查询执行一次(主查询要检索15条数据,那么子查询执行15次)
相关子查询:当子查询中引用了父查询表中的一个列时,Oracle服务器执行相关子查询。
---特点:效率比较高
1).查询工资比本部门平均工资低的员工信息
select deptno,avg(sal) from emp group by deptno;
select *
from emp e
where sal<(select avg(sal) from emp where deptno=e.deptno)
2).查询工资是本部门工资前两位的员工的信息
select *
from emp e -----主查询,要检索15条数据
where (select count(*) from emp where deptno=e.deptno and sal>e.sal)<=1
3).查询比所在职位平均工资高的员工姓名,职位。
select ename,job
from emp e
where sal>(select avg(sal) from emp where job=e.job)
4).查询工资为其部门最低工资的员工编号,姓名,工资。
select empno,ename,sal
from emp e
where sal=(select min(sal) from emp where deptno=e.deptno)
-------在select子句中出现的相关子查询
例:查询所有部门名称和人数
select deptno,dname,(select count(*) from emp where deptno=d.deptno)
from dept d
查询哪些是经理的员工信息?
select *
from emp
where empno in (select mgr from emp); -----方法一,使用in操作符
select *
from emp e
where exists (select mgr from emp where mgr=e.empno);
-----exists (子查询):这个操作关心的是子查询有没有结果,有结果返回真,没有返回假
-----子查询中:select mgr可以使用 select '1' 替换掉,'1'是占位符,表示有数据,没有特殊含义
select *
from emp e
where exists (select '1' from emp where mgr=e.empno);
查询哪些不是经理的员工信息?
select *
from emp e
where not exists (select '1' from emp where mgr=e.empno);
EXISTS 子查询并没有确切记录返回,只判断是否有记录存在,而且只要找到相关记录,子查询就不需要再执行,然后再进行下面的操作。这样大大提高了语句的执行效率。
NOT EXISTS正好相反,判断子查询是否没有返回值。如果没有返回值,表达式为真,如果找到一条返回值,则为假。
如下练习,用exists或not exists完成
1).列出至少有一个雇员的所有部门名称。
select dname
from dept d
where exists(select '1' from emp where deptno=d.deptno);---10,拿着部门编号去emp查,只要查到一个员工就不查了返回真,效率高
---执行原理:先执行主查询,再执行子查询,有数据马上返回,效率高,是一起执行的
select dname
from dept d
where deptno in(select distinct deptno from emp);----
----执行原理:主查询刚开始被挂起,先执行子查询,把子查询的结果放入一个列表,然后再执行主查询,所以效率低,是分开执行的
2).列出一个雇员都没有的所有部门名称。
select dname
from dept d
where not exists(select '1' from emp where deptno=d.deptno);
6.自定义异常
7.Ajax原理
ajax是用什么方式在后台接收参数的?
https://www.cnblogs.com/zhangxiaozhong/p/3179430.html
https://www.cnblogs.com/lit10050528/p/3541656.html
https://blog.csdn.net/u013766533/article/details/52314519 ajax全解
XMLHttpRequest 对象
Ajax 客户端与服务器之间的交互数据都是 字符串,但是(客户端或服务器)通过不同的解析,可以解析为XML或者JSON。
1、客户端 发送数据 —————— 服务端 获取 数据
(1)发送 key / value ?
1)GET (不需设置请求头)
xhr.open('get', url + '?time=' + time + '&username=' + encodeURL(username), true); // GET方式传值其实就和平时使用 URL 传值方式差不多,用 ?/& 方式通过key=value方式传到服务器
xhr.send(null); // 如果传值中用中文的话,需要进行转码:
—— 服务器获取数据:
String username = request.getParameter('username');
username = new String(username.getBytes(('ISO-8859-1')), 'uft-8'); //服务器中接收是可以转回来
2)POST
xhr.open('post', url, true);
xhr.setRequstHeader('Content-Type', 'application/x-www-form-urlencoded'); //
xhr.send("userId="+userId+"&goodsId="+goodsId); // 浏览器把各 表单字段 及 其数据 作为HTTP消息实体内容发送Web服务器,而不是作为URL地址参数形式传递
(1)发送 JSON
//发送json数据,首先POST方式,再需要先格式化为json格式的字符串发送过去,后台才能接收到,
xhr.open('post', url, true);
xhr.setRequstHeader('Content-Type', "application/json"); //
xhr.send(jsonStr); // json 字符串
—— 服务器获取数据:
//后台通过request.getInputStream获取数据,无法通过getInparamter方法获取
String contentType = request.getContentType();
ServletInputStream is = request.getInputStream(); //前端提交的数据是json格式的字符串数据时,需要以下方式接收数据
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line=null;
while((line=br.readLine())!=null){
System.out.println(line); //{"username":"汤姆","password":"123"}
}
(2)发送 XML
2、服务器 返回数据 —————— 客户端接收返回数据
1)返回 XML
response.setContentType("text/xml;charset=utf-8");
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
PrintWriter out=response.getWriter();
out.write("<cartReport>");
out.write("<counts>"+cartReport.get(0)+"</counts><money>"+cartReport.get(1)+"</money><sumOfGoodsAmountOnCart>"+sumOfGoodsAmountOnCart+"</sumOfGoodsAmountOnCart><cuurentGoodsStock>"+currentGoods.getStock()+"</cuurentGoodsStock>");
out.write("</cartReport>");
——客户端 处理 服务器返回的 XML 数据:
var xmlDoc = xhr.responseXML; 这样可以直接获取Document对象,进行其他操作。
相当于:
var back_val = xmlHttp.responseText;
var xmlDoc = loadXMLString(back_val):
var users = result.getElementsByTagName("user"); //获取DOM元素
2)返回JSON
response.setContentType("application/json;charset=utf-8"); //指定返回的格式为JSON格式
response.setCharacterEncoding("UTF-8"); //setContentType与setCharacterEncoding的顺序不能调换,否则还是无法解决中文乱码的问题
String jsonStr ="{\"id\":\"123\",\"name\":\"小黎\"}";
PrintWriter out=response.getWriter();
out.write(jsonStr);
out.close();
——客户端 处理 服务器返回的 JSON
var result = xmlHttp.responseText;
var users = eval("(" + result + ")"); // 使用eval函数使返回的字符串变成js对象
3)返回字符串 ?
8.数据库表设计
9.数据库 多表连接 单行函数
10.购物车登录、未登录实现 session cookie
11.索引 \ 如何优化SQL?
12.hashCode() equals()
https://blog.csdn.net/foxman209/article/details/6787881
对象的hashcode根据 其在栈区的物理地址通过算法计算出来,不同的物理地址可能得到相同的hashcode,相同的物理地址肯定计算到相同的hashcode.
13.唯一订单号
SnowFlake: https://blog.csdn.net/fayeyiwang/article/details/52128206
Snowflake算法核心:在分布式系统中不同机器产生的id必须不同;把 时间戳,工作机器id,序列号(毫秒级时间41位+机器ID 10位+毫秒内计数12位)组合在一起,第一位为未使用(实际上也可作为long的符号位),加起来刚好64位,为一个Long型。
14.缓存 myBatis redis
MyBatis提供了默认下基于Java HashMap的缓存实现
15.应用系统之间传输数据的集中方案
https://blog.csdn.net/yanmh007/article/details/78590409
socket方式 数据库共享数据方式 ftp/文件共享服务器方式 message方式
16.设计模式
单例模式
工厂模式
生产消费模式
代理模式
17.Math的方法
double floor(double a);向下
double ceil(double a);向上
long round(double a); +0.5再向下
int round(float a)
*Math.sqrt()//计算平方根
*Math.cbrt()//计算立方根
*Math.pow(a, b)//计算a的b次方
*Math.max( , );//计算最大值
*Math.min( , );//计算最小值
18.Java运算符
1) /
//整数相除结果是整数。
// 整数相除,结果是整数,要得到小数,必须有小数参与运算
System.out.println(5.0 / 3); // 1.6666666666666667 默认小数位double
System.out.println(5 / 3.0); // 1.6666666666666667
2) %
取余结果符号与左边符号相同
System.out.println(5 % 3); // 2
System.out.println(‐5 % 3); // -2
System.out.println(5 % ‐3); // 2
System.out.println(‐5 % ‐3); // -2
3)<<
2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
19.顺序、循环、选择结构
20. 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
重载:发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
重写:发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)
重载对返回类型没有特殊的要求;因此重载方法不能根据返回类型区分。
21. 抽象类(abstract class)和接口(interface)有什么异同?
1)抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。‘
2)一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
3)接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。
4)抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。
5)抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。
6)有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
22.需求给到你,你怎样开展工作?
23.开发时你用到了什么模式,你在什么场景下使用?