Java总结

【Java】JAVA知识总结浅析 Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景,JDK与JDBC,Java Web技术,Spring Boot系列,以及MyBatis框架的基本实现,最后还将讨论Java在大数据、人工智能、嵌入式和Android等领域的应用。 阅读详情

0、堆、栈、方法区

  堆:

  • 所有线程共享
  • 存储的是对象实例(Object)
  • 是垃圾回收(GC)的主要区域
  • 生命周期与对象一致,GC管理
  • 可以通过 -Xms 和 -Xmx 设置初始大小和最大大小

  栈:

  • 每个线程私有
  • 生命周期与方法调用一致
  • 方法调用产生栈帧,调用结束释放栈帧
  • 存储基本类型变量(如 int, double)和对象引用(reference) 

  方法区:

   类结构、常量池、静态变量等

 类的加载顺序:

    父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类实例变量赋值和实例代码块,父类构造函数,子类实例变量赋值和实例代码块,子类构造函数。

1、静态方法为什么不能调用非静态成员?

      静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象去访问。
      在类的非静态成员不存在的时候静态方法就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。

2、接口和抽象类有什么共同点和区别?

     接口和抽象类的共同点

     实例化:接口和抽象类都不能直接实例化,只能被实现(接口)或继承(抽象类)后才能创建具体的对象。

     抽象方法:接口和抽象类都可以包含抽象方法。抽象方法没有方法体,必须在子类或实现类中实现。

     接口和抽象类的区别

     接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系。

    一个类只能继承一个类(包括抽象类),因为 Java 不支持多继承。但一个类可以实现多个接口,一个接口也可以继承多个其他接口。

     抽象类可以包含抽象方法和非抽象方法。抽象方法没有方法体,必须在子类中实现。非抽象方法有具体实现,可以直接在抽象类中使用或在子类中重写。

3、深拷贝和浅拷贝和引用拷贝

    浅拷贝,对于对象内部的引用类型的对象不拷贝,跟原对象使用同一个引用类型的对象。

  BeanUtils.copyProperties

    深拷贝,完全拷贝成新的对象。

    手动重新赋值

    json序列化 重新转成新对象

    引用拷贝,两个不同的引用指向同一个对象。

Person p1 = new Person("Tom", 20);
Person p2 = p1; // 引用拷贝

4、String   StringBuffer   StringBuilder 

String 中的对象是不可变的,也就可以理解为常量,线程安全。

  • 保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。
  • String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。

StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

5、try-catch-finally 如何使用?

try块:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。

catch块:用于处理 try 捕获到的异常。

finally 块:无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。 finally里如果有return,则直接return了。不会执行 try 或 catch里的return了。

finally 之前虚拟机被终止运行,程序所在线程死亡,关闭cpu,finally 中的代码不会被执行。

6、Java反射

反射允许程序在运行时动态地加载类、创建对象、调用方法和访问字段。

许多现代 Java 框架(如 Spring、Hibernate、MyBatis)都大量使用反射来实现依赖注入(DI)、面向切面编程(AOP)、对象关系映射(ORM)、注解处理等核心功能。反射是实现这些“魔法”功能不可或缺的基础工具。控制反转IOC,注解@Service  @Controller @Mapper 等都依赖反射。

通过反射,可以编写更通用、可重用和高度解耦的代码,降低模块之间的依赖。例如,可以通过反射实现通用的对象拷贝、序列化、Bean 工具等。

7、BIO  NIO AIO

BIO  同步阻塞型IO模型。

NIO  同步非阻塞 IO 模型。 Netty框架

AIO 异步 IO 是基于事件和回调机制实现的

8、集合

List       

ArrayList  数组    

LinkedList 双向链表

Set

