java基础整理 一些基础小要点

举报
object 发表于 2023/03/16 16:10:00 2023/03/16
【摘要】 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: 提前编译

重载和重写

  • 重载:编译期间,同一个类中同方法名根据不同传参执行不同的逻辑处理
  • 重写:运行期间,子类对父类的允许访问的方法实现过程进行重新实现

基本数据类型

  • 类型及大小
    • 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”)
      • 要求:知道具体的类全路径 需要捕获受检异常
      • 特点:得到的类未执行初始化操作(静态等不会执行)
  • 常用函数
    • 获取对象实例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结构中。
    • 其他序列化:JSON、XML、Kyro、Protobuf、Hessian

I/O流

  • I/O流程:数据输入到计算机内存的过程即输入,反之输出到外部存储的过程即输出

  • 最上层父类:

    • InputStream/OutputStream 字节流
      • 处理音频、二进制较多
    • Reader/Writer 字符流
      • 处理文字较多
  • 缓存流:

    • 本质是通过内部维护一个字节数组,通过减少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():写,如果当前指针位置处已有值,则进行覆盖
  • 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。