java基础整理 一些基础小要点
【摘要】 JAVA基础 JVM/JDK/JRE介绍JVM:java虚拟机,一种规范,存在多种实现JDK:java开发工具包JRE:java运行环境 编译语言和解释语言编译语言:一次性翻译为机器码解释语言:逐行解释为机器码java: 编译与解释共存的语言字节码:java语言编译为字节码,VM解释字节码为机器码VM:虚拟机 java常用虚拟机HotSpotJIT:即时编译热点技术逃逸分析优化手段:1.同...
JAVA基础
JVM/JDK/JRE介绍
- JVM:java虚拟机,一种规范,存在多种实现
- JDK:java开发工具包
- JRE:java运行环境
编译语言和解释语言
- 编译语言:一次性翻译为机器码
- 解释语言:逐行解释为机器码
- java: 编译与解释共存的语言
- 字节码:java语言编译为字节码,VM解释字节码为机器码
- VM:虚拟机 java常用虚拟机HotSpot
- JIT:即时编译热点技术
- 逃逸分析优化手段:1.同步省略或锁消除 2.堆分配转栈分配 3.分离对象或标量替换
- AOT: 提前编译
- JIT:即时编译热点技术
重载和重写
- 重载:编译期间,同一个类中同方法名根据不同传参执行不同的逻辑处理
- 重写:运行期间,子类对父类的允许访问的方法实现过程进行重新实现
基本数据类型
- 类型及大小
- byte1字节、short2字节、int4字节、long8字节、char2字节、float4自己、double8字节、boolean1字节
- 包装类
- 默认值 null
- 缓存
- 整数型[-128,127]
- 字符型[0,127]
- 布尔型true|false
- 拆装箱
- 装箱:xxx.valueOf(基本数据)
- 拆箱:包装数据.xxxValue()
- BigDecimal类
- java浮点数计算错误举例:float a=2.0f-1.9f; float b = 1.8f-1.7f; a==b? 答案:false
- 使用:new BigDecimal(“0.1”)
- BigDecimal不能使用equals比较,精度错误。
- 内部组成:由BigInteger统计整数和Int统计小数组成
- BigInteger: 底层由int[]实现,解决整数位数最大受限的问题
三大基本特征
-
基本特征:封装、继承、多态
-
抽象类和接口区别
- 相同:1.不同实例化 2.可有抽象方法 3.可有默认实现方法
- 不同:1.接口强调规范 抽象类强调代码复用 2.接口多实现 抽象类单继承 3.接口成员静态常量 抽象类成员可被重新赋值
拷贝
-
引用拷贝
- 多个引用指向同一个对象
-
浅拷贝
- 各个引用指向各自的对象,但这些对象的成员属性都指向了同一个对象。 只有最外层对象不同
-
深拷贝
- 各个引用指向各自的对象,这些对象的成员属性也是指向不同的对象。 百分百拷贝,所有对象不共用。
hashCode和equals
- 相同:都是用来判断对象是否相等
- 不同:hashCode做第一次比较,速度快但不精确 ;equals做第二次比较,速度慢但精确
- 重写规范:两个一般要同时重写,且符合hashCode不等equals必定不等 equals相等则hashCode必定相等的原则
String类
- 不可变对象:1.final修饰无法继承 2.private私有 未提供修改字符串的方法
- 底层char[]数组,JDK9变更为byte[]
- StringBuffer、StringBuilder:解决字符拼接产生大量对象的问题。
- 底层优化:string + string,自动优化为使用StringBuilder
- 注意事项:当使用for循环拼接字符串时,虽然使用了StringBuilder,但是不会复用,每次循环生成一个新的StringBuilder,建议手动实现
- 字符串常量池:JVM为了提升性能和减少内存消耗针对字符串专门开辟的一块区域
- 编译器优化:常量折叠-编译期间针对确定的常量字符串进行计算合并处理。
异常
- 分类:Error Exception
- error:程序错误,无法解决的问题。如内存溢出
- exception: 异常,可通过编码手段处理。如空指针异常
- 受检异常:需要手动显式的进行捕获或抛出异常。即默认必须处理
- 非受检异常:无需进行捕获,默认抛出改异常。即默认可不处理
- try-catch-finally
- finally块中不推荐使用return语句,会覆盖之前值
- finally不执行的情况,1.线程结束 2.cpu关闭 3.虚拟机终止等
- try-with-resources:强烈推荐针对流处理的写法,更好的可读性和易用性
泛型
- 主要作用是增强代码的可读性和稳定性,便于编译器对类型检测
- 实际使用场景:通用返回VO,Excel<T>、List<T>等
反射
- 反射:框架的灵魂,赋予运行时分析类的能力
- 特点
- 优:1.开箱即用的效果 2.灵活多变的处理方式
- 劣:1.安全问题 2.略微降低的性能
- 实际使用场景:动态代理、注解等
- 四种获取方式
- Class clazz = 类.class;
- 要求:需要有具体的类
- 特点:得到的类未执行初始化操作(静态等不会执行)
- Class clazz = 对象.getClass();
- 要求:有具体的对象实例
- Class clazz = Class.forName(“xx.xx”);
- 要求:知道具体的类全路径 需要捕获受检异常
- Class clazz = ClassLoader.getSystemClassLoader().loadClass(“xx.xx”)
- 要求:知道具体的类全路径 需要捕获受检异常
- 特点:得到的类未执行初始化操作(静态等不会执行)
- Class clazz = 类.class;
- 常用函数
- 获取对象实例clazz.newInstance();
- 获取方法:clazz.getDeclaredMethods() | clazz.getDeclaredMethod(“名字”,类型)
- 执行获取的方法:method.invoke()
- 获取变量:clazz.getDeclaredFields() |clazz.getDeclaredField(“名字”)
- 允许变更私有属性:field.setAccessible(true)
注解
- 编译期间直接扫描
- 场景:@Override @Deprecated
- 运行期反射处理
- 场景:@Value spring系列
序列化
- 序列化主要目的
- 通过网络传输对象或将对象存储到文件系统,数据库,内存中
- 场景
- rpc网络传输、对象存储到文件、对象存储到redis、对象存储到redis
- TCP/IP四层模型
- 应用层、传输层、网络层、接口层
- 序列化操作对应层级:应用层
- OSI七层模型
- 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
- 序列化对应层级:表示层
- 常见序列化
- JDK自带序列化
- 使用:实现Serializable接口
- 特点:使用简单但性能、安全、跨语言能力不足
- SeriaVersionUID的作用:是否兼容旧数据,比较版本号
- 疑问:SerialVersionUID是属于类的,静态修饰,改变了它以后反序列化就不兼容了,那么反序列化的时候如何获取到以前的SerialVersionUID,理论上该值不会被序列化。查看源代码是进行了获取,但是未知从哪里获取。
- 解答:之前烦的错误是以为一定要将SerialVersionUID序列化,实际上这个值跟普通的序列化不一样,他不是作为一种成员变量而存在,而是一种版本标识。根据结构显示,SeriaVersionUID是单独存放,保存在STREAM_VERSION结构中。
- 疑问:SerialVersionUID是属于类的,静态修饰,改变了它以后反序列化就不兼容了,那么反序列化的时候如何获取到以前的SerialVersionUID,理论上该值不会被序列化。查看源代码是进行了获取,但是未知从哪里获取。
- 其他序列化:JSON、XML、Kyro、Protobuf、Hessian
- JDK自带序列化
I/O流
-
I/O流程:数据输入到计算机内存的过程即输入,反之输出到外部存储的过程即输出
-
最上层父类:
- InputStream/OutputStream 字节流
- 处理音频、二进制较多
- Reader/Writer 字符流
- 处理文字较多
- InputStream/OutputStream 字节流
-
缓存流:
- 本质是通过内部维护一个字节数组,通过减少IO次数增加效率,默认是8092字节。所以等价于read(byte,0,len)函数,不过写法更简洁
- 常见缓存流:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
-
特殊流
- PrintStream字节打印流
- 常用:System.out.print()
- RandomAccessFile随机访问流
- 特点:可移动指针进行任意读取
- 常用场景:文件断点续传
- 模式:
- r只读模式
- rw读写模式
- rwd读写模式+内容更新
- rws读写模式+内容更新+元数据(属性)更新
- 常用函数:
- read():读取当前指针下的字节,读取后指针移动到下一个字节
- seek(n):指针偏移至文件开头的第n个位置
- getFilePointer():获取当前指针位置
- write():写,如果当前指针位置处已有值,则进行覆盖
- PrintStream字节打印流
-
I/O设计的设计模式
- 装饰器模式:拓展原有类的功能,需要实现相同的接口
- 主要实现:缓存流BufferedxxxStream。增加原有功能
- 特点: 装饰器模式可实现多层嵌套,多层增强。重点为增强原先的功能
- 适配器模式:适配不同类之间的协同工作
- 主要实现:转换流InputStreamReader。字节流转字符流
- 特点:适配器模式主要体现在协同原本无法一起协作的功能的转换。重点体现在适配功能之间的协同工作
- 工厂模式:用于统一生成对象,同时对生成的对象做处理
- 主要实现:Files.newInputStream(“path”)
- 特点:统一生成对象,便于整体对象的管控。重点体现在对生成对象的统一处理
- 观察者模式:用于观察,监听某个对象的行为,并作出反应
- 主要实现:WatchService
- 特点:监听对象行为,便于行为的变更作出反应。重点体现在行为的变更需要作出及时的反应
- 装饰器模式:拓展原有类的功能,需要实现相同的接口
-
IO模式
-
IO模式:同步阻塞IO、同步非阻塞IO、IO多路复用、信访驱动IO、异步IO
-
Java中存在的IO模式:
- BIO-同步阻塞IO:传输阻塞,从通知到传输完成阻塞
- NIO-IO多路复用:监听器监听多个通道,通过轮询查询是否准备好数据,只有传输过程是堵塞状态
- AIO-异步IO:通知回调,发送准备请求,准备好后,直接回调传输数据。非阻塞
-
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)