java 理论知识随记

理论知识整理(比较杂)

1、Linux命令:
pwd:用于显示当前工作目录
ls:用于查看当前工作目录内容
cd:用于改变当前工作目录
ps -ef|grep java/tomcat :查看tomcat是否启动或关闭
tail -f -n 1000 catalina.out :查看日志

2、Java虚拟机:平台无关的编程语言
Java虚拟机是一个可以执行Java字节码的虚拟机进程。
Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台。

3、JDK、JRE、JVM关系
JDK:Java开发工具包,包含编写Java程序所必须的编译运行等开发工具以及JRE。
(工具如:javac命令、Java命令、JAVAdoc、打包jar命令)
JRE:Java运行环境,包含Java虚拟机、类库等。
JVM:Java虚拟机,提供了字节码文件(.class)的运行环境支持。

4、Java支持的数据类型
基本数据类型:
整数值型:byte、short、int、long
字符型:char
浮点类型:float、double
布尔型:boolean

5、引用类型
引用类型声明的变量是指该变量在内存中实现存储的是一个引用地址,实体在堆中
包括String、类、接口、数组、包装类等

6、自动拆装箱
自动装箱和拆箱就是基本类型和引用类型之间的转换。

7、面向对象四大特性
抽象:属性(数据)和操作(行为)
封装:封装可以使类具有独立性和隔离性,保证类的高内聚
继承:类的继承和接口的实现
多态:三要素:继承、重写、父类引用指向子类对象

8、&和&&的区别
&:按位与、逻辑与
&&:短路与(左边false,右边直接短路不进行运算)

9、值传递和引用传递
值传递:对形参修改不影响实参
引用传递:会影响实参
String、Integer、Double等可理解为值传递

10、是否可以在static环境中访问非static变量
不能。
static变量在Java中属于类,在类的实例中,它的值都是一样的。
在类被jvm载入时,静态变量的值就确定了。
非static变量属于实例,要在new一个实例之后,值才存在。
在static环境中访问非static变量,可能这个变量还不存在,会报错。

11、方法覆盖(重写)Overriding和方法重载Overloading
重写:子类重新定义父类方法(重写方法必须与被重写方法具有相同的方法名称、参数、返回类型等)
重载:同一个类中多个方法名相同但是参数(个数、类型)不同,返回类型可相同可不同。

12、Java支持多继承吗?
Java中,类不支持多继承,只支持单继承。
Java中,接口支持多继承。

13、抽象类和接口的区别
抽象是对类的抽象是一种模板设计,接口是行为的抽象是一种行为的规范。
不同点:
1)一个类实现多个接口,只能继承一个抽象类
2)抽象类可以包含具体的方法,接口的所有方法都是抽象的
3)接口的方法都是public,抽象类的方法public、protected、、
4)抽象类可以定义构造函数,接口不能
5)抽象类可以声明和使用字段,接口不能,但接口可以创建静态的fanal常量

13、内存中的栈、堆、方法区
栈:一个基本数据类型的变量,一个对象的引用,使用栈空间
堆:new的对象则放在堆空间
方法区:

14、手写单例模式(饿汉和饱汉模式)和工厂模式

(1)单例饿汉模式://饿汉式单例类.在类初始化时,已经自行实例化

public class Singleton1 { 
		//私有的默认构造子 
		private Singleton1() {} 
		//已经自行实例化 
		private static final Singleton1 single = new Singleton1(); 
		//静态工厂方法 
		public static Singleton1 getInstance() { 
			return single; 
		} 
	}

(2)懒汉模式://懒汉式单例类.在第一次调用的时候实例化

public class Singleton2 { 
		//私有的默认构造子 
		private Singleton2() {} 
		//注意,这里没有final 
		private static Singleton2 single=null; 
		//静态工厂方法 
		public synchronized static Singleton2 getInstance() { 
			if (single == null) { 
				single = new Singleton2(); 
			} 
			return single; 
		} 
	}

