万字Java基础原理知识大总结(中)

简介: Java诞生于1995年,原属于SUN公司,2009年4月20日,美国数据软件巨头甲骨文公司(Oracle)宣布以74亿美元收购SUN公司。Java是最受欢迎的开发语言,已经火了20年,并将继续引领着IT的编程语言。Java的LOGO是一杯热气腾腾的咖啡,真的是令人回味无穷。

六、表达式


表达式(expression),是由数字、运算符、括号、常量、变量等以能求得结果的组合


1.JPG


七、数据类型的转换


在8大基本数据类型中,boolean不属于数值类型,所以不参与转换,其他类型的转换规则如下图。一般的,byte、short、char三种类型相互之间一般不参与转换操作,按照转换方式,有两种(注意:boolean类型不参与类型转换):


  1. 自动类型转换:范围小的数据类型直接转换成范围大的数据类型,小->大
  2. 强制类型转换:范围大的数据类型强制转换成范围小的数据类型,大->小


2.JPG


7.1、自动类型转换与提升


7.1.1、自动类型转换


自动类型转换,也称为“隐式类型转换,就是把范围小的数据类型直接转换成范围大的数据类型


转换规则:byte、short、char—>int—>long—>float—>double

注意事项:byte、short、char相互之间不转换,他们参与运算首先转换为int类型

语法格式:范围大的数据类型 变量 = 范围小的数据类型值


public class TypeConvertDemo1{
  public static void main(String[] args) {
    //把int类型变量转为long类型
    long longNumber = 17;//整数默认为int类型
    //把long类型转换为float类型
    float f1 = longNumber;
    //把float类型转换为double类型
    double d = f1;
    //定义两个int类型的变量
    int a1 = 2;
    int b1 = 3;
    int c1 = a1 + b1;
    //定义一个byte类型,一个int类型
    byte b2 = 2;
    int c2 = 3;
    System.out.println(b2 + c2);
    //byte、short、char类型参与运算时把自己提升为int类型
    //byte d1 = b2 + c2;//编译报错
    int d3 = b2 + c2;//编译通过
  }
}
复制代码


7.1.2、自动类型提升


当一个算术表达式中,包含多个基本数据类型的常量或变量(boolean除外)时,整个算术表达式的结果类型将出现自动提升,其规则是:


  • 所有的byte、short、char类型被自动提升到int类型,再参与运算
  • 整个表达式的最终结果类型,被提升到表达式中类型最高的类型


System.out.println('a' + 1);//98
byte b = 22;
b = b + 11;//编译出错,此时结果类型应该是int
double d1 = 123 + 1.1F + 3.14 + 99L ;
复制代码

结论:算数表达式结果的类型就是其中范围最大的数据类型。


7.2、强制类型转换


强制类型转换,也称为“显式类型转换”,就是把范围大的数据类型强制转换成范围小的数据类型


# 语法格式:
# 范围小的数据类型  变量 = (范围小的数据类型)范围大的数据类型值;
复制代码


注意:一般情况下不建议使用强转,因为强转有可能损失精度


public class TypeConvertDemo2{
  public static void main(String[] args) {
    int a = 2;
    byte b = 3;
    //自动类型转换
    int c = a + b;
    //强制类型转换
    byte d = (byte) (a + b);
    //把double转换为int类型
    int i = (int)3.14;
    System.out.println(i);//3
  }
}
复制代码


八、运算符


对常量和变量进行操作的符号称为运算符

常见的运算符分为:算术运算符、赋值运算符、比较运算符、逻辑运算符、三元运算符


8.1、算数运算符


运算符 运算规则1 示例 结果
+ 正号 +3 3
+ 52+3 5
+ 拼接字符串 "中"+"国" “中国”
- 符号 int a = 3
-a
-3
- 3-1 2
* 2*3 6
/ 5/2 2
% 取模 5%2 1
++ 自增 int a = 1
a++(++a)
2
-- 自减 int b =2
b--(--b)
1


8.2、自增和自减