HashSet  (无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素。

LinkedHashSet   LinkedHashSet 是 HashSet 的子类,内部是通过 LinkedHashMap 来实现的。

TreeSet   (有序,唯一): 红黑树(自平衡的排序二叉树)。

Map

HashMap   1.8以前是数组+链表   1.8以后是红黑树   初始大小是16,每次扩容都是2倍。不保证任何顺序。

当链表长度大于等于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。

LinkedHashMap   继承自 HashMap,双向链表,保证有序。

TreeMap 红黑树  有序

Hashtable:这是 HashMap 的一个线程安全版本,所有方法都是同步的。与 HashMap 不同的是,Hashtable 不允许键或值为 null。

 ConcurrentHashMap:提供了一种高效且线程安全的哈希表实现。  

map遍历

0、Lambda

 map.forEach((key, value) -> {
            System.out.println(key);
            System.out.println(value);
        });

1、for each

for (Map.Entry<Integer, String> entry : map.entrySet()) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }

2、迭代器

Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, String> entry = iterator.next();
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }

9、多线程

传统方式 继承 Thread 类和实现 Runnable 接口 重写run()

现在 使用 Executors 工具类来创建不同类型的线程池,如固定大小的线程池、缓存线程池等。

还可以使用线程池。通过 ThreadPoolExecutor 构造函数直接创建 (推荐)

Thread#sleep() 方法和 Object#wait()

  • sleep() 方法没有释放锁,而 wait() 方法释放了锁 。

  wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify()或   者 notifyAll() 方法。

直接调用run()不会启动多线程,要调用start()才启动。

死锁:线程互相等待。  避免死锁:破坏循环等待条件

乐观锁和悲观锁

乐观锁 基于CAS算法实现。  悲观锁:每次访问都要上锁,synchronized

数据库

ACID  原子性 一致性 隔离性 持久性 

事务级别   读未提交 读已提交 可重复读(默认的隔离级别) 可串行化

mysql

创建数据库、表 删除数据库、表,索引、视图  create drop

-- 添加字段
ALTER TABLE users ADD COLUMN age INT AFTER name;

-- 删除字段
ALTER TABLE users DROP COLUMN age;

-- 修改字段类型或位置
ALTER TABLE users MODIFY COLUMN age VARCHAR(3);

当前默认的存储引擎是 InnoDB。并且,所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。

三大范式

第一范式(1NF): 数据库表中的字段都是单一值。

第二范式(2NF):非主键字段需完全依赖于主键。

第三范式(3NF):一个非主键字段不能依赖另一个非主键字段。

索引

单表索引最好不超过5个。对于频繁的查询,优先考虑使用覆盖索引就是包含了所有查询字段 (where、select、order by、group by 包含的字段) 的索引

聚簇索引:索引和数据一起存放的索引,如主键索引。聚簇索引默认使用的是 B+Tree 索引。

非聚簇索引:索引结构和数据分开存放的索引,普通、唯一、复合、覆盖。

索引失效

  • 创建了组合索引,但查询条件未遵守最左匹配原则;
  • 在索引列上进行计算、函数、类型转换等操作;
  • 以 % 开头的 LIKE 查询比如 LIKE '%abc';;
  • 查询条件中使用 OR,且 OR 的前后条件中有一个列没有索引,涉及的索引都不会被使用到;
  • IN 的取值范围较大时会导致索引失效,走全表扫描(NOT IN 和 IN 的失效场景相同);

最左索引

联合索引的最左匹配原则,在遇到范围查询(如 >、<)的时候,就会停止匹配,也就是范围查询的字段可以用到联合索引,但是在范围查询字段后面的字段无法用到联合索引。注意,对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配。

Redis

缓存击穿:热点key失效,短时间大量请求数据库。   热点key提前预热或不过期

缓存穿透:无效的key 访问数据库。 缓存无效的key或者使用布隆过滤器

缓存雪崩:大量key集中失效。  redis集群或设置随机失效时间或提前预热

常见的缓存预热方式有两种:使用定时任务,比如 xxl-job,来定时触发缓存预热的逻辑,将数据库中的热点数据查询出来并存入缓存中。使用消息队列,比如 Kafka,来异步地进行缓存预热,将数据库中的热点数据的主键或者 ID 发送到消息队列中,然后由缓存服务消费消息队列中的数据,根据主键或者 ID 查询数据库并更新缓存。

