一、理论知识背诵汇总篇
1、Java常用类
- System类
- Date类(日期类)
- DateFormat类(日期格式化类)
- SimpleDateFormat类
- Math类
- Random类
- BigInteger(大整数)类
- BigDecimal(大小数)类
- Timer定时器
2、枚举(将类的对象固定下来)
只能使用它的对象,而不能增加和修改枚举的属性
3、单例模式
一个类中只允许产生唯一的一个对象
3.1 实现步骤:
- 定义一个属性,保存当前类的静态对象(单例对象)
- 将构造方法私有
- 创建一个静态get()方法返回这个单例对象
(1)懒汉模式:创建实例的过程在get()方法中
- 优点:使用的时候才创建实例,避免内存浪费
- 缺点:线程不安全,无法保证绝对的单例
(2)饿汉模式:直接在属性中实例化,类加载的时候单例对象就准备好了 - 优点:线程安全,执行效率高
- 缺点:不需要的时候也会创建实例,会导致内存浪费
4、字符串
4.1 包装类
装箱:将基本数据类型转换为包装类型
拆箱:包装类转基本数据类型
基本类型->包装类型:
- byte -> Byte
- short -> Short
- int- > Integer
- long -> Long
- float -> Float
- double -> Double
- char -> Character
- boolean -> Boolean
4.2 正则表达式
4.3 StringBuffered和StringBuilder
5、集合框架
1、集合和数组的区别:
- 集合存放对象,数组存放基本类型数据
- 集合数据可以是不同类,数组数据是同类型
- 集合可修改,数组不可修改
2、List、Set、Map区别
(1)List集合:有序可重复
- ArrayList:
- 读取快,增删慢;
- 线程不安全;
- 初始大小是10,扩充时扩充50%
- LinkedList
- 读取慢,增删快;
- 线程不安全;
- 没有扩容机制,使用首尾添加操作addFirst()和addLast()
- Vector
(2)Set集合:无序不重复
- HashSet:散列存放,无序
- TreeSet:有序存放,自然排序
hashCode:散列码是由对象导出的一个整型值。散列码是没有规律的。类的hashCode()方法继承自Object类,因此每个对象都有一个默认的散列码,他的值为对象的存储地址(由对象的物理存储地址通过散列转换来的)
HashSet原理:
存对象时,首先取得hashCode值与hash表的值比较;如果不存在则可以存入集合并把hashCode存入hash表中;
否则通过“==”和equals()方法判断跟集合中的对象是否为同一对象,都为false才能添加成功。
TreeSet原理:
存放时调用CompareTo()方法,根据返回值比较元素大小,然后进行“升序”排列。
(3)Map集合:以键值对形式存储数据
- HashMap、HashTable、TreeMap的区别:
- HashMap:
- 线程不安全;
- 无序;
- 允许Key出现一次null,Value允许null;
- HashTable:
- 线程安全;
- 无序;
- Key和Value都不允许null;
- TreeMap:
- 线程不安全;
- 自然升序;
- Key不允许null,Value允许null;
3、Iterator迭代器
迭代器:不管索引和类型都能够将类型遍历出
迭代器实现步骤:
- 使用iterator()方法要求容器返回一个Iterator
- 调用next()从第一个往后获取序列的元素
- 使用hasNext()检查是否还有元素
- 使用remove()方法将迭代器新返回的元素删除
泛型:定义那些还不明确的参数类型
6、IO流
7、数据库操作
1、查询:
select * from stu;
2、增加:
insert into stu(id,name,age,sex) Values(1003,”王五”,13,”女”);
3、删除:
delete from stu where name=”李四”;
4、更新/修改:
update stu set name=”张三” where id=1001;
5、模糊查询:
select * from stu where name like ‘%李%’
6、分组查询:
select * from stu group by age;(按年龄分组)
7、集合函数:常与group by一起使用
- count():统计记录数
- sum():求和
- avg():平均值
- max():最大值
- min():最小值
8、连接查询
- 内连接:inner join
Select * from stu inner join class On stu.class.id=class.id;
- 左外连接:left join
Select * from stu Left join class On stu.class.id=class.id;
- 右外连接:right join
Select * from stu Right join class On stu.class.id=class.id;
8、JDBC连接数据库
连接数据库:
- 加载JDBC驱动
- 连接数据库,传入连接地址、用户名、密码
- 关闭连接资源
9、Web开发和服务器(Tomcat服务器)
1、Tomcat服务器:
将项目部署到Tomcat中,启动项目,用户就可以访问了。
2、部署项目:
要将java项目装成war包拷贝到webapps中即可
10、Servlet技术
1、作用:
使用Servlet,可以收集来自网页的用户输入,呈现来自数据库或者其他源的纪录,还可以动态创建网页。
2、一个类继承HttpServlet就成了一个Servlet
3、Servlet主要任务:
- 读取客户端发送到后台的数据
- 处理数据并生成结果。这个过程可能访问数据库,也可以直接计算得出对应的响应
- 发送响应数据到客户端
4、Cookie:
定义:由服务端产生,再发送给客户端保存的一组数据
作用:客户端访问服务端,第一次访问结束后,就会产生一个Cookie,把这个Cookie保留到客户端,下次可以直接访问
5、Session:
定义:由服务端产生的一组数据用于会话跟踪,保存在服务端
6、Cookie和Session比较
- 存储位置不同:
- Cookie的数据信息存放在客户端浏览器上;
- Session的数据信息存放在服务器上。
- 存储容量不同:
- 单个Cookie保存数据<=4KB;
- Session没有上限。
- 存储方式不同:
- Cookie只能保管ASCII字符串;
- Session可存储任何数据。
- 隐私策略不同:
- Cookie对客户端可见,不安全;
- Session存储在服务器上,不存在敏感信息泄露风险。
- 生命周期不同:
- Cookie在设置的有效期内,无论是否关闭窗口都依然存在;
- Session关闭窗口就会失效。
7、请求转发和重定向:
定义
请求转发: servlet将客户端请求直接交给另一个servlet或某个页面
重定向: servlet设置客户端重新发送一个新请求到另一个servlet或某个页面
请求转发和重定向的区别
- 请求转发是一次请求,重定向是两次请求
- 请求转发可以共享请求参数,重定向之后就获取不了共享参数了
11、JSP技术(动态网页开发技术)
1、jsp通过网页表单获取用户输入数据、访问数据库或其他数据源,然后动态地创建网页
2、Servlet与Jsp的区别:
- Servlet:在java代码中嵌套html
- Jsp:在html中嵌套java代码(本质上是servlet)
3、JSP语法结构:
三种形式结构:
- JSP脚本:<%java 代码%>
编写具体业务逻辑,也可以定义局部变量或调用方法,但不能定义方法 - JSP声明:<!java 代码>
声明全局变量或方法 - JSP表达式:<%=java 变量或表达式%>
将已经声明的变量或表达式输出到网页上
4、JSP指令:设置与整个JSP页面相关的属性
- <%@page...%>:定义页面的依赖属性(引入java类...),写在jsp开头
- <%@include... %>:包含其他文件,一般是其他前端页面
- <%@taglib...%>:引入标签库的定义,可以使自定义标签
5、JSP四大作用域
- Page(页面作用域):代表当前网页,只在当前页面有效
- request(请求作用域):在当前请求中有效
- session(会话作用域):在当前会话中有效,浏览器关闭则失效
- application(应用程序作用域):在服务器开启期间都有效
除page外,其他对象都可以通过setAttribute赋值和getAttribute取值。
6、EL表达式:获取作用域中的数据(取值)
语法:${作用域名+Scope.数据的属性名}
例:${requestScope.name}——request中的数据
7、JSTL标准标签库:对集合进行遍历
核心标签库:
- <c:if>:和if语句一样
- <c:forEach>:基础迭代标签
- <c:choose>:相当于if
- <c:when>:条件
- <c:otherwise>:相当于else
12、多线程
1、并发执行和并行执行:
- 并发执行:多个进程使用同一个CPU,每个进程独占CPU一会,然后让出CPU资源,给其他进程使用
- 并行执行:多个进程,在同一时刻,每个进程都有一个CPU进行运算
2、进程和线程
- 进程:程序的一次动态执行过程
- 线程:是CPU调度和分派的基本单位,可与同一个进程的其他线程共享资源
进程和线程的关系:
- 进程的产生,肯定会产生至少一个线程
- 进程关闭,该进程内所有线程全部销毁
- 线程销毁,进程未必会关闭
3、多线程:一个进程内的多个任务并发执行
多线程的实现:
- 继承Thread类,重写run()方法
- 实现Runnable接口,实现run()方法
4、线程同步(同步指协同、协助、互相配合):
定义:当有一个线程对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作
5、用synchronize给对象加互斥锁的两种实现方式:
- 给代码块加锁(锁定对象)
- 给方法加锁(锁定方法实现的过程)
6、线程死锁:不同的线程都在等待那些根本不可能被释放的锁
避免死锁技巧:保证每个线程都按照同样的顺序去访问资源
13、网络编程
1、socket(套接字)使用TCP提供了两台计算机的通信机制。
当连接建立时,服务器会创建一个socket对象。客户端和服务器可以通过socket对象的写入和读取进行通信
2、socket通信三种模式:
- 流式套接字:提供一个面向连接,可靠的数据传输服务,数据无差错,无重复发送,且按发送顺序接收(TCP:传输数据前要先建立连接)
- 数据报式套接字:面向无连接,数据报以独立形式发送,不提供无差错保证,数据可能丢失或重复,接受顺序无序(UDP:不用建立连接)
- 原始式套接字:允许对较低层次协议,如IP直接访问
3、IP地址:计算机的唯一标识号
端口号:不同的应用程序通过端口号区分
4、TCP协议(客户端、服务端)的三次握手过程:
-
客户端向服务端发出连接请求,等待服务器确认
-
服务器向客户端回送一个响应,通知客户端收到了连接请求
-
客户端再次向服务器发送连接确认信息,确认连接
5、UDP通信和TCP通信
- UDP通信(发送端、接收端):
DatagramPacket:封装UDP通信中的数据 - TCP通信(客户端、服务端):
ServerSocket类:表示服务器端
Socket类:表示客户端
6、TCP和UDP的一个主要区别:
UDP只有发送端和接收端,不区分客户端和服务器端,计算机之间可以任意发送数据;
TCP严格区分客户端和服务器端,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器不可以主动连接客户端
14、反射
1、反射:
定义:对于任意一个类,都能够通过对象等信息知道这个类的所有属性和方法
2、相关实现类:
- Class类:反射的核心类,获取类的属性方法等成员信息
- Field类:获取和设置类中属性
- Method类:调用类的方法
- Constructor类:调用类的构造方法
3、获取类信息的三种方法
- 通过对象名获取类信息
- 通过类名获取类信息
- 通过路径获取类信息
15、垃圾回收机制(回收垃圾对象所占用的内存空间):
- 调用System类的gc()静态方法:System.gc()
- 调用Runtime对象的gc()实例方法:Runtime.getRuntime.gc()