Java的优势
- Java的特点就是Java的优势
- Java虚拟机的存在可以让一次编写到处运行
- 面向对象也算一个优势但是现在很多语言都是面向对象的嗯Java最开始的初衷就是面向对象了所以它面向对象做的应该是最好的
- 有一个很强大的生态spring框架各种库和工具社区大企业用的也多
- 内存管理,自动回收垃圾减少了内存泄漏问题。比如说空指针之类的对开发者友好
- 关于多线程Java适合并发编程
Java的劣势
- Java最大的优势就是Java虚拟机那么这个也会将变成它的劣势
- 比如说Java虚拟机比较占内存然后它启动时间比较慢
- 跟其他与编程语言相比不如GO和C++这些语言快然后也没有Python简洁
- Java的优势还有面向对象那么它的劣势也会有像面向对象,面向对象的要求比较严格,写代码的时候反而会很麻烦
JVM的跨平台
- 有三个码,代码、字节码和机器码,代码是我们人写的,字节码是由Java虚拟机将代码翻译的产物,机器码是机器能识别的,直接运行的东西。
- 不同平台所能运行的机器码是不一样的,所以,需要Java虚拟机将字节码变成不同的机器码来适应不同的平台。
JVM、JDK、JRE三者关系
- 范围最大的是JDK,第二是JRE,第三是JVM
- JDK是Java开发所要用的包括了后面两个还包括了编译器调试和一些库,满足开发者开发Java要用的所有东西
- JRE是运行Java环境要用的所有东西,不包括调试啊编译器开发工具之类的还有没有用到的库
- JVM是Java虚拟机,它负责将Java字节码编译成不同平台所能识别的机器码,然后执行,它提供了内存管理垃圾回收安全性能等功能。
Java是编译型和解释型语言的混合
- 编译型语言是在程序执行之前,整个源代码都会被编译成目标平台的机器码,生成可执行文件,执行时直接运行编译后的代码比如说C语言C++
- 解释型语言是一边解释代码一边执行不会生成可独立执行的文件比如说Python JavaScript
- Java是编译型语言的原因是有个Java编译器将Java代码编译成字节码,生成了字节码文件
- 但是这个字节码文件不能直接运行,它还要经过Java虚拟机的一行一行的解释才能运行
- 这里面就有一个JIT,JIT是just in time即时编译器,它的作用是程序运行时现场把字节码翻译成能运行的机器码,但是比如那种循环的代码要循环很多次代码,不可能每一次都把字节码变成机器码,然后运行。
- 这个即时编译器就是监控代码的执行频次,把高频调用的代码标记为热点代码,然后一次性把这些热点代码批量编译成当前操作系统的机器码缓存起来,如果要执行这个代码的时候可以直接用,不用重复解释。
Java中只有值传递
- Java中只有值传递没有像C++那种引用传递,值传递的意思就是传递的是实际值的副本,我改这个副本不会影响原来的实际值
- 那么就有两种情况,一种情况是基本数据类型,它传递的是真正的值;还有一个是引用数据类型,它传递的是地址
publicstaticvoidmain(String[]args){intnum=10;changeValue(num);System.out.println(num)//输出的是10(原变量没有被修改)}publicstaticvoidchangeValue(inta){a=20;//仅修改副本}- 我传的是地址,那么我修改该地址上的变量,会直接影响到原来的值
数据类型的基础
说是八种,其实就三类
- 数值类型:整数类型(byte、short、int、long)和浮点类型(float、double)
- 字符型:char
- 布尔类型:boolean
- 记住,String是引用数据类型
- 字节数分别为1(byte boolean)2(short char)4(int float)8(long double)
Float.MIN_VALUE / Double.MIN_VALUE表示的是最小正非零值(如 1.4E-45),并不是负的最小值;浮点类型的最小负值是-MAX_VALUE
关于数据转换
- 将字节数小的转换为字节数大的可以安全地转换,反过来的话就存在数据丢失或溢出问题
- 注意char和short都是2字节,char是无符号的从0 ~ 65535,但是short是有符号的-215~ 215-1。
数据类型转换的方式
- 自动类型转换(隐式转换):当目标类型的范围大于源类型时,Java会自动将源类型转换为目标类型,不需要显式的类型转换。例如,将int转换为long、将float转换为double等。
- 强制类型转换(显式转换):当目标类型的范围小于源类型时,需要使用强制类型转换将源类型转换为目标类型。这可能导致数据丢失或溢出。例如,将long转换为int、将double转换为int等。语法为:目标类型 变量名 = (目标类型) 源类型。
- 字符串转换:Java提供了将字符串表示的数据转换为其他类型数据的方法。例如,将字符串转换为整型int,可以使用Integer.parseInt()方法;将字符串转换为浮点型double,可以使用Double.parseDouble()方法等。
- 数值之间的转换:Java提供了一些数值类型之间的转换方法,如将整型转换为字符型、将字符型转换为整型等。这些转换方式可以通过类型的包装类来实现,例如Character类、Integer类等提供了相应的转换方法、
基本数据类型转换出现的问题
- 数据丢失:比如int是4字节,转为byte2字节。那么只会取后面的2字节,前面的2字节之间舍弃
- 精度缺失:double类型的3.14转为int类型,只会保留3
引用数据类型转化出现的问题
- 向上转型是安全的,就是父类引用指向子类对象,因为子类一定包括父类所有的东西
- 向下转型需要手动进行,并且存在风险。如果父类对象实际上并不是目标子类的实例,在转型时就会抛出异常:
Animalanimal=newCat();Dogdog=(Dog)animal;// 运行时抛出ClassCastException原因是Java 的对象在运行时会记录其真实类型,当进行向下转型时,Java 会检查对象的实际类型是否与目标类型兼容。如果不兼容,就会抛出ClassCastException。解决方式是需要使用 instanceof 检查:
if(animalinstanceofDog){Dogdog=(Dog)animal;// 只有确认animal是Dog的实例时才进行转型}为什么要有包装类
- 可以把属性也就是数据跟处理这些数据的方法结合在一起,比如Integer就有parseInt()等方法来专门处理int型相关的数据
- 泛型只能使用引用类型
List<Integer>list=newArrayList<>();list.add(3);list.add(1);list.add(2);Collections.sort(list);System.out.println(list);- 作为转换的中间件:将一个int类型的值转换为String类型,必须首先将其转换为Integer类型,然后再转换为String类型
- Integer是16字节,缓存了-128 ~ 127