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的区别

    1. HashMap和HashTable都可以使用来存储key—>value的数据。
    1. HashMap可以把null作为key或者value的,而HashTable时不可以的。
    1. HashMap时线程不安全的,效率较高,而HashTable时线程安全的,效率较低。
?我想线程安全,又想效率高。

通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。

8. 实现一个拷贝文件的工具类使用字节流还是字符流?

我们拷贝的文件不确定是只包含字符流,有可能有字节流(图片,声音,图像等),为了考虑通用性,需要使用字节流。

9. 线程的几种实现方式?

  • 实现方式

    • 1.通过继承Thread实现一个线程
      1. 通过实现Runnable接口实现一个线程。
        继承扩展性不强,java总支持单继承,如果一个类继承Thread就不能继承给其他类了。
  • 怎么启动?

    • 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、数据库连接不需要每次读取创建,响应时间更快。

版权声明:本文为pan_xi_yi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pan_xi_yi/article/details/90216374

智能推荐

运用for语句来判断数组中值得大小

总结: 1将if语句与数组联合起来判断输入中各组中的最大最小值; 2注意:定义的数组数量是躲多少就要输入多少组数据,少输入就无法输出;...

Bridging signals

Bridging signals Time Limit: 1000MSMemory Limit: 10000K Total Submissions: 10926Accepted: 5982 Description 'Oh no, they've done it again', cries the chief designer at the Waferland chip factory. Once ...

一天一大 leet

一天一大 leet 题目(难度:困难): 示例 抛砖引玉 官方答案 高手在民间 菜鸡的自白 20200606 题目(难度:困难): 给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例 示例 抛砖引玉 要求算法的时间复杂度为 O(n),即限制了只能循环一次; 先对数组排序 循环数组记录后一个元素等于前一个元素+1或者等于前一个元素的数量 满足条件++,不然重...

Tensorflow实现的CNN文本分类

https://blog.csdn.net/somtian/article/details/69359498 原博文, github 在这篇文章中,我们将实现一个类似于Kim Yoon的卷积神经网络语句分类的模型。 本文提出的模型在一系列文本分类任务(如情感分析)中实现了良好的分类性能,并已成为新的文本分类架构的标准基准。 本文假设你已经熟悉了应用于NLP的卷积神经网络的基础知识。 如果没有,建议...

JDBC新手入门教程

开发工具:idea 数据库:mysql jar包:junit-4.10 mysql-connector-java-8.0.18 junit-4.10下载 mysql-connector-java-8.0.18下载 注意1:jdbc的驱动因为使用的是mysql-connector-java-8.0.18,所以为(“com.mysql.cj.jdbc.Driver”),而不是(...

猜你喜欢

Lua 排序 table.sort

    正如C#中有Array.Sort(),lua中也有自己的排序方法即table.sort(table,function)。     lua中的排序默认是从大到小的排序;     传入一个方法参数,可以使排序从小到大; 打印结果:  ...

SURF算法简述及Python标记SURF特征检测实践

目录 一、SURF算法 1.算法简介 2.SURF与SIFT的具体差异 二、Python代码实践 1.测试环境 2.测试代码 3.核心函数 4.测试结果 一、SURF算法 1.算法简介 SURF(Speeded-Up Robust Features)加速稳健特征,是一种稳健的局部特征点检测和描述算法。 SURF是对SIFT算法的改进,该算子在保持 SIFT 算子优良性能特点的基础上,同时解决了 S...

Selenium3自动化测试——19.读取数据文件

1. 实现目标 在测试与开发中,经常需要对文件进行各种读取操作。这里介绍针对txt、csv、xml、json文件的读取。 2. 读取TXT文件 2.1 user_info.txt文件 2.2 读取txt文件.py 2.3 实现结果 3. 读取csv文件 3.1 user_info.csv  这里要注意,csv文件本身打开是utf-8的,而不是乱码 3.2 读取csv文件.py 这里,针对...

Flask 介绍

Flask 学习笔记 一、Flask 简介         Flask 是一款非常流行的 Python Web 框架,出生于 2010 年,作者是 Armin Ronacher,本来这个项目只是作者在愚人节的一个玩笑,后来由于非常受欢迎,进而成为一个正式的项目。         Flask 自2010年发布第一个版本以...

Java实现十大排序算法,配合动态图片

Java实现排序算法 其中不理解时间复杂度得可以看一下我的时间复杂度的文章,有助于理解 十大排序算法 1、冒泡排序 2、选择排序 3、插入排序 4、希尔排序 5、归并排序 6、快速排序 7、堆排序 8、计数排序 9、桶排序 10、基数排序 代码git地址:https://github.com/gaoyeming/sort-algorithm.git 排序算法说明 1,排序的定义 对一序列对象或者数...