刷题笔记
这篇博客是我在刷牛客的笔试题的时候整理的,每天会刷一部分题,不定时更新,不一定全都是Java的知识点,挑着看,个人认为做题巩固知识点会快很多,文章中有什么错误请及时联系我,不要传播错误的知识。
JAVA
-
遇到
String
类型之前,int
间使用+
表示数值的相加,直到遇到第一个String
,后面按Stirng
类型,变成字符串的拼接例 System.out.println(1+"10"+3+"2"); // 11032 System.out.println(1+2+"10"+3+"2"); // 31032 System.out.println(1+"10"+3+1+"2"); // 110312
-
finally
是一定要执行的,当try
,catch
和finally
中都有return
时,只会执行finally
中的 -
Java中的
四类八种
基本数据类型- 第一类:整数类型
byte
short
int
long
- 第二类:浮点型
float
double
- 第三类:逻辑型
boolean
(两个值可取true
false
) - 第四类:字符型
char
- 第一类:整数类型
-
for循环执行顺序
for(expression1; expression2; expression3){ expression4; }
执行的顺序应该是:
- 第一次循环,即初始化循环。
首先执行表达式expression1(一般为初始化语句);再执行expression2(一般为条件判断语句),判断expression1是否符合expression2的条件;如果符合,则执行expression4,否则,停止执行;最后执行expression3。 - 第N(N>=2)次循环
首先执行expression2,判断在expression3是否符合在expression2要求;如果符合,则继续执行在expression4,否则,停止执行。最后执行在expression3。如此往复,直至expression3不满足在expression2条件是为止。
先条件判断(expression2),再函数体执行(expression4),最后for执行(expression3)
第一次判断时,对象为初始化语句(expression1),后续的判断对象为执行后的结果(expression3) - 第一次循环,即初始化循环。
-
方法的重写与重载
- 重写
参数列表
必须与被重写方法相同
返回类型
必须完全与被重写方法的返回类型相同
访问权限
不能
比父类中被重写的方法的访问权限更低
- 父类的成员方法
只能被它的子类重写
- 声明为
final的方法不能被重写
- 声明名为
static的方法不能被重写
,但是能够被再次声明 构造方法不能被重写
- 子类和父类在
同一个包
中,子类可以重写父类所有方法
,除了声明为private
和final
的方法 - 子类和父类
不在同一个包
中,子类只能
重写父类声明为public
和protected
的非final
方法 - 如果
不能继承一个方法
,则不能重写这个方法
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法
不能抛出新的强制性异常
,或者比被重写方法声明的更广泛的强制性异常
,反之则可以
- 重载
- 被重载的方法
必须改变参数列表
- 被重载的方法
可以改变返回类型
- 被重载的方法
可以改变访问修饰符
- 被重载的方法
可以声明新的或更广的检查异常
- 方法能够在
同一个类
或者在同一个子类
中被重载 - 无法以返回值类型作为重载函数的区分标准
- 被重载的方法
- 重写
-
Java表达式转型规则
- Java表达式转型规则由低到高转换
- 所有的
byte\short\char型
的值被提升为int型
- 如果
有一个操作数是long型
,计算结果为long型
- 如果
有一个操作数是float型
,计算结果为float型
- 如果
有一个操作数是double型
,计算结果为double型
被final修饰
的变量不会自动改变类型
,当两个被final修饰的变量相操作时,结果会根据左边变量的类型而转化
例题 byte b1=1,b2=2,b3,b6,b8; final byte b4=4,b5=6,b7; b3=(b1+b2); /*语句1*/ b6=b4+b5; /*语句2*/ b8=(b1+b4); /*语句3*/ b7=(b2+b5); /*语句4*/ System.out.println(b3+b6);
- 所有的
- 解析
- 语句1错误:b3=(b1+b2);自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;
语句2正确:b6=b4+b5;b4、b5为final类型,不会自动提升,所以和的类型视左边变量类型而定,即b6可以是任意数值类型; - 语句3错误:b8=(b1+b4);虽然b4不会自动提升,但b1仍会自动提升,所以结果需要强转,b8=(byte)(b1+b4);
语句4错误:b7=(b2+b5); 同上。同时注意b7是final修饰,即只可赋值一次,便不可再改变。
- 语句1错误:b3=(b1+b2);自动转为int,所以正确写法为b3=(byte)(b1+b2);或者将b3定义为int;
- Java表达式转型规则由低到高转换
-
垃圾收集
- 使用垃圾收集的程序不需要明确释放对象
- 现代垃圾收集能够处理循环引用问题
- 垃圾收集能提高程序员效率
- 垃圾收集也会有内存泄漏问题
-
Servlet的生命周期
- 初始化阶段(init)
- 创建并加载servlet对象、ServletConfig对象
- 运行阶段(service)
- 调用doGet()\doPost()方法,构造servletRequest\servletResponse对象
- 销毁阶段(destroy)
- 停止Servlet,释放资源
- 初始化阶段(init)
-
只有在
不显示声明构造方法
时,系统才提供默认无参构造方法 -
静态变量
和静态初始化
块谁先声明谁先初始化public class Test{ static int cnt = 6; static{ cnt += 9; } public static void main(String[] args){ System.out.println(“cnt =” + cnt); } static{ cnt /=3; }; } //cnt = 5;
-
如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法
-
private方法
只可以在类的内部使用
,在类外根本访问不到,而final方法
可以在类外访问
,但是不可以重写该方法
-
访问修饰符访问权限
- protected:可被同一包以及包外子类访问
- private:只能自己访问
- default:只能被同一包访问
abstract
关键字
- abstract类不能与final,static使用
- interface属于特殊的abstract类,也是abstract类
- 可以有private属性
-
数组复制的效率
System.arraycopy
>clone
>Arrays.copyOf
>for循环
-
HashMap
是采用拉链法
解决哈希冲突 -
java concurrent
包下的4个类Semaphore
:类,控制某个资源可被同时访问的个数;ReentrantLock
:类,具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大;Future
:接口,表示异步计算的结果;CountDownLatch
:类,可以用来在一个线程中等待多个线程完成任务的类
-
抛
InterruptedException
的代表方法- java.lang.Object 类的 wait 方法
- java.lang.Thread 类的 sleep 方法
- java.lang.Thread 类的 join 方法
-
线程调用
start()
方法来启动线程,真正实现了多线程运行run()
方法当作普通方法的方式调用,程序还是要顺序执行
-
Lanbda表达式
- 形参列表:形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略
- 箭头(→):必须通过英文中画线和大于符号组成
- 代码块
-
可以用于存储键,值对,并且方法调用提供了基本的多线程安全支持的类有
hashtable
concurrentHashMap
synchronizedMap
-
序列化是将
数据结构
转换成为二进制数据流
或者文本流
的过程 -
++m
/m++
++m
先自加再输出,m++
先输出再自加
-
Math类
取整方法floor
:向下取整,返回小于参数的最大整数,返回double类型
ceil
:向上取整,返回大于参数的最小整数,返回double类型
round
:对小数进行四舍五入后的结果,返回int类型
-
类中实例变量可以不用初始化,使用相应类型的默认值即可;方法中的定义的局部变量必须初始化,否则编译不通过
-
list set
- 列表(List)的元素是
有序、可重复
的 - 集合(Set)的元素是
无序、不可重复
的
- 列表(List)的元素是
-
多重catch块的顺序问题
- 异常处理系统就近寻找匹配异常处理程序,应先子类后父类
Exception
异常类最后抛出
-
HashMap的数据结构是
数组+链表
-
选择语句不能重复执行
-
关键字super的作用
- 访问父类被隐藏的非私有成员变量
- 调用父类中被重写的方法
- 调用父类的构造函数
-
string字符串的值是不可变
String str = new String("test");
str
的值一直是test
-
Socket套接字
- 服务器端:ServerSocket提供的实例
ServerSocket server= new ServerSocket(端口号)
- 客户端:Socket提供的实例
Socket soc=new Socket(ip地址,端口号)
- 服务器端:ServerSocket提供的实例
-
final
关键字- final修饰变量,则等同于常量
- final修饰方法中的参数,称为最终参数
- final修饰类,则类不能被继承
- final修饰方法,则方法不能被重写,可以被重载
- final 不能修饰抽象类
-
synchronized 锁住的对象
- 修饰非静态方法 锁的是
this对象
- 修饰静态方法 锁的是
class对象
- 修饰非静态方法 锁的是
-
类的成员变量默认会被初始化
public class Person{ static int arr[] = new int[5]; public static void main(String a[]){ System.out.println(arr[0]); } //输出为0 }
-
.add(0,4)
是在0号索引上添加数字4 -
二维数组定义,一维长度必须定义,二维可以后续定义
float []f[] = new float[6][6]
- 第一个框一定要有值
-
byte
、int
、long
、char
、float
、double
、boolean
各占多少个字节- 1 4 8 2 4 8 1
-
abstract
只能修饰类和方法 不能修饰字段 -
JSP的9个内置对象
pageContext
表示页容器 EL表达式、 标签 、上传request
服务器端取得客户端的信息:头信息 、Cookie 、请求参数 ,最大用处在MVC设计模式上response
服务器端回应客户端信息:Cookie、重定向session
表示每一个用户,用于登录验证上application
表示整个服务器config
取得初始化参数,初始化参数在web.xml文件中配置exception
表示的是错误页的处理操作page
如同this一样,代表整个jsp页面自身out
输出 ,但是尽量使用表达式输出
-
Statement
对象的用于执行不带参数的简单SQL语句Prepared Statement
对象用于执行预编译SQL语句Callable Statement
对象用于执行对存储过程的调用
-
实现或继承了Collection接口有
List
、Vector
、Set
-
合法的标识符
- 不能以数字开头
- 不能是关键字
- 不能包含除了
$
和_
以外的其它字符
-
JVM命令
jps
:查看本机java进程信息jstack
:打印线程的栈信息,制作线程dump文件jmap
:打印内存映射,制作堆dump文件jstat
:性能监控工具jhat
:内存分析工具jconsole
:简易的可视化控制台jvisualvm
:功能强大的控制台
-
>>
、>>>
>>
带符号右移>>>
无符号右移,高位用0填充
-
forward
和redirect
- 转发是服务器行为,重定向是客户端行为
-
JVM堆内存中的区域有哪些
Eden区
,Survivor区
,old区
-
is-a
:继承关系has-a
:从属关系like-a
:组合关系is-a
,理解为是一个,代表继承关系。 如果A is-a B
,那么B就是A的父类like-a
,理解为像一个,代表组合关系。 如果A like a B
,那么B就是A的接口has-a
,理解为有一个,代表从属关系。 如果A has a B
,那么B就是A的组成部分
-
equal
是内容比较==
是比较地址 -
数组下标从0开始
已知 声明并初始化二维数组 int a[ ][ ]={{1,2},{3,4},{5,6}} ,则 a[1][1] 的值为 0 1 0 {1,2} 1 {3,4} 2 {5,6} // a[1][1]=4
-
访问修饰符
修饰符 类内部 同一个包 子类 任何地方 private Yes default Yes Yes protected Yes Yes Yes public Yes Yes Yes Yes 名称 说明 备注 public 可以被任何类访问 protected 可以被同一包中的所有类访问,可以被所有子类访问 子类没有在同一包中也可以访问 private 只能够被 当前类的方法访问 无访问修饰符 可以被同一包中的所有类访问 如果子类没有在同一个包中,也不能访问 public
>protected
>默认(包访问权限)
>private
-
HttpServlet
容器响应Web客户请求流程- Web客户端向Servlet容器
发出请求
- Servlet容器
解析
Web客户的Http请求
- Servlet容器
创建
一个HttpRequest对象
,在这个对象中封装Http请求信息
- Servlet容器
调用
一个HttpResponse对象
- Servlet容器
调用
HttpServlet的service方法
,这个方法中会根据request的Method
来判断
具体是执行doGet还是doPost
,把HttpRequest和HttpResponse对象作为service方法的参数``传给HttpServlet对象
- HttpServlet
调用HttpRequest
的有关方法,获取HTTP请求信息
- HttpServlet
调用HttpResponse
的有关方法,生成响应数据
- Servlet容器把HttpServlet的响应结果
传给Web客户
- Web客户端向Servlet容器
-
Object 类
中的方法registerNatives()
//私有方法getClass()
//返回此 Object 的运行类hashCode()
//用于获取对象的哈希值equals(Object obj)
//用于确认两个对象是否“相同”clone()
//创建并返回此对象的一个副本toString()
//返回该对象的字符串表示notify()
//唤醒在此对象监视器上等待的单个线程notifyAll()
//唤醒在此对象监视器上等待的所有线程wait(long timeout)
//在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待wait(long timeout, int nanos)
//在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待wait()
//用于让当前线程失去操作权限,当前线程进入等待序列finalize()
//当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
-
抽象类和接口的修饰符
- 抽象类
JDK 1.8前
,抽象类的方法默认访问权限为protectedJDK 1.8时
,抽象类的方法默认访问权限变为default
- 接口
JDK 1.8前
,接口中的方法必须是public的JDK 1.8时
,接口中的方法可以是public的,也可以是default的JDK 1.9时
,接口中的方法可以是private的
- 抽象类
-
JVM内存五大区域
虚拟机栈(VM Stacks)
-> 包含栈帧(Frame)
本地方法栈(Native Method Stack)
PC寄存器(Program Counter Register)
方法区(Method Area)
堆(Heap)
-
抽象类和接口的区别
- 抽象类中可以有构造方法,接口中不能有构造方法
- 抽象类中可以有普通成员变量,接口中没有普通成员变量
- 一个类可以实现多个接口,但只能继承一个抽象类
Spring
- AOP和OOP的区别
面向方面编程 AOP
偏重业务处理过程的某个步骤或阶段,强调降低模块之间的耦合度,使代码拥有更好的移植性,AOP 的一个很重要的特点是源代码无关性
面向对象编程 oop
则是对业务分析中抽取的实体进行方法和属性的封装
- 在Spring框架中获取连接池可以有哪些方式
DBCP数据源
、C3P0数据源
、Spring的数据源实现类(DriverManagerDataSource)
、JNDI数据源
数据库
- 数据库的备份命令
mysqldump
- 数据库系统的体系结构是
三级模式结构和两级映象
- 三级模式包括:
概念模式
,外模式
,内模式
- 外模式 又称子模式、用户模式 一个数据库
可以有多个外模式
- 内模式 又称 物理模式或存储模式,一个数据库
只有一个内模式
- 外模式 又称子模式、用户模式 一个数据库
- 两级映像包括
外模式/模式映像
、模式/内模式映像
- 三级模式包括:
- 有
with check
选项时修改数据需满足视图的选择条件,而无with check
时就无需满足 - 视图是基于数据表的一种
查询窗口
,不能新建 - 主键必须非空
between
包括上下边界值
WHERE G BETWEEN 60 AND 100
==WHERE G>=60AND G < =100
数据库完整性
是指数据库中数据在逻辑上的一致性
、正确性
、有效性
和相容性
- 数据库事务的ACID
- 原子性(ATOMIC) :(事务管理子系统)整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节
- 一致性(Consistency) :(完整性子系统)在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
- 隔离性(Isolation):(并发控制子系统)两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时中间某一时刻的数据
- 持久性(Durability):(恢复管理子系统)在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
- 数据库中使用
drop
删除表,delete
用于删除表中的数据 SELECT..INTO...FROM
语句将现有表中的数据插入到新表中- 存储过程语句
create procedure
:创建存储过程exec procedure
:执行存储过程alter procedure
:修改存储过程drop procedure
:从数据库中删除过程
数据库管理系统
是数据库的核心位置- 数据库网状模型
- 允许一个以上的结点无双亲
- 一个结点可以有多于一个的双亲
- 有两个数据库表,父表和子表之间是
一对多
的联系,为控制子表和父表的关联,可以设置"参照完整性规则",为此要求这两个表在父表连接字段上建立主索引,在子表连接字段上建立普通索引
联系不能脱离实体
,必须有实体连接且可以是实体的自身联系- 将E-R图转换为关系数据库模型的过程属于
逻辑设计阶段
- 数据库文件扩展名
- 数据库文件的扩展名为
.DBC
- 数据表文件的扩展名为
.DBF
- 表单文件的扩展名为
.SCX
- 项目文件的扩展名为
.PJX
- 数据库文件的扩展名为
- 数据库索引
- 优点
- 通过创建
唯一性索引
,可以保证数据库表中每一行数据的唯一性
- 可以大大
加快数据的检索速度
加速表和表之间的连接
- 使用分组和排序子句进行数据检索时,可以显著减少出啊寻中分组和排序的时间
- 通过使用索引,在查询的过程中使用优化隐藏器,
提高系统的性能
- 通过创建
- 缺点
- 创建和维护索引需要
耗费时间
- 索引需要
占用物理空间
- 当对表中的数据进行增加、删除和修改的时候,
索引需要动态维护,降低了数据维护的速度
- 创建和维护索引需要
- 优点
- 数据库中的通配符
%
可以表示零个、一个、多个字符
- 数据库约束
NOT NULL
:用于控制字段的内容一定不能为空(NULL)UNIQUE
:控制字段内容不能重复,一个表允许有多个 Unique 约束PRIMARY KEY
:也是用于控制字段内容不能重复,但它在一个表只允许出现一个FOREIGN KEY
:预防破坏表之间连接的动作,FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一CHECK
:用于控制字段的值范围DEFAULT
:用于设置新记录的默认值
- 在 Access 中,如果要在某个字段中存放图像,则该字段类型为
OLE类型
- 3NF
消除主属性对码的部分和传递函数依赖
规范化为BCNF - SQL Server 编程中,可使用
BEGIN-END
将多个语句捆绑