河北网站建设费用,论坛网站有哪些,做外贸 需要做网站吗,商务网站建设需要备案吗JAVA
基础
JVM JDK JRE
JVM java虚拟机#xff0c;针对不同的系统#xff0c;使用相同的字节码会给出相同结果。一次编译#xff0c;随处可运行
JDK Java SDK 提供给开发者使用#xff0c;创建和编译Java程序。包含了JRE#xff0c;同时包含了其它工具#xff08;jav…JAVA
基础
JVM JDK JRE
JVM java虚拟机针对不同的系统使用相同的字节码会给出相同结果。一次编译随处可运行
JDK Java SDK 提供给开发者使用创建和编译Java程序。包含了JRE同时包含了其它工具java 源码的编译器 javac 等
JRE Java运行环境包含JVM和基础类库 编译相关
字节码
JVM可以理解的代码叫字节码.class文件只面向虚拟机解决了传统解释性语言效率低的问题又保留了解释性语言可移植的特点。 JIT编译器
.class - 机器码首先加载字节码文件然后解释器逐行解释执行如果代码块经常被调用热点代码JIT在第一次编译后将机器码保存下来下次直接使用。
根据二八定律消耗大部分资源的只有一小部分代码热点代码即JIT需要编译的部分。JIT需要预热达到一定时间和调用频率才会触发JIT分层
AOT
直接将字节码编译成机器码避免预热。但不能根据程序运行情况进一步优化。代码经常更新的话每次都需要重新编译。
编译与解释并存
编译将源代码一次性翻译成可被该平台执行的机器码C开发慢执行快
解释一句一句的将代码解释interpret为机器代码后再执行Python开发快执行慢
Java程序要先经过编译生成字节码再由Java解释器执行
数据类型变量
基本数据类型、包装类型
基本数据类型
整数型byte short int long
浮点数float double
字符char
布尔boolean
包装类型引用类型
包装类型可用于泛型基本类型不行
基本数据类型的局部变量存放于虚拟机栈的局部变量表成员变量放在堆中包装类型属于对象类型放在堆
基本数据类型占用空间小
包装类型不赋值时为null基本数据类型有默认值
基本数据类型 比较真值包装类型 比较地址整型包装类型之间的比较用 equals
包装类型的缓存
整型-128~127、布尔、字符默认创建了缓存数据如 Integer i1 40; 直接使用了缓存中的对象
自动装箱、拆箱
装箱基本类型-引用类型
拆箱引用类型-基本类型
Integer i 10 等价于 Integer i Integer.valueOf(10)int n i 等价于 int n i.intValue()
浮点数计算 及 BigDecimal
精度丢失无限循环的小数储存在计算机会被截断没办法用二进制精确表示
浮点数之间的等值判断基本数据类型不能用 来比较包装数据类型不能用 equals 来判断BigDecimal 可以实现对浮点数运算不丢精度
BigInteger
超过longBigInteger内部用int[]储存任意大小的整型数据
静态变量
static 被类的所有实例共享所有对象共享同一份静态变量节省内存。通常静态变量会被final修饰成常量。
字符常量字符串常量
字符常量相当于一个整型值ASCII可以参加运算字符串常量表示一个地址字符串在内存中的位置
char占两个字节
方法
面向对象三大特性封装、继承、多态
静态方法
静态方法不能调用非静态成员静态方法属于类类加载时分配内存可通过类名直接访问非静态成员属于对象实例化后才能存在。
调用可以使用 类名.方法名 和对象.方法名
只允许访问静态成员
重载重写
重载一个方法根据输入不同处理不同。参数类型、个数、顺序不同返回值修饰符可以不同
重写子类继承父类相同方法覆盖父类方法。参数列表相同返回值、抛出异常范围应该小于等于父类访问修饰符范围大于等于父类两同两小一大
可变参数只能作为最后一个参数重载优先匹配固定参数
面向对象
基础
面向过程过程拆解成一个个方法
面向对象抽象出对象用对象执行方法
对象
实例和引用
new 创建对象实例对象实例在堆内存对象引用在栈内存指向实例
气球和绳子一个实例可有多个引用
对象相等
对象相等内存中内容相等
引用相等指向的内存地址相等
构造方法
没有声明构造方法也可执行默认无参构造
不能重写overwrite但能重载overload
三大特征
封装
对象的状态信息隐藏在内部不允许外部直接访问对象内部信息提供方法给外界。
继承
子类可以增加新的数据或功能也可以用父类的但不能选择性继承。
子类能拥有父类对象的私有属性和方法但无法访问
多态
父类的引用指向子类的实例
Animal animal1 new Dog();对象类型和引用类型间有继承类/实现接口关系
多态不能调用“只存在于子类不存在于父类”的方法
接口抽象类
共同点
不能被实例化可以包含抽象方法都可以使用默认方法default实现类没有提供自己的实现将使用接口中的默认实现方法
区别
接口主要对类的行为约束抽象类强调所属关系一个类只能继承一个类但可以实现多个接口接口中的成员变量只能是 public static final 类型的抽象类成员变量默认default可以在子类重新定义赋值
深拷贝浅拷贝
浅拷贝堆上创建一个新对象原对象内部是引用对象的话会直接复制内部对象的地址即共用一个内部对象
实现Cloneable接口调用父类Object的clone方法
深拷贝完全复制整个对象包括内部对象
序列化和反序列化
public class DeepCopy {public static void main(String[] args) {}// 泛型类型参数必须实现 Serializable 接口public static T extends Serializable T deepClone(T obj) throws IOException, ClassNotFoundException {// 对象写入字节流。序列化// 对象写入字节数组ByteArrayOutputStream outputStream new ByteArrayOutputStream();// 对象序列化写入outputStreamObjectOutputStream objectOutputStream new ObjectOutputStream(outputStream);// 将对象obj写入outputStreamobjectOutputStream.writeObject(obj);// 从字节流读取对象反序列化ByteArrayInputStream inputStream new ByteArrayInputStream(outputStream.toByteArray());ObjectInputStream objectInputStream new ObjectInputStream(inputStream);return (T) objectInputStream.readObject();}
}class User implements Serializable {String name;Address address;public User(String name, Address address) {this.name name;this.address address;}
}class Address {String province;String city;public Address(String province, String city) {this.province province;this.city city;}
}Object
Object常见方法
hashCode: 返回对象的哈希码;
equals: 比较两对象地址是否相等String重写了该方法
clone: 浅拷贝
toString:
wait: 暂停线程
notify、notifyAll: 唤醒线程equals 对于基本类型比较值对于引用类型比较地址本质也是比较值但引用类型变量存的地址
equals 等价于 但一般会重写来比较属性相等
hashCode
获取哈希码确定对象在哈希表中的索引位置
与equals
hashcode和equal都是比较对象是否相等但hashcode效率更高。HashSet对比时同样的哈希码下再用equals。
两个对象hashcode相等不一定对象相等哈希码算法可能重复
重写equals必须重写hashCode
两对象equals相等时hashcode一定相等不然使用hashmap会出现问题无法正确找到对象
如果不重写hashcodeequals按属性值比较hashcode按地址比较
String
String、StringBuffer、StringBuilder
String不可变故线程安全每次改变都会生成一个新的String对象。String中使用final修饰的字符数组来保存字符串。
StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类提供了修改字符串的方法如 append
StringBuffer 对方法加了同步锁线程安全StringBuilder线程不安全
StringBuffer StringBuilder类似代表可变字符序列String不可变效率低复用率高池中存在就不用再创建需要大量修改的话不用StringStringBuffer 效率高线程安全StringBuilder 效率最高线程不安全
字符串拼接
字符串 实际上是通过StringBuilder调用append方法实现String的for循环拼接每次循环创建一个StringBuilder不如直接用StringBuilder拼接效率高。
字符串常量池
JVM为字符串开辟的区域避免重复创建
// 在堆中创建字符串对象”ab“
// 将字符串对象”ab“的引用保存在字符串常量池中
String aa ab;
// 直接返回字符串常量池中字符串对象”ab“的引用
String bb ab;
System.out.println(aabb);// trueintern
String.intern 将指定字符串对象的引用保存在字符串常量池若已保存直接返回该引用
异常 exception error
exception程序本身可以处理的异常可以通过catch捕获
error程序无法处理的错误JVM一般会选择线程终止。内存溢出、虚拟机异常等
checked unchecked
checked没有被catch或throws处理的话没法通过编译如IO异常
unchecked不接受检查也可以正常通过编译由于逻辑错误或环境错误引起如算术错误、空指针
try
try-catch-finally
finally不一定会运行如CPU关闭、线程死亡
泛型
使用方式
泛型类
public class GenericT{泛型接口
public interface GeneratorT {泛型方法 public static E void printArray( E[] inputArray )项目用到
自定义一个与CommonResultT 接口接口中的方法 getData() 中使用类型参数 T 来动态指定结果的数据类型。
public interface CommonResultT {boolean isSuccess();String getMessage();T getData();
}工具类
反射
可以在运行时分析类以及执行类中方法通过反射可以获取任意一个类的所有属性和方法并调用
原理
反射通过编译后的字节码class文件找到其中的信息
应用
在动态代理中invoke函数中使用反射类Method来调用指定方法
注解也用到了反射Value注解就读取到配置文件中的值
优缺点
优点让代码更灵活为框架开箱即用的功能提供便利
缺点安全问题性能略差
获取class对象
class对象将一个类的信息告诉程序
知道具体类
Class alunbarClass TargetObject.class;传入类的全路径 Class.forName
Class alunbarClass1 Class.forName(cn.javaguide.TargetObject);通过对象实例 instance.getClass
TargetObject o new TargetObject();
Class alunbarClass2 o.getClass();注解
常用
Override// 覆盖父类方法
Deprecated
// 标注内容不再被建议使用解析方法
注解解析后才会被使用
编译器直接扫描编译时扫描注解并处理如override运行期间通过反射处理如spring中注解
SPI
服务者提供给框架的使用者的接口运行时动态加载框架。
将服务的接口与具体实现类解耦。
按照规定将要暴露对外使用的具体实现类在固定文件中声明框架在运行时扫描并加载实现类。
APISPI
API实现方提供接口和实现我们调用接口
SPI调用方确定接口规则厂商根据规则实现
优缺点
优点接口设计灵活
缺点需要遍历加载所有实现类效率低
序列化反序列化
序列化将数据结构或对象转换成二进制字节流
反序列化将二进制字节流转成数据结构或对象
目的通过网络传输对象或储存
属于计算机网络的应用层
序列化协议
JDK自带
不想被序列化transient修饰
不推荐原因
不支持跨语言序列化后体积大传输性能差安全问题
Hessian
RPC协议dubbo2.x默认启用序列化协议
JSON
简单易用性能低
集合
服务者提供给框架的使用者的接口运行时动态加载框架。
将服务的接口与具体实现类解耦。
按照规定将要暴露对外使用的具体实现类在固定文件中声明框架在运行时扫描并加载实现类。
APISPI
API实现方提供接口和实现我们调用接口
SPI调用方确定接口规则厂商根据规则实现
优缺点
优点接口设计灵活
缺点需要遍历加载所有实现类效率低
序列化反序列化
序列化将数据结构或对象转换成二进制字节流
反序列化将二进制字节流转成数据结构或对象
目的通过网络传输对象或储存
属于计算机网络的应用层
序列化协议
JDK自带
不想被序列化transient修饰
不推荐原因
不支持跨语言序列化后体积大传输性能差安全问题
Hessian
RPC协议dubbo2.x默认启用序列化协议
JSON
简单易用性能低