(3)工厂模式:

interface IFactory{ 
		public IProduct createProduct();
	} 
	Class Factory implements IFactory{ 
		public IProduct createProduct(){
			return new Product();
		}
	} 
	Public class client{ 
		Public Static void main (String [] args){
			IFactory factory=new Factory(); 
			IProduct product=factory.createProduct(); 
			product.ProductMethod();
		}
	}	

15、String、StringBuilder、StringBuffer
执行速度:StringBuilder > StringBuffer > String
String:字符串常量,适用于少量的字符串操作的情况
StringBuilder:变量,线程不安全,适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:变量,线程安全,适用多线程下在字符缓冲区进行大量操作的情况

一、JVM知识

1、JVM是什么?其执行程序过程?
Java虚拟机(Java virtual machine),java程序运行的容器;
执行程序过程:A、加载.class文件 B、管理和分配内存 C、执行垃圾收集
2、JRE是什么?
Java运行环境,包含JVM的Java程序运行环境
3、jvm四个常用寄存器
Pc程序计数器;
optop操作数栈顶指针;
frame当前执行环境指针;
vars指向当前执行环境第一个局部变量的指针;
4、Jvm两类存储区
常量缓冲区、方法池
5、Jvm机制
类装载子系统:装载合适的类或接口
运行引擎:执行已装载的类或接口的指令
运行时数据区:主要包括:方法区,堆,Java栈,PC寄存器,本地方法栈
6、简述垃圾回收机制
虚拟机空闲或者当前内存不足时,扫描没有被引用的对象,添加到回收集合,进行回收
7、垃圾收集方法
标记-清除;复制算法;标记-整理;分代收集
8、Java类加载机制
从class文件加载到内存,并对数据进行校验、解析和初始化,最终形成Java类型
9、jdk和jre的区别
a)Jdk:Java开发工具包,包括jre、编译器、JavaDoc、Java调试器等工具
b)Jre:Java运行环境,包括jvm和Java程序所需的核心类库
10、拆装箱
装箱:原始类型转换为对象;拆箱:对象转换为基本类型
11、重写和重载
重写:子类重写父类方法,Java面向对象多态性的体现
重载:一个类中,方法名相同但是参数类型或者个数不同,根据参数类型调用对应参数列表的方法

12、值传递和引用传递
a)值传递:实参拷贝给形参,修改形参数值时,不影响原来实参
b)引用传递:实参是把地址传递给形参,修改数值,就是修改实参
13、String、StringBuffer、StringBuild
a)String:长度不可变,速度最慢
b)StringBuffer:长度可变,线程安全
c)StringBuild:长度可变,线程非安全,速度最快
14、Hash Map和Hash Table区别
a)HashMap基于AbstractMap,key和value允许为null,非同步
b)HashTable基于Dictionary,key和value不允许为null,同步
15、Array和ArrayList、LinkedList
a)Array容纳基本数据类型和对象,指定大小
b)ArrayList容纳对象,大小固定,基于数组实现,查找速度快
c)LinkedList基于链表实现,插入和删除时占优势
16、Java面向对象的四大特性
a)封装
b)抽象
c)继承
d)多态

二、Gradle、Spring boot 、Mybatis、Junit、Spock

1、Gradle
Groovy是一种基于Java平台的面向对象语言
Apache Ivy是一个管理项目依赖的工具
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。
它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。
当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。

软件开发工程管理:依赖,打包,部署,发布,各种渠道的差异管理
Gradle是一种构建工具,它可以帮你管理项目中的差异,依赖,编译,打包,部署
DSL的全称是Domain Specific Language,即领域特定语言,或者直接翻译成“特定领域的语言”
Ant和Maven都是基于XML的构建工具,Gradle是用Groovy编写的构建工具,
Groovy是JVM衍生的与JAVA语法高度兼容的动态强类型语言。

