Java基础
Java特点
* 平台无关性,可以在任何安装了jvm的系统上运行
* 面向对象:Java是一门严格的面向对象编程语言,几乎一切都是对象
* 内存管理:自动管理内存、回收不使用的对象
什么是jvm
java虚拟机,解释字节码并映射到本地CPU指令集和OS的系统调用
JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够"**一次编译,到处运行的**"原因
Java为什么是跨平台的
编写的Java源码,编译后会生成一种 .class字节码文件。跨平台的是Java程序,不是JVM,JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM,Java虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行。
JVM、JDK、JRE三者关系
* JVM是Java虚拟机,是Java程序运行的环境。它负责将Java字节码(由Java编译器生成)解释或编译成机器码,并执行程序。JVM提供了内存管理、垃圾回收、安全性等功能,使得Java程序具备跨平台性。
* JDK是Java开发工具包,是开发Java程序所需的工具集合。它包含了JVM、编译器(javac)、调试器(jdb)等开发工具,以及一系列的类库(如Java标准库和开发工具库)。JDK提供了开发、编译、调试和运行Java程序所需的全部工具和环境。
* JRE是Java运行时环境,是Java程序运行所需的最小环境。它包含了JVM和一组Java类库,用于支持Java程序的执行。JRE不包含开发工具,只提供Java程序运行所需的运行环境。
值传递和引用传递区别☆
Java只有值传递,不存在真正的引用传递。
值传递(Pass by Value),传递的是值的副本,适用于基本数据类型(如 int、char 等),修改方法内的参数副本,不会影响原变量的值。
引用类型传递 "引用的副本",通过副本可修改对象内容,但无法改变原引用的指向
数据类型(数据类型、bigDecimal、自动拆装箱的方法、128陷阱)
八种基本数据类型和三种引用数据类型
基本数据类型:
* 数值型:整数类型(byte、short、int、long)和浮点类型(float、double)
* 字符型:char
* 布尔型:boolean
引用数据类型:
类、接口、数组
注意:
* java八种基本数据类型的字节数:1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double)
* 浮点数的默认类型为double(如果需要声明一个常量为float型,则必须要在末尾加上f或F)
* 整数的默认类型为int(声明Long型在末尾加上l或者L)
* 八种基本数据类型的包装类:除了char的是Character、int类型的是Integer,其他都是首字母大写
* char类型是无符号的,不能为负,所以是0开始的
<br />
long可以和int类型相互转化吗
可以由小变大,int到long直接赋值或强制类型转换,long到int强制类型转换,但容易数据丢失或溢出
<br />
数据类型转换方式
自动类型转换(隐式转换)、强制类型转换(显式转换)、字符串转换、数值间转换
<br />
类型互转会出现的问题
基本数据类型转换:小转大自动转换,大转小
对象引用转换:向上转型(多态,父类引用指向子类对象),不允许向下兼容,手动转换
<br />
为什么用bigDecimal不用double
double会出现精度丢失的问题,double执行的是二进制浮点运算,二进制有些情况下不能准确的表示一个小数,创建BigDecimal对象时,使用字符串作为参数,而不是直接使用浮点数值,可以避免浮点数精度丢失
自动拆装箱实现
装箱,调用integer(包装类)的valueof()方法,拆箱调用intvalue()方法
自动拆装箱128陷阱
Java的Integer类内部实现了一个静态缓存池,用于存储特定范围内的整数值对应的Integer对象。\
默认情况下,这个范围是-128至127(可以自己调,不作为面试重点,自己了解)。当通过Integer.valueOf(int)方法创建一个在这个范围内的整数对象时,并不会每次都生成新的对象实例,而是复用缓存中的现有对象,会直接从内存中取出,不需要新建一个对象。

127+1=-128
在 8 位有符号整数的补码编码规则下,最大值 127(二进制 0111 1111)加 1 后溢出为 1000 0000,而该二进制值在补码中被规定表示 - 128