Redis 中比较常见的数据类型有下面这些:

  • 5 种基础数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。
  • 3 种特殊数据类型:HyperLogLog(基数统计)、Bitmap (位图)、Geospatial (地理位置)。

Redis 采用的是那种删除策略呢

Redis 采用的是 定期删除+惰性/懒汉式删除 结合的策略。

    JDK、JRE、Java SE、Java EE和Java ME的详细解析 阅读详情

    相关推荐

    常微分方程 (ODE) 和 随机微分方程 (SDE)

    常微分方程(Ordinary Differential Equations, ODE)和随机微分方程(Stochastic Differential Equations, SDE)是数学中描述系统动态行为的重要工具。它们有一些相似之处,但在处理随机性方面存在显著差异。

    weixin_39699362的博客 4384

    Java 9 ← 2017,2019 → Java 13 ,来看看Java两年来的变化

    距离 2019 年结束,只剩下 10 几天了。你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说这几天, 的对比挑战就火了! 这个话题登上了微博的热搜榜,也刷爆了朋友圈,人们纷纷晒出自己2017和2019的照片对比。 作为一个技术宅,我也做了一个对比: 2017 年 9 月 21 日,Java 9 正式发布,并且在2017年8月,JCP执行委员会提出将J...

    HollisChuang's Blog 2万+

    ComfyUI入门学习-教程篇

    深入的 ComfyUI 教程,不同功能节点的详细指南。一个比较有意思的Comfyui教程,动画式学习。从安装到基础教程、高级教程再到各种工作流。非常全面,有教程有搭建好的工作流。

    wincyfu的博客 1326

    安装了多个java 如何切换java版本

    修改`JAVA_HOME`中的地址即可,可写个程序来快速修改.

    小蓝的博客 3万+

    HFSS螺旋线圈的设计与仿真

    undefined.全局变量在这里进行设置:Project/Project Properties, browse and setup the global variables.undefined.方程中的局部变量设置:HFSS/Design Properties, browse and setup the local variables。按照下图填写曲线的方程内容:fill the parameters according to the setup in the following picture。

    johnboat的专栏 3845

    AI Agent评估:指标、策略与最佳实践

    AI智能体正逐渐融入到各个领域,从日常的对话助手到复杂的工作流程自动化,其应用范围不断拓展。然而,确保这些智能体能够可靠、高效地完成任务至关重要,这就使得AI智能体评估成为了人工智能发展过程中不可或缺的一环。本文将深入探讨AI智能体评估的指标、策略以及最佳实践,为读者全面解读这一关键领域。

    llm_way的博客 3498

    【Java】从java8到java17各版本新特性详解

    下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线,可以看出,JDK 17的支持时间最长,可以延续到2029年9月。考虑到技术更新的速度,这次免费商用8年的时间可谓是经过精心考虑,旨在让用户放心地升级到JDK 17(不过JDK 8的支持时间更长,可以延续到2030年12月)。从JDK诞生到现在,仅有几个版本得到了长期支持,主要包括JDK 7、JDK 8、JDK 11以及即将发布的JDK 17,它将是继Java 8之后最重要的LTS版本,是Java社区八年努力的成果。

    一个天蝎座的程序猿 5889

    【LTspice】002 第一个仿真电路

    目录 1. 光偶元件的工作原理 2. 过零检测电路的工作原理 3. 以PC817光耦搭建一个过零检测电路 1. 光偶元件的工作原理 光耦合器(optical coupler,英文缩写为OC)亦称光电隔离器或光电耦合器,简称光耦。它是以光为媒介来传输电信号的器件。 PC817是一种把红外光发射器件和红外光接受器件以及信号处理电路等封装在同一管座内的器件。当输入电信号加到输入端发光器件LED上,LED发光,光接受器件接受光信号并转换成电信号,然后将电信号直接输出,或者将电信号放大处理成标准数字电平输

    m0_59642765的博客 8022

    Java笔记——Java命令大全

    使用jstat命令可以实时查看Java应用程序的性能状况,例如堆内存的使用情况、类加载器的状态、JIT编译器运行时间等重要信息,有助于开发人员及时发现性能问题并进行优化。需要注意的是,jstack命令只能获取Java进程当前的线程信息和调用栈信息,并不能记录历史数据,如果需要跟踪Java进程的历史性能指标,建议使用其他性能分析工具。-source version:指定要编译的Java源代码的版本(例如,-source 8表示使用Java 8的语言功能进行编译)。

    a25847a的博客 6564

    RK3588 部署 YOLO26-Pose 人体姿态检测:Windows Docker 环境全流程

    YOLO26-Pose 在 RK3588 上的部署流程是 PC 端 ONNX 导出 → RKNN 转换(INT8 量化)→ 板端推理。INT8 量化后 YOLO26s-Pose 约 35ms,YOLO26n-Pose 约 15ms,可以覆盖实时姿态检测的需求。后处理是 Python 实现的常见瓶颈——如果帧率不达标,先用 npy 保存模型输出在 PC 上验证解析逻辑的正确性,确认无误后再迁移到 C++ 实现。

    m0_64661770的博客 542

    uniapp - 强力解决H5网页浏览器跨域问题,如何解决uniapp请求接口在浏览器跨域问题,UniApp H5 跨域代理配置详细教程完美解决所有uniapp跨域(调用第三方接口或服务器api跨域)

    uni-app 跨域,uniApp解决h5跨域问题,解决uni-app请求接口在浏览器跨域问题,uni.request请求跨域问题解决方案,uni-app-跨域解决方法,彻底解决uniapp发布为H5的跨域问题,uniapp H5页面设置跨域请求_uniapp h5跨域配置,uniapp开发 H5 解决跨域问题,uniApp请求解决跨域问题,uniapp request如何实现前端请求跨域,解决uniapp调试过程中的请求跨域和环境配置,Uniapp调用外部api接口跨域请求,uni-app发布H5页面跨域

    🏆 前端领域优质创作者 5354

    一文搞懂 Java、Java EE、Java SE 和 Java Web

    在学习和使用 Java 编程语言的过程中,我们常常会遇到“Java SE”、“Java EE”、“Java ME”和“Java Web”这些术语。对于很多开发者尤其是新手来说,这些术语可能会显得有些混淆。理解它们的区别和联系对于选择适合的技术栈和提高编程效率非常重要

    m0_61118741的博客 3357

    GEE生物量碳储量——利用sens和MK检验方法计算1987-2022年森林地上生物量AGB和碳储量的时空变化特征

    本文是将之前已经处理好的森林生物量和碳储量数据保存到GEE Assets中,然后分别将单张影像导入到代码编辑器中,构建一个时间序列集合,并且这里需要用到的是我们给影像添加指定的时间属性,这样方便进行下一步的时序分析和空间预测。首先,需要收集1987年至2022年期间森林地上生物量AGB和碳储量数据。该数据可以通过森林清查数据、卫星遥感数据等途径获取。然后,根据这些数据,可以使用sens(敏感性分析)和MK(Mann-Kendall)方法计算时空变化特征。

    此星光明博客 1264

    Java 8、Java 11、Java 17和Java 21的比较

    从Java 9开始,Oracle引入了新的六个月发布周期。这意味着每年会发布两个新的Java版本。然而,长期支持(LTS)版本——如Java 8、11、17和现在的21——每隔几年发布一次,并且支持时间更长。

    qq_28791753的博客 2939

    Devexpress16.2.6破解工具

    Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

    win10 跳过U8环境检测的IE WebControls.rar

    win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

    【JAVA】java 学习路线

    一门永不过时的编程语言——Java 编程开发。 Java编程语言占比: 据官方数据统计,在全球编程语言工程师的数量上,Java编程语言以900万的程序员数量位居首位。 而且很多软件的开发都离不开Java编程,因此其程序员的数量最多。而在以Java编程为核心的开发领域中,javaEE程序员的需求量10年来一直居于首位! Java工程师人才缺口: 根据IDC的统计数字:就2017年来说,我国Java人...

    帅胖子的博客 2407

    OV9734 DATASHEET,完整规格书

    OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

    java5、java6、java7、java8、java9新特性

    1. 介绍2. JAVA5新特性2.1 泛型 Generics2.2 枚举类型2.3 自动装箱拆箱(自动类型包装和解包)autoboxing &amp; unboxing2.4 可变参数varargs(varargs number of arguments)2.5 Annotations(重要) 它是java中的metadata(注释)2.6 新的迭代语句2.7 静态导入(import stati...

    隐居者 1万+

    最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

    Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

    Java笔记——Java 初识_java 版本历史

    (Java Micro Edition,小型版):支持 Java 程序运行在移动终端(手机,PDA)上的平台,对 Java API 有所精简,并加入了针对移动终端的支持,此版本以前称为 J2ME。JDK 是提供给 Java 开发人员使用的,其中包含了 Java 的开发工具,也包括了 JRE,所以如果安装了 JDK,就不用再单独安装 JRE 了。因为不同的操作系统需要不同的 JVM,而 JVM 又是包含于 JDK 的,因此不同的操作系统就需要安装不同的 JDK。负责执行指令,管理数据,内存,寄存器。

    a25847a的博客 1615

    Java 进化之路:从 Java 8 到 Java 21 的重要新特性

    最近在 Stack Overflow 上看到个热帖:“现在学 Java 到底应该从哪个版本开始?必须从版本演进的角度理解 Java!今天咱们就掰开揉碎了聊聊 Java 8 到 Java 21 那些改变编程方式的特性(敲黑板!重点来了)最近在 GitHub 上看到一个有趣的数据:Java 21 的采用率比 Java 17 同期高出 300%!这说明开发者对新特性的接受度越来越高(时代在进步啊兄弟们)。维护老项目用 LTS 版本新项目尽量上 Java 17+个人项目勇敢尝试 Java 21。

    notion2025的博客 1332

    Mac下如何降级Java、卸载Java

    前言 安装一些组件或插件时,有时会提示错误: * What went wrong: Could not determine java version from '11'. 查看组件或插件对应的Java版本会发现,可能只支持 Java 8,但本地安装的Java版本不一定能对应。 查看Java版本: #查看版本 java -version #查看安装位置 /usr/libexec/java_home...

    专注于技术开发、项目管理 6562

    现代java,Java 8 到 Java 21特性一览

    Java 是一种多功能编程语言,它经历了变革之旅。从 Java 8 开始,令人兴奋的功能改变了开发人员的编码方式。从用于更好功能的漂亮 lambda 表达式到使处理数据更容易的 Stream API,Java 8 改变了游戏规则。我们将查看 Java 21 之前的更新,其中密封类可让您更好地控制类,而记录使创建数据对象变得轻而易举。加入旅程,我将用简单的解释和实际示例分解这些现代 Java 功能。由于这将是一个漫长的旅程,而且文章会很长,我建议将其分成较小的部分以方便您阅读。

    周国通的博客 1603

    【Java基础】认识Java,Java程序的生命周期,运行Java程序

    JDK 是Java开发工具包,就跟Go和Python一样有SDK这种工具包编写Java需要的软件,例如:eclipse、IDEA等;

    拔高、提升、创新! 1168

    Java历史版本官方下载地址(Java 6、Java 7、Java 8)

    Java历史版本官方下载地址: 1、Java 7官方下载地址;2、Java 8官方下载地址;

    大道至简 16万+

    java8 java11 java17对比分析和选型

    Java 8、Java 11和Java 17作为Java的三个重要版本,各自在功能、性能以及支持方面有着显著的区别。下面将从多个方面对这三个版本进行对比,并给出选型建议。

    Licky13的博客 1950
    上一篇: Easy-es框架,解决max_analyzed_offset问题
    下一篇: Java框架
    adminaddress
    博客等级 码龄5年 59粉丝 11原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

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

    抵扣说明:

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

    余额充值