Java的特性
- 简单易学(语法简单,上手容易);
- 面向对象(封装,继承,多态);
- 平台无关性( Java 虚拟机实现平台无关性);
- 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
- 可靠性(具备异常处理和自动内存管理机制);
- 安全性(Java 语言本身的设计就提供了多重安全防护机制如访问权限修饰符、限制程序直接访问操作系统资源);
- 高效性(通过 Just In Time 编译器等技术的优化,Java 语言的运行效率还是非常不错的);
- 支持网络编程并且很方便;
- 编译与解释并存;
JavaSE VS JavaEE
- Java SE(Java Platform,Standard Edition): Java 平台标准版,Java 编程语言的基础,它包含了支持 Java 应用程序开发和运行的核心类库以及虚拟机等核心组件。Java SE 可以用于构建桌面应用程序或简单的服务器应用程序。
- Java EE(Java Platform, Enterprise Edition ):Java 平台企业版,建立在 Java SE 的基础上,包含了支持企业级应用程序开发和部署的标准和规范(比如 Servlet、JSP、EJB、JDBC、JPA、JTA、JavaMail、JMS)。 Java EE 可以用于构建分布式、可移植、健壮、可伸缩和安全的服务端 Java 应用程序,例如 Web 应用程序。
JDK、JRE、JVM之间的关系
JDK(Java Development Kit):就是一个Java的开发工具包,供开发者使用,用于创建和编译java应用程序,其中包含了JRE和一些Java的开发工具:javac、javadoc(java文档生成工具)、jdb(调试器)、jconsole(监控工具)、javap(反编译工具)等 JRE(Java Runtime Environment):是Java运行时所需要的环境,它内部就包含了Java的虚拟机JVM以及一些Java的基本类库(提供常用的功能API,如 I/O 操作、网络通信、数据结构等)
从Java9开始,Java就被重构为94个模块,Java 应用可以通过新增的 jlink 工具,根据不同的需求,构建不同的RunTime(运行时),而不是所有的程序都共用同一个JRE,可以节省程序运行时占用的空间
什么是字节码?采用字节码的好处是什么
在 Java 中,虚拟机JVM 可以解析的代码就叫做字节码(扩展名为 的文件),它不面向任何特定的处理器,只面向虚拟机。通过字节码的方式,Java在一定程度上解决了传统解释型语言执行效率低的问题。所以, Java 程序运行时相对来说还是高效的,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行,从而实现Java语言的跨平台性

在.class文件这一步,先是使用类加载器ClassLoader进行加载,再由解释器逐行进行解释执行,由于这种方法会降低运行时的效率,所以后面引进了 JIT(Just in Time Compilation) 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用
移位运算符
移位运算符是最基本的运算符之一,几乎每种编程语言都包含这一运算符。移位操作中,**作的数据被视为二进制数,移位就是将其向左或向右移动若干位的运算。
移位运算符在各种框架以及 JDK 自身的源码中使用还是挺广泛的,(JDK1.8) 中的 方法的源码就用到了移位运算符

使用移位运算符的主要原因:
- 高效:移位运算符直接对应于处理器的移位指令。现代处理器具有专门的硬件指令来执行这些移位操作,这些指令通常在一个时钟周期内完成。相比之下,乘法和除法等算术运算在硬件层面上需要更多的时钟周期来完成。
- 节省内存:通过移位操作,可以使用一个整数(如 或 )来存储多个布尔值或标志位,从而节省内存。
移位运算符最常用于快速乘以或除以 2 的幂次方。除此之外,它还在以下方面发挥着重要作用:
- 位字段管理:例如存储和操作多个布尔值。
- 哈希算法和加密解密:通过移位和与、或等操作来混淆数据。
- 数据压缩:例如霍夫曼编码通过移位运算符可以快速处理和操作二进制数据,以生成紧凑的压缩格式。
- 数据校验:例如 CRC(循环冗余校验)通过移位和多项式除法生成和校验数据完整性。。
- 内存对齐:通过移位操作,可以轻松计算和调整数据的对齐地址。
掌握最基本的移位运算符知识还是很有必要的,这不光可以帮助我们在代码中使用,还可以帮助我们理解源码中涉及到移位运算符的代码。
Java 中有三种移位运算符:
- :左移运算符,向左移若干位,高位丢弃,低位补零。,相当于 x 乘以 2 的 n 次方(不溢出的情况下)。
- :带符号右移,向右移若干位,高位补符号位,低位丢弃。正数高位补 0,负数高位补 1。,相当于 x 除以 2 的 n 次方。
- :无符号右移,忽略符号位,空位都以 0 补齐。
虽然移位运算本质上可以分为左移和右移,但在实际应用中,右移操作需要考虑符号位的处理方式。
由于 , 在二进制中的表现比较特殊,因此不能来进行移位操作。
移位操作符实际上支持的类型只有和,编译器在对、、类型进行移位前,都会将其转换为类型再操作
Java中的数据类型
Java 中有 8 种基本数据类型,分别为:
- 6 种数字类型:
- 4 种整数型:、、、
- 2 种浮点型:、
- 1 种字符类型:
- 1 种布尔型:。
注意:
- Java 里使用 类型的数据一定要在数值后面加上 L,否则将作为整型解析。
- Java 里使用 类型的数据一定要在数值后面加上 f 或 F,否则将无法通过编译。
- char :单引号, :双引号。
这八种基本类型都有对应的java语言基础笔记包装类分别为:、、、、、、、
基本类型和包装类型的区别?
- 用途:除了定义一些常量和局部变量之外,我们在其他地方比如方法参数、对象属性中很少会使用基本类型来定义变量。并且,包装类型可用于泛型,而基本类型不可以。
- 存储方式:基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有对象实例都存在于堆中。
- 占用空间:相比于包装类型(对象类型), 基本数据类型占用的空间往往非常小。
- 默认值:成员变量包装类型不赋值就是 ,而基本类型有默认值且不是 。
- 比较方式:对于基本数据类型来说, 比较的是值。对于包装数据类型来说, 比较的是对象的内存地址。所有整型包装类对象之间值的比较,全部使用 方法。
注意:基本数据类型存放在栈中是一个常见的误区! 基本数据类型的存储位置取决于它们的作用域和声明方式。如果它们是局部变量,那么它们会存放在栈中;如果它们是成员变量,那么它们会存放在堆/方法区/元空间中
什么是自动拆装箱?
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型
注意:如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。
包装类型的缓存机制
Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。
,,, 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, 创建了数值在 [0,127] 范围的缓存数据, 直接返回 or ,源码这里就不提供了,大家自行查看
为什么浮点数运算的时候会有精度丢失的风险?
说到了数据类型,浮点类型在存储运算时会丢失一定的精度,这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示
讯享网
如何解决浮点数运算的精度丢失问题呢?
可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过 来做的
《阿里巴巴 Java 开发手册》中提到:“为了避免精度丢失,可以使用 来进行浮点数的运算”。我们在使用 时,为了防止精度丢失,推荐使用它的构造方法或者 静态方法来创建对象,《阿里巴巴 Java 开发手册》对这部分内容也有提到,如下图所示。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/10094.html