2、Spring boot
Spring 是一个“引擎”
Spring MVC 是基于 Spring 的一个 MVC 框架
Spring Boot 是基于 Spring4 的条件注册的一套快速开发整合包

3、Mybatis
4、Junit
5、Spock

三、问题整合
1、面向对象特征
抽象、封装、多态、继承
2、Java基本数据类型
byte、short、int、float、long、double、boolean、char
3、运行时异常
算术异常(ArithmeticException)、
类转换异常(ClassCastException)、
非法参数异常(IllegalArgumentException)、
下标越界异常(IndexOutOfBoundException)、
空指针异常
4、Java.io包的File类,File类用于目录和文件的创建、删除、遍历等操作,但不能用于文件的读写。
写入为输出流,读取为输入流
5、spring的事务管理
事务必须服从ACID原则;ACID指的是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability);事务其实就是一系列指令的集合。
5.1、原子性:要么全部执行成功,要么全部执行失败回滚
5.2、一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定
5.3、隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
5.4、持久性:当事务正确完成后,它对于数据的改变是永久性的。

四、项目中问题
1、@Value(staticConstructor = “of”)是什么意思?
如果变量不加@NonFinal ,@Value会给所有的弄成final的。
当然如果是final的话,就没有set方法了。

2、前端跨域问题
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。
前端解决跨域问题:将http请求变成一个简单的请求:只能使用get、post或者head;
后端可以设置Access-Control-XXX请求头来允许某个源对其跨域请求。

3、http(超文本传输协议)和https(安全套接字层超文本传输协议)区别
http协议以明文的方式发送内容,不提供任何方式的数据加密。
https协议加入SSL协议(Secure Sockets Layer),SSL协议依靠证书验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要如下:
  a、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  b、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  c、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  d、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

4、TCP与UDP区别
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP(用户数据报协议)是一种无连接、不可靠的传输层协议。
a、TCP提供的是面向连接的、可靠的数据流传输;
UDP提供的是非面向连接的、不可靠的数据流传输;
b、TCP提供可靠的服务,通过TCP连接传送的数据,无差错、不丢失、不重复、按序到达;
UDP尽最大努力交付,即不保证可靠交付;
c、TCP面向字节流;
UDP面向报文;
d、TCP连接只能是点到点的;
UDP支持一对一、一对多、多对一和多对多的交互通信;
e、TCP的逻辑通信信道是全双工的可靠信道;
UDP的逻辑通信信道是不可靠信道;
5、数据库:drop、truncate、delete三者删除的区别
一:用法和区别
drop:drop table 表名
删除内容和定义,并释放空间。执行drop语句,将使此表的结构一起删除。
truncate (清空表中的数据):truncate table 表名
删除内容、释放空间但不删除定义(也就是保留表的数据结构)。与drop不同的是,只是清空表数据而已。
truncate不能删除行数据,虽然只删除数据,但是比delete彻底,它只删除表数据。
delete:delete from 表名 (where 列名 = 值)
与truncate类似,delete也只删除内容、释放空间但不删除定义;但是delete即可以对行数据进行删除,也可以对整表数据进行删除。
二:注意
1.delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。
2.执行速度一般来说:drop>truncate>delete
3.delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。
4.truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发trigger。
5.truncate语句执行以后,id标识列还是按顺序排列,保持连续;而delete语句执行后,ID标识列不连续

==========

HashTable和HashMap

Map 集合中不能包含重复的键 ,但可以包含重复的值

HashMap内部基于哈希表(数组)存储键值对(映射项)。
HashMap是线程不安全的。
HashMap根据键的哈希码值重新计算键值对(映射项)的在哈希表中的位置。
HashMap的key可以为null ,value 也可以为 null 。
HashMap的父类是 AbstractMap 。

