Java知识点总结
Java知识点总结
1. 基本数据类型
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
byte | short | int | long | float | double | boolean | char |
8位 | 16位 | 32位 | 64位 | 32位 | 64位 | 1位 | 16位 |
2. 装箱和拆箱
装箱:Integer i = 1;
实际操作 Integer i = Integer.valueof(1)
拆箱:Integer i =1; int j = i;//即为拆箱
3. == 和equals区别
== 用于比较两个变量是否相等,基本数据类型直接比较,引用类型比较首地址(栈中)。
equals用于比较对象的某些属性是否相等,只有引用类型有(因为引用类型继承与Object类型),基本数据类型没有该方法。
4. String和StringBuilder的区别以及StringBuffer和StringBuilder的区别
String是内容不可比那的字符串,String底层使用了一个不可变的字符数组(final char[])
而StringBuilder StringBuffer,是内容可以改变的字符串。StringBuilder StringBuffer底层使用的是可变的字符串数组(没有使用final来修饰)
- 最经典的就是拼接字符串。
1、String进行拼接。String c = “a”+ “b”;
2、StringBuilder或者StringBuffer StringBuilder sb = new StringBuilder();sb.append(“a”).append(“b”)
结论
- 拼接字符串不能使用String进行拼接,,要使用StringBuilder或者StringBuffer
- StringBuilder是线程不安全的,效率高,StringBuffer是线程安全的,效率低。
5. Java中的集合
Java中的集合分为value,key---->value(collection,Map)两种
- 存储值分为List和Set
- List是有序的,可以重复的。
- Set是无序的,不可以重复的。根据equals和hashcode判断。也就是说,如果一个对象要存储再Set中,必须重写equals和hashCode方法。
- 存储kkey-value的为map。
6. ArrayList和LinkedList区别
List分为ArrayList和LinkedList.区别和使用场景?
ArrayList底层使用的是数组,LinkedLIst使用的是链表。
数组查询具有所有查询特定元素比较快,而插入和删除元素比较慢。(因为数组在内存中是一块连续的内存)
链表不要求内存是连续的,在当前元素中存放下一个或者上一个元素地址,查询时需要从头部开始,一个一个的找,故查询效率低。插入时不需要移动内存,只需要改变引用指向,所以删除,插入效率高。
7. HashMap和HashTable的区别。HashMap和ConcurrentHashMap的区别
-
- HashMap和HashTable都可以使用来存储key—>value的数据。
-
- HashMap可以把null作为key或者value的,而HashTable时不可以的。
-
- HashMap时线程不安全的,效率较高,而HashTable时线程安全的,效率较低。
?我想线程安全,又想效率高。
通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
8. 实现一个拷贝文件的工具类使用字节流还是字符流?
我们拷贝的文件不确定是只包含字符流,有可能有字节流(图片,声音,图像等),为了考虑通用性,需要使用字节流。
9. 线程的几种实现方式?
-
实现方式
- 1.通过继承Thread实现一个线程
-
- 通过实现Runnable接口实现一个线程。
继承扩展性不强,java总支持单继承,如果一个类继承Thread就不能继承给其他类了。
- 通过实现Runnable接口实现一个线程。
-
怎么启动?
- Thread thread = new Thread(继承了Thread的对象/实现了Runnable的对象),thread.setName(“设置一个线程名称”); thread.start(),启动线程使用start方法,而启动以后执行run方法。
-
怎么区分线程?
在一个系统中有很多线程,每个线程都会打印日志,我想区分是哪个线程打印的怎么办?
解决:thread.setName(“设置一个线程名称”);这是一种规范,在创建线程完成后,都需要设置名称。 -
有没有使用线程池?线程并发库?
答:简单了解过。
创建线程池方法:
Java通过Executors提供四个静态方法创建线程池,分别为:
线程池的作用:
1,限定线程的个数,不会导致线程过多而导致系统运行缓慢或崩溃。
2,线程池不需要 每次都去创建或者销毁,节约了资源。
3,线程池不需要每次都去创建,响应时间更快。
连接池也是一样。
10.什么是设计模式?常用的设计模式有哪些?
设计模式就是经过前人无数次的实践总结出的,在设计过程中可以反复使用的、可以解决特定问题的设计方法。
- 单例:
饱汉模式
package javaTest;
public class PersonFactory {
//构造方法私有化
private PersonFactory() {
}
private static PersonFactory instance = new PersonFactory();
//提供方法获取
public static PersonFactory getInstance() {
return instance;
}
public static void main(String[] args) {
PersonFactory.getInstance().toString();
}
}
饥汉模式
package javaTest;
public class PersonFactory {
//构造方法私有化
private PersonFactory() {
}
private static PersonFactory instance = null;
//提供方法获取 进行同步
public synchronized static PersonFactory getInstance() {
if(instance == null)
instance = new PersonFactory();
return instance;
}
public static void main(String[] args) {
PersonFactory.getInstance().toString();
}
}
1、构造方法私有化,让除了自己类中能创建外,其他地方都不能创建。
2、在自己类中创建一个单实例(饱汉模式是一出来就创建单实例,而饥汉模式需要的时候才创建)
3、提供一个方法获取该实例对象(创建时需要进行方法同步)
- 工厂模式:SpringIOC就是使用了工厂模式
对象的创建交给一个工厂去创建一个功能。 - 代理模式:Spring AOP就是使用动态代理
- 包装模式
11 讲一下http get和post请求的区别。
GET和POST请求都是http的请求方式,用户通过不同的http请求方式完成对资源(url)的操作,GET,POST、PUT、DELETE、就对应着这个资源的查,该,增,删,具体点讲GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
区别:
1、get请求会在地址栏显示出来,而post请求不会在地址栏显示出来。而POST提交,地址栏不会改变。
2、传输数据的大小。get方式会因为地址栏的长度限制而限制传输数据的大小,而post不会。
3、安全性。post安全性比get安全性高。
12 说一下你对servlet的理解?或者servlet是什么?
Servlet,是用Java编写的服务器端程序,而这些Servlet都要实现Servlet这个接口。其主要功能在于交互式地浏览和修改数据,生成动态web内容。Sevlet运行支持Jaa地应用服务器中。
HttpServlet重写doGet和doPost方法,或者你也可以重写service方法完成对get和post请求地响应。
13 简单说一下servlet地生命周期?
servlet有良好地生存期地定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口地init,service和destroy方法表达。
Servlet启动时,开始加载servlet,生命周期开始,Servlet 被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定讲实例销毁的时候,调用destroy方法。
加载Servlet的class---->实例化Servlet----->调用Servlet的init完成初始化---->响应请求(Servlet的service方法)------>Servlet容器关闭时(servlet的destroy方法)
14 Servlet API中forward()与redirect()的区别
1、forward是服务器端的转向,而redirect是客户端的跳转
2、使用forward,浏览器中的地址不会改变,而redirect会发生改变。
3、forward是一次请求中完成,而redirect是重新发起请求。
4、forward是在服务器端完成,而不用客户端重新发起请求,效率较高。
15 JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP是Servlet技术的扩展,所有的jsp文件都会被翻译为一个继承HttpServlet的类,也就是说,jsp最终也是一个Servlet,这个servlet对外提供服务(相同点,联系)。
Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件,JSP侧重于视图,Servlet主要用于控制逻辑。
16 jsp有哪些内置对象?作用分别是什么?分别有什么方法?
jsp传递值:request,session,application,cookie也能传值。
17 session 和cookie的区别
相同点:两者都是会话跟踪技术。Cookie通过在客户端记录信息,确认用户身份,Session通过在服务器端记录信息,确认用户身份,但是Session的实现依赖于Cookie,sessionId(session的唯一标识需要存放在客户端)
cookie和session的区别:
cookie数据存放在客户浏览器上,session放在服务器上。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全,应当使用session
3、session会在一定时间内保存在服务器上,当访问增多,会比较占用服务器性能,考虑到减轻服务器性能,应该使用COOKIE。
4、单个cookie保存的数据不能超过4k,很多浏览器限制一个站点最多保存20个cookie.
建议:
将登陆信息放在SESSION,其他信息如果需要保留,放在COOKIE中(比如购物车),但是cookie可以在客户端禁用的,这时候我们要使用cookie+数据库的方式实现,当从cookie中不能取到数据时,就从数据库取。
18 MVC的各个部分都有哪些技术来实现
M(Model)模型 javabean
V(View) 视图 jsp html volicity freemaker
C(Controler)控制器 Servlet,Action,
Jsp+Servlet+javabean最经典的mvc模式,实际上就是model2的实现方式,就是把视图和逻辑隔离开来。
Model1的方式: jsp+dao
Model2的方式: jsp+servlet+service+dao
使用struts2和springmvc这样的框架后,我们就变成jsp+核心控制器+action+javabean
19 数据库分类以及常用的数据库
分类分为关系型数据库和非关系型数据库
关系型包括:mysql,oracle,Sql server
非关系型数据库:redis,hadoop,MongodDb,memcached
20 数据库三范式
2NF的前提是1NF,3NF的前提是2NF.
1NF:每列数据不可分割,是最小的一列(即不能在一列上,再列两个属性出来)
2NF:所有的属性都属于一个主键,即每个表里面有唯一个主键。
3NF: 属性只依附于一个主键,不再出现其他的表中,避免数据冗余。
21 事务的三大特征ACID
A:原子性,是最小的单位,要么都发生,要么都不发生。
C:一致性,一起成功,失败时数据要回滚。
I: 隔离性,各个事务之间互不干扰。
D:持久性,保存在数据库中的更改便永久的在数据库中了。
22 mysql数据库的默认最大连接数?
为什么需要最大连接数?特定服务器上的数据库只能支持一定数目同时连接。这时候需要我们设置最大连接数(最多同时服务多少连接),在数据安装时都会有一个默认的最大连接数(100)。
23 mysql分页和oracle分页
mysql使用关键字limit来进行分页limit offset ,pageSize.
oracle大概就是使用三层嵌套查询。
24 触发器的使用场景
触发器,需要有触发条件,当条件满足以后,做什么操作。
比如:校内网,facebook,发一个日志时,自动通知好友。
其实就是在增加日志后做一个触发,再向通知表中写入条目,故触发器效率高。
触发器举例
DELIMITER $
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2); #函数CONCAT可以将字符串连接
INSERT INTO logs(log) values(s1);
END $
DELIMITER ;
在users表中增加一条数据时,向logs表中增加一条记录
logs表
CREATE TABLE `logs` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`log` varchar(255) DEFAULT NULL COMMENT '日志说明',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表';
CREATE TABLE `users` (
`uid` int(50) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8
25 存储过程优点
- 1.复杂的业务逻辑需要多条SQL语句。
- 2.安全性高
26 jdbc调用存储过程
-
贾琏欲执事
- 加载驱动:class.forName(“驱动”);
- 获取连接: cn = DriverManager.getConnection()
- 设置参数: CallableStatement cstmt = cn.prepareCalll("{call insert_student(?,?,?)}")
cstmt.registeOutParameter(3,Type.INTEGER);
cstmt.setString(1,“wangwu”);
cstmt.setInt(2,24); - 执行: cstmt.execute()
- 释放连接 :
27简单说一下对jdbc的理解
Java database connection, java数据库连接,数据库管理系统(mysql,oracle)很多,每个数据库管理系统支持的命令是不一样的。
Java只定义接口,让数据库厂商自己实现接口,对于我们而言,只需要导入对应产商开发的实现即可,然后以接口方式进行调用(mysql+mysql驱动(实现)+jdbc)
28 写一个简单的jdbc的程序。写一个访问oracle数据的jdbc程序
- 贾琏欲执事
- 加载驱动:class.forName(“com.mysql.jdbc.Driver,oracle.jdbc.driver.OracleDriver”);
- 获取连接: cn = DriverManager.getConnection(url,username,password)
- 设置参数: Statement,preparedStatement 先设置。
csmt.setXXX(index,value); - 执行: executeQuery();executeUpdate();
- 释放连接(释放连接要从小到大,必须放到finally) :
29 JDBC中的PreparedStatement相比Statement的好处。
- 可读性高和可维护性
- 安全性高
- PreparedStatement是预编译的,比Statement速度快。
package javaTest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class mainTest {
public static void dbCon() {
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";;
String username = "root";
String password = "123456";
Connection con = null;
Statement st = null;
PreparedStatement ps = null;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
con = DriverManager.getConnection(url,username,password);
String sql = "select * from users";
// statement使用
//st = con.createStatement();
//ResultSet rs = st.executeQuery(sql);
//preparedStatement使用
ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(st != null) {
st.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
mainTest.dbCon();
}
}
30 数据库连接池的作用
1、限制数据库连接的个数,不会导致由于数据库连接过多而导致系统运行缓慢或奔溃。
2、数据库连接不需要每次读取创建或者销毁,节约了资源。
3、数据库连接不需要每次读取创建,响应时间更快。
下一篇: Java知识点总结(四)泛型和集合
推荐阅读
-
CSV文件导入mysql PHP处理CSV表格文件的常用操作方法总结
-
ant编译java报“非法字符: \65279 ”错误的解决方法 z
-
.net MVC 连接数据本地数据库三种方法总结
-
Java的参数传递是「按值传递」还是「按引用传递」?
-
安装ssl证书后报错Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
-
java获取文件的mime,java获取文件是不是文本,java获取文件类型(非后缀方式)
-
【JAVA设计模式】- 建造者模式
-
Java中静态代码块、构造代码块、构造函数、普通代码块
-
01 java 基础:jdk jre path classpath 相关问题
-
Java的内存溢出