自增:++,递增操作符,使变量值增加1,有前置和后置之分,只能操作变量

自减:-- ,递减操作符,使变量值减去1,有前置和后置之分,只能操作变量

以++为例:


a++和++a结果都是让a的值自增1,如果只是需要自增的话,使用哪一种都可以

但是他们俩有唯一的区别:

  1. 前置(++a):  表示对a加1之后的结果进行运算,先加后用
  2. 后置(a++):表示对a变量加1之前的值(原始值)进行运算,先用后加


public class ArithmeticOperatorsDemo2{
  public static void main(String[] args) {
    int a1 = 5;
    int b1 = ++ a1;
    System.out.println("a1=" + a1 + ",b1=" + b1);//a1=6,b1=6
    int a2 = 5;
    int b2 = a2 ++;
    System.out.println("a2=" + a2 + ",b2=" + b2);//a2=6,b2=5
  }
}
复制代码

比较底层的解释

++a表示取a的地址,增加它的内容,然后把值放在寄存器中 a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值


8.3、赋值运算符


运算符 运算规则 示例 结果
== 是否相等于 4==3 false
!= 是否不等于 !4=3 true
< 小于 4<3 false
> 大于 4>3 true
<= 小于等于 4<=3 false
>= 大于等于 4>=3 true


8.4、三元运算符


三元运算符,表示有三个元素参与的表达式,所以又称为三目运算符,其语义表示if-else(如果什么情况就做什么,否则做什么)

语法格式:数据类型 变量 = boolean表达式 ?  结果A :结果B

表达的意思,boolean表达式结果:


  • 为true,则三元运算符的结果是结果A
  • 为false,则三元运算符的结果是结果B


注意:

  1. 三元运算符必须定义变量接受运算的结果,否则报错
  2. 三元运算符结果的类型由结果A和结果B来决定的,结果A和结果B的类型是相同的


8.5、逻辑运算符


逻辑运算符用于连接两个boolean表达式,结果也是boolean类型的


运算符 运算规则 示范 结果
& false & true false
| false | true true
^ 异或 true ^ false true
! !true false
&& 短路与 false && false false
|| 短路或 false || false true


规律:

  • 非:取反,!true则false,!false则true
  • 与:有false则false
  • 或:有true则true
  • 异或:^ 相同则false,不同则true


8.5.1、&和&&( | 和 | |)的区别


& :&左边表达式无论真假,&右边表达式都进行运算

&& :如果&&左边表达式为真,&&右边表达式参与运算,否则&&右边表达式不参与运算,故称短路与| 和 || 的区别同理,||,左边为真,右边不参与运算


public class LogicalOperatorDemo2 {
  public static void main(String[] args) {
    System.out.println(false & 1 / 0 == 1);//报错,说明右边执行了
    System.out.println(false && 1 / 0 == 1);//不报错,说明右边没有执行
    System.out.println(true | 1 / 0 == 1);//报错,说明右边执行了
    System.out.println(true | 1 / 0 == 1);//不报错,说明右边没有执行
  }
}
复制代码



相关文章
|
1月前
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
76 5
|
2月前
|
存储 算法 Java
Java HashSet:底层工作原理与实现机制
本文介绍了Java中HashSet的工作原理,包括其基于HashMap实现的底层机制。通过示例代码展示了HashSet如何添加元素,并解析了add方法的具体过程,包括计算hash值、处理碰撞及扩容机制。
|
6天前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
21 3
|
6天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
30 2
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
Java
Java之CountDownLatch原理浅析
本文介绍了Java并发工具类`CountDownLatch`的使用方法、原理及其与`Thread.join()`的区别。`CountDownLatch`通过构造函数接收一个整数参数作为计数器,调用`countDown`方法减少计数,`await`方法会阻塞当前线程,直到计数为零。文章还详细解析了其内部机制,包括初始化、`countDown`和`await`方法的工作原理,并给出了一个游戏加载场景的示例代码。
Java之CountDownLatch原理浅析
|
1月前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
92 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
69 2
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
51 5