Hashtable内部基于哈希表(数组)存储键值对(映射项)。
Hashtable是线程安全的 ( 所有的方法都被 synchronized 关键词所修饰 )。
Hashtable直接根据键的哈希码值确定键值对(映射项)的在哈希表中的位置。
Hashtable的key和value 都不能为null 。
Hashtable的父类是 Dictionary 类。
唯一不一样的是:HashTable为线程安全和key/value不可以为null值

ArrayList和LinkedList

ArrayList 内部借助于数组实现元素的存储。
ArrayList 是线程不安全的,相对于线程安全的Vector来说可能效率较高。
ArrayList 内部基于数组实现数据存储,因此随机访问效率较高。( 可以使用索引直接访问数组中的元素 )
ArrayList 内部基于数组实现数据存储,因此增删元素速度较慢。( 增删元素可能需要挪动数组中大量元素 )

LinkedList 内部基于链表实现元素的存储。
LinkedList是线程不安全的。
LinkedList内部基于链表实现数据存储,因此随机访问效率较低。( 需要逐个遍历链表中的结点 )
LinkedList内部基于链表实现数据存储,因此增删元素速度较快。( 增删元素只需要修改相邻两个节点的指针 )

线程的五种状态:

1、 新建状态:new Thread();
2、 就绪状态:t.starts();等待获得CPU
3、 运行状态:获得CPU,实现run方法
4、 阻塞状态:执行了Thread.sleep方法、发生了IO操作、或者调用了同步锁的外套方法
5、 死亡状态:代码执行完毕。

sleep 和 yield 的区别
  1. sleep 不考虑线程优先级 ( 一个线程睡眠后其它线程都有机会获得CPU ),yield 要考虑线程优先级 ( 仅让位给 跟自己同等优先级或优先级比自己高的线程 )
  2. sleep 可能抛出 InterruptedException ,而 yield 不会抛出异常
  3. sleep 导致运行状态的线程进入到阻塞状态,而 yield 会导致运行状态的线程进入就绪状态
异常处理机制

当程序发生异常时会产生一个代表该异常的对象
同时当前程序会把这个异常对象交给运行时系统
运行时系统根据接受到的异常对象寻找相应代码来处理该异常
处理异常的方式有两种,一种是 捕获异常 ,另外一种是 抛出异常。

受检查异常( checked-exception ) 和 运行时异常 ( runtime-exception ) 的区别

1、运行时异常是指 直接 或 间接 继承了 java.lang.RuntimeException 类的那些 异常类, 而受检查异常 是指从来都没有继承过 java.lang.RuntimeException 类的那些 异常类 。
2、对于受检查异常来说,必须在编译之前就显式书写异常的处理代码,可以是通过 try … catch … finally 语句捕获并处理异常,也可以通过为 相应的方法 添加 throws 声明 来 声明抛出的异常类型。
3、对于运行时异常来说,在编译阶段可以不显式书写任何跟异常处理有关的代码。

受检查异常( checked-exception ) 和 运行时异常 ( runtime-exception ) 的相同点

1、都是异常( 都是 Exception 的子类型,不是 Error 的子类型 )
2、都可以被 捕获 ( try … catch … finally ) 或 抛出 ( throw )

十种常见的异常

IOException
FileNotFoundException
RunnTimeException
ArithmeticException
lllegalArgumentException
ArrayIndexOutOfBoundsException
NullPointerException
ArrayStoreException
ClassCastException
NumberFormatException

Mysql和ORACLE的区别

1、 Oracle是大型数据库而Mysql是中小型数据库 Mysql是开源的而Oracle价格非常高
2、 Oracle支持大并发,大访问量
3、 Oracle也Mysql操作上的一些区别
主键 Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;
Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
4、 单引号的处理 MYSQL里可以用双引号包起字符串,
ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

集合和数组的区别

数组的长度是固定的,而集合长度是可变的
数组值可以存储对象,还可以存储基本数据类型;而集合只能够只能存储对象
数组存储的数据类型是固定的,而集合存储的数据类型不固定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值