这是专门针对小白的零基础Java教程。
因为Java是全球排名第一的编程语言,Java工程师也是市场需求最大的软件工程师,选择Java,就是选择了高薪。
从互联网到企业平台,Java是应用最广泛的编程语言,原因在于:
Java是基于JVM虚拟机的跨平台语言,一次编写,到处运行;
Java程序易于编写,而且有内置垃圾收集,不必考虑内存管理;
Java虚拟机拥有工业级的稳定性和高度优化的性能,且经过了长时期的考验;
Java拥有最广泛的开源社区支持,各种高质量组件随时可用。
Java语言常年霸占着三大市场:
互联网和企业应用,这是Java EE的长期优势和市场地位;
大数据平台,主要有Hadoop、Spark、Flink等,他们都是Java或Scala(一种运行于JVM的编程语言)开发的;
这意味着Java拥有最广泛的就业市场。
虽然是零基础Java教程,但是覆盖了从基础到高级的Java核心编程,从小白成长到架构师,实现硬实力高薪就业!
还可以边学边练,而且可以在线练习!
并且,时刻更新至最新版Java!目前教程版本是:
不要犹豫了!现在开始学习Java,从入门到架构师!
,十年软件开发经验,业余产品经理,精通Java/Python/Ruby/Scheme/Objective C等,对开源框架有深入研究,著有《Spring 2.0核心技术与最佳实践》一书,多个业余开源项目托管在,欢迎微博交流:
使用窄屏手机的童鞋,请点击左上角“目录”查看教程:
面试就是你们身边老是存在各类各样的可能,而自身又具有这样的能力,就忍不住想试一试,尤为是到了年关,是一个好的蓄势而且认真积累的阶段。固然面试套路众多,但对于技术面试来讲,主要是考察一我的的技术能力和沟通能力。不一样类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。mysql
**“面试造火箭,工做拧螺丝”首先咱得能拧,才有造火箭的可能啊,**这一年整理不少面试的高频问点也作了解析,本身也在不少平台得到过一些面试技术点的学习视频,今天在这分享给你们!程序员
基础这个东西在每一个大厂都是一个重中之重,若是说学历是个敲门砖,那么Java基础必然是你可否到二面,三面的一把钥匙!这一块主要包括Java集合、JVM、GC、锁、并发等。web
HashMap 的工做原理是什么?缓存
Hashmap 何时进行扩容呢?安全
List、Map、Set 三个接口,存取元素时,各有什么特色?
Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用 == 仍是 equals()? 它们
Java 集合类框架的基本接口有哪些?
Java 集合类框架的最佳实践有哪些?
Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 仍是 equals()?它
**详细解析内容有不少,为了避免影响阅读,可看整理的《Java面试进阶讲解析笔记》,转发此文关注我后咨询如何获取《Java面试进阶讲解析笔记》**的免费领取方式
JVM 的内存模型以及分区状况和做用
JVM 对象建立步骤流程是什么?
垃圾回收算法有几种类型? 他们对应的优缺点又是什么?
简单介绍一下什么是类加载机制?
类的加载过程是什么?简单描述一下每一个步骤
JVM 预约义的类加载器有哪几种?分别什么做用?
什么是双亲委派模式?有什么做用?
介绍一下 JVM 中垃圾收集器有哪些? 他们特色分别是什么?
什么是 Class 文件? Class 文件主要的信息结构有哪些?
对象“对象已死” 是什么概念?
JVM 数据运行区,哪些会形成 OOM 的状况?
详细介绍一下对象在分带内存区域的分配过程?
G1 与 CMS 两个垃圾收集器的对比
线上经常使用的 JVM 参数有哪些?
什么是内存溢出, 内存泄露? 他们的区别是什么?
引发类加载操做的行为有哪些?
介绍一下 JVM 提供的经常使用工具
什么状况下会出现栈溢出
说一下强引用、软引用、弱引用、虚引用以及他们之间和 gc 的关系
**详细解析内容有不少,为了避免影响阅读,可看整理的《Java面试进阶讲解析笔记》,转发此文关注我咨询如何获取《Java面试进阶讲解析笔记》**的免费领取方式
什么是可重入性,为何说 Synchronized 是可重入锁?
JVM 对 Java 的原生锁作了哪些优化?
乐观锁的实现原理又是什么?
Java 中的线程池是如何实现的?
建立线程池的几个核心构造参数?
线程池中的线程是怎么建立的?是一开始就随着线程池的启动建立好的吗?
什么是 Java 的内存模型,Java 中各个线程是怎么彼此看到对方的变量的?
请谈谈 volatile 有什么特色,为何它能保证变量对全部线程的可见性?
**详细解析内容有不少,为了避免影响阅读,可看整理的《Java面试进阶讲解析笔记》,转发此文关注我咨询如何获取《Java面试进阶讲解析笔记》**的免费领取方式
请介绍你熟悉的 Spring 核心类,并说明有什么做用?
介绍一下 Spring 的事务的了解?
介绍一下 Spring 的事务实现方式?
Spring 的通知类型有哪些,请简单介绍一下?
Spring 通知类型使用场景分别有哪些?
**详细解析内容有不少,为了避免影响阅读,可看整理的《Java面试进阶讲解析笔记》,转发此文关注我咨询如何获取《Java面试进阶讲解析笔记》**的免费领取方式
主要包含索引、B+ 树、SQL 优化相关
事务四大特性(ACID)原子性、一致性、隔离性、持久性?
事务的并发?事务隔离级别,每一个级别会引起什么问题,MySQL默认是哪一个级别?
MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?
什么是临时表,临时表何时删除?
sql查询语句肯定建立哪一种类型的索引?如何优化查询?
汇集索引和非汇集索引区别?
有哪些锁(乐观锁悲观锁),select 时怎么加排它锁?
非关系型数据库和关系型数据库区别,优点比较?
数据库三范式,根据某个场景设计数据表?
数据库的读写分离、主从复制,主从复制分析的 7 个问题?
MySQL慢查询怎么解决?
mysql都有什么锁,死锁断定原理和具体场景,死锁怎么解决?
mysql 高并发环境解决方案?
**详细解析内容有不少,为了避免影响阅读,可看整理的《Java面试进阶讲解析笔记》,转发此文关注我咨询如何获取《Java面试进阶讲解析笔记》**的免费领取方式
简单描述一下 Redis 的特色有哪些?
Redis 持久化机制有哪些? 区别是什么?优缺点是什么?
Redis支持的数据类型
为何 Redis 须要把全部数据放到内存中?
Redis 是单线程的吗?
Redis 的缓存失效策略有哪几种?
什么是缓存命中率?提升缓存命中率的方法有哪些?
Redis全局命令及数据库管理
Redis设计订单应用场景
Redis缓存雪崩讲讲看?
Redis的数据结构—哈希(Hash)
Redis的数据结构—集合(set)
Redis的数据结构—字符串
Redis问题答案解析
**详细解析内容有不少,为了避免影响阅读,可看整理的《Java面试进阶讲解析笔记》,转发此文关注我咨询如何获取《Java面试进阶讲解析笔记》**的免费领取方式
根据几个开放性题目来设计系统,解决方案等
对于这一块**《Java面试进阶讲解析笔记》里也整理文档解析和视频讲解连接,转发此文关注我咨询如何获取《Java面试进阶讲解析笔记》**的免费领取方式!
因为文案过于长,在此就不一一介绍了,核心知识总结知识点除此以外还包括有Netty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java集合、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。
本知识体系适合于全部Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的全部内容对你会有一个质的提高,其中也总结了不少面试过程当中遇到的题目以及有对应的视频解析总结。
转发此文关注我咨询如何获取**《Java架构进阶笔记》**的免费领取方式
今日分享开始啦,请大家多多指教~
一、 前言、入门程序、常量
Java 语言主要应用在互联网程序的开发领域,网上购物商城、物流、金融、各行各业的门户网站。
1.3 Java 语言的跨平台实现原理
(3) 跨平台: 我们编写的一个 Java 程序,可以做多个操作系统上运行一次编译,到处运行。
(4) 问题思考,如下:
Java 程序是跨平台的? 正确的 一次编译到处运行。JVM 是跨平台的? 错误的 ==> JVM 是实现 Java 程序跨平台的基石。针对不同的操作系统提供不同的 JVM。而程序在 JVM 中运行。Java 程序的跨平台是依靠 JVM 的不跨平台实现的。正确的1.4
JDK 安装,注意事项:
安装 java 相关软件的时候: 安装路径中不允许出现中文和空格(任何开发软件都最好不要安装在中文路径下)1.2常用 DOS 命令的使用
如何进入DOS 命令操作窗口?
2.开始/搜索程序和文件 输入 cmd
4.窗口空白处/按住 shift 键 + 鼠标右键单击 /在此处开命令窗口
5.常用命令如下表所示:
记事本软件的启动方式?
1.开始/程序/附件/记事本
3.如果在DOS窗口的命令中:
如果path中配置的所有的路径中都没有要运行的命令,运行报错了.
给Java配置环境变量的意义/目的/作用?
让我们可以在任意路径下运行java开发的相关工具(javac: 编译工具,java: 运行工具)
2.把步骤1中创建的名称为 JAVA_HOME 的环境变量,添加到系统环境变量 path 中
3.如果在DOS窗口的命令中:
其次: 如果发现在当前路径 D:\abc 没有要运行的 javac.exe 命令,到系统环境变量path中寻找
如果 path 中配置的所有路径中,都没有要运行的 javac.exe 命令,运行报错了
寻找名称为JAVA_HOME的环境变量,找到后,使用其配置的具体路径进行替换:
2.1 程序开发的步骤
程序员写的程序;程序员在自己可以看得懂得程序;程序:字母、数字、其他符号;源程序是程序员编写的,程序员自己可以看得懂得程序,本质就是一个文本文件,但是扩展名不是 .txt,而是 .java。
JVM:叫做 Java 虚拟机,是专门用来运行 Java 程序的。但是 JVM 是一个二货,只能识别 0 和 1,而存储 0 和 1 的文件叫做 字节码文件(.class文件)如何把源文件(程序)翻译成JVM能够执行的字节码文件(程序)呢? 使用 javac 命令(编译命令), 使用格式:javac
不管是源文件(程序)还是字节码文件(程序)都存储在硬盘中? 不会自动执行,如何把字节码文件交给 JVM 执行呢? 使用 java 命令(运行命令)。 使用格式: java 文件名 例子:java HelloWorld。
保证当前路径下 javac命令 可以使用。保证当前路径下有要进行编译的 源(.java)文件。使用编译javac命令时,文件名后面必须写 扩展名.java。3.运行: java命令。 把 字节码(.class)文件 交给 jvm
保证当前路径下 java 命令 可以使用。保证当前路径下有要进行运行的 字节码(.class)文件。使用运行 java 命令 时,文件名后面不能写 扩展名.class。2.3 初学者编写 HelloWorld 常见问题
非法字符问题。Java 中的符号都是英文格式的。大小写问题。Java 语言对 大小写敏感(区分大小写)。在系统中显示文件的扩展名,避免出现 HelloWorld.java.txt 文件。编译命令后的 java文件名需要带文件后缀 .java。运行命令后的
概念: 在代码中添加注释可提高代码的可读性。注释中包含了程序的信息,可以帮助程序员更好地阅读和理解程序。在 Java 源程序文件 的任意位置都可以添加注释,且 Java 编译器不编译代码中的注释,也就是说代码中的注释对程序不产生任何影响。所以开发者不仅可以在注释中编写代码的说明文字、设计者的个人信息,还可以使用注释来屏蔽某些不希望执行的代码。
分类: Java 提供了 3 种代码注释,分别为单行注释、多行注释和文档注释。
1、单行注释:// 为单行注释标记,从符号 // 开始直到换行为止的所有内容均作为注释而被编译器忽略。语法格式如下:
2、多行注释:/* */ 为多行注释标记,符号 /* 与 */ 之间的所有内容均为注释内容。注释中的内容可以换行。语法格式如下:
3、文档注释: /**…*/ 为文档注释标记。符号 /** 与 */ 之间的内容均为文档注释内容。当文档注释出现在声明(如类的声明、类的成员变量声明、类的成员方法声明等)之前时,会被 Javadoc 文档工具 读取作为 Javadoc 文档内容。文档注释的格式与多行注释的格式相同。对于初学者而言,文档注释并不是很重要,了解即可。示例如下:
说明:一定要养成良好的编码习惯。软件编码规范中提到 可读性第一,效率第二,所以程序员必须要在程序中添加适量的注释来提高程序的可读性和可维护性。建议程序中的注释总量要占程序代码总量的 20%~50%。
引入:邮箱: @前面是用户名,@后面是使用的是哪家的邮箱。
换而言之,关键字是 Java 中已经被赋予特定意义的一些单词,不可以把这些字作为标识符来使用。关键字中的所有字母都是小写的,或者在高级编辑器中彩色显示。
Java中的关键字如下表所示:
标识符可以简单地理解为一个名字,用来标识类名、变量名、方法名、数组名等的有效字符序列。Java 规定标识符由 任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字。标识符不能是 Java 中的保留关键字。 示例:
常见错误:用中文命名标识符是非常不好的编码习惯。当编译环境的字符编码集发生改变后,代码中所有的中文标识符全部会显示成乱码,程序将无法维护。因为 Java 是一种可以跨平台的开发语言,所以发生中文标识符显示成乱码这种情况的概率非常大。编写 Java 代码有一套公认的命名规范:
类名:通常使用名词,第一个单词字母必须大写,后续单词首字母大写。(大驼峰式)方法名:通常使用动词,第一个单词首字母小写,后续单词首字母大写。(小驼峰式)变量:第一个单词首字母小写,后续单词首字母大写。(小驼峰式)常量:所有字母均大写。单词的拼接:通常使用
4.1 常量的概念和分类
数学中的常数,对应到 java 中叫常量,数学中的常数有分类,java 中的常量也有分类,而且比数学中的分类更加丰富。
1、概念:在程序的执行过程中,其值不可以发生改变的量。
整数常量:1314、520小数常量:13.14、5.20字符常量:java 中规定字符常量必须使用单引号 '' 引起来,而且单引号 '' 中只能写一个字符(不能不写,也不能写2个以上) 举例:
布尔常量:只有两个值 true 和 false。true:表示肯定的,对的,是的,正确的,成立的。false:表示否定的,错的,不是的,却无的,不成立的。字符串常量:java 中规定字符串常量必须使用双引号 "" 引起来,而且双引号 "" 中可以写多个字符(0个、1个、2个…), 举例:
空常量:null4.2 打印不同类型的常量
同 C语言 一样,Java 程序想要在控制台输出文字,需要调用一个已有的方法,方法如下:
但与 C语言 不同的是,Java 又提供了一个输出文字后自动换行的方法,这个方法在原有的 print 后面加上了 ln 后缀,方法如下:
打印不同类型的常量,示例如下:
4.3 变量和数据类型【重要】
1、变量概念:在程序的执行过程中,其值可以在一定范围内发生改变的量。可以把变量理解成为一个 容器,例如一个空烧杯,给变量赋值就相当于给烧杯倒水。如下图所示的那样,变量可以不断更换值,就像烧杯可以反复使用一样:
3、变量定义格式图解分析:
变量的本质就是内存中的一块空间,空间的大小由数据类型决定。要想找到变量对应的内存空间的数据,需要给变量对应的内存空间起个名字,叫做变量名称。对于变量的命名并不是任意的。应遵循以下几条规则:
a.变量名必须是一个有效的标识符。
b.变量名不可以使用 Java 中的关键字。
c.在同一个大括号范围内,变量名不能重复。
d.应选择有意义的单词作为变量名。
说明:在 Java 中允许使用汉字或其他语言文字作为变量名,如 **int 年龄 = 21;** 在程序运行时不会出现错误,但建议尽量不要使用
这些语言文字作为变量名。
变量对应的内存空间中必须有数据才能使用,这种向变量内存空间中,存储数据的过程叫做初始化或者赋值。
为什么要声明变量呢?简单地说,就是要告诉编译器这个变量属于哪一种数据类型,这样编译器才知道需要分配多少空间给它,以及它可以存放什么样的数据。
变量的注意事项:定义的变量,不赋值不能使用。定义 long 类型的变量时,需要在整数的后面加 L(大小写均可,建议大写)。同理,定义 float 类型的变量时,需要在小数的后面加 F(大小写均可,建议大写)。
类型转换是将一个值从一种数据类型更改为另一种数据类型的过程。例如,可以将 String 类型数据 457 转换为一个数值型,而且可以将任意类型的数据转换为 String 类型。数据类型转换有两种方式,即 隐式转换与显式转换。 如果从低精度数据类型向高精度数据类型转换,则永远不会溢出,并且总是成功的;
而把高精度数据类型向低精度数据类型转换则必然会有信息丢失,甚至有可能失败。这种转换规则就像下图所示的两个场景,高精度相当于一个大水杯,低精度相当于一个小水杯,大水杯可以轻松装下小水杯中所有的水,但小水杯无法装下大水杯中所有的水,装不下的部分必然会溢出。
从低级类型向高级类型的转换,系统将自动执行,程序员无须进行任何操作。这种类型的转换称为 隐式转换,也可以称为自动转换。 下列基本数据类型会涉及数据转换(不包括逻辑类型),这些类型按精度从 “低”到“高” 排列的顺序为 byte < short < int < long < float < double,可对照下图,其中 char 类型比较特殊,它可以与部分 int 型数字兼容,且不会发生精度变化。
隐式转换具体分析如下:
Java 程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
1.隐式转换(自动类型转换)概念:
取值范围小的数据或者变量可以直接赋值给取值范围大的变量(小萝卜可以直接放入大坑中)
(1)自动类型转换是自动完成的,不需要代码的干预
举例:有一个byte类型(1个字节)的数字5:
byte类型自动类型转换成short类型(2个字节):在左侧补充1个字节的0,因为左侧补充的都是0,对原有数据是没有影响的,仍然是5,
byte类型自动类型转换成int类型(4个字节):
在左侧补充3个字节的0,因为左侧补充的都是0,对原有数据是没有影响的,仍然是5
byte类型自动类型转换成long类型(8个字节):
在左侧补充7个字节的0,因为左侧补充的都是0,对原有数据是没有影响的,仍然是5
总结:根据需求,在数据前面补充若干字节的0,因为补充的都是0,对原有数据大小是没有影响的(打肿脸充胖子)
显式转换具体分析如下:
当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换(又称强制类型转换),
当执行显式类型转换时可能会导致精度缺失。语法如下:
(类型名) 要转换的值
取值范围大的数据或者变量不能直接赋值给取值范围小的变量(大萝卜不能直接放入小坑中),解决方案:
(2) 把萝卜变小(强制类型转换)
转后类型 变量名称 = (转后类型) 转前数据或者变量;
long类型强制类型转换成int类型(4个字节):
举例: 有一个long类型(8个字节)的数字5:
long类型强制类型转换成int类型(4个字节):
砍掉左侧的四个字节的内容,因为砍掉的都是数字0,所以对最终的结果数据没有影响仍然是5
long类型强制类型转换成short类型(2个字节):
砍掉左侧的六个字节的内容,因为砍掉的都是数字0,所以对最终的结果数据没有影响仍然是5
long类型强制类型转换成byte类型(1个字节):
砍掉左侧的七个字节的内容,因为砍掉的都是数字0,所以对最终的结果数据没有影响仍然是5
总结: 根据需求,砍掉数据左侧的若干字节的数据,只要砍掉的都是0,对原数据没有影响
但是只要砍掉的数据中包含1,就会对原数据产生影响(可能会损失精度)
计算机是一个二货,只能存储 0和1,所以存储到计算机中的所有内容都会转换成 0和1 进行存储。所以我们在计算机中存储的字符也不例外,也需要把字符转换成 0和1 进行存储,问题: 如何把字符转换成 0和1 呢? 通过 ASCII 编码表: 存储字符和数字对应关系的一张表格。 存储字符时:需要查找 ASCII 码表,找到字符对应的数字,将数字转换为二进制数存放到计算机中。
ASCII 码表如下图所示:
int 类型和 char 类型的运算原理,如下:
五、计算机中的进制与字节
计算机中的存储单位(2的10次方就是1024)
务必记住:1个字节是8位
运算符:对常量或者变量进行操作的符号。表达式:用运算符把常量或者变量连接起来符合 java 语法的式子就可以称为表达式。
Java 中的算术运算符主要有 +(加号)、-(减号)、*(乘号)、/(除号)、%(求余),它们都是二元运算符。Java 中算术运算符的功能及使用方式如下表所示:
其中,“+”和“-” 运算符还可以作为数据的正负符号,如 +5、-7。说明:“+”运算符也有拼接字符串的功能。下面分别演示算术运算符的用法。
【示例1】算术运算符加减乘除。示例代码如下:
赋值运算符用符号 “=” 表示,它是一个二元运算符(对两个操作数作处理),其功能是将右方操作数所含的值赋给左方的操作数。例如:
/*左方的操作数必须是一个量,而右边的操作数则可以是变量(如a、number)、
和其他主流编程语言一样,Java 中也有复合赋值运算符。所谓的复合赋值运算符,就是将赋值运算符与其他运算符合并成一个运算符来使用,从而同时实现两种运算符的效果。Java 中的复合运算符如下表所示:
以“+=”为例,虽然“a += 1”与“a = a + 1”二者最后的计算结果是相同的,但是在不同场景下,两种运算符都有各自的优势和劣势。
【示例2】赋值运算符的使用场景。示例代码如下:
6.3 自增自减运算符
自增、自减运算符是单目运算符,可以放在变量之前,也可以放在变量之后。自增、自减运算符的作用是使变量的值加1或减1。
关系运算符属于二元运算符,用来判断一个操作数与另外一个操作数之间的关系。不管关系表达式多么复杂或者多么简单,返回值一定是布尔类型的结果,要么是 true,要么是 false,如下表所示:
【示例3】关系运算符。示例代码如下:
假定某面包店,在每周二的下午7点至8点和每周六的下午5点至6点,对生日蛋糕商品进行折扣让利活动,那么想参加折扣活动的顾客,就要在时间上满足这样的条件,(周二并且7:00 PM~8:00 PM)或者(周六并且5:00 PM~6:00 PM),这里就用到了逻辑关系。逻辑运算符是对 true(真) 和 false(假) 这两种逻辑值进行运算,运算后的结果仍是一个逻辑值。
用来连接多个条件(布尔表达式的: 结果为true/false的式子),最终的结果也必须是一个布尔类型的数据,要么是true,要么是false
不管逻辑运算符连接的式子有多么简单或者多么复杂,最终结果要么是true,要么是false
(1) & (shift+7): 逻辑与,表示并且的意思,多个条件同时成立的意思,就是只有多个条件都是true,最终的结果才是true
特点:【有false,则false】: 只要有一个条件不成立(false),结果就是false
(2) |(shift+\): 逻辑或,表示或者的意思,多个条件,只要有一个成立,最终的结果就是true
特点:【有true,则true】:只要有一个条件是true,结果就是true
逻辑运算符的短路效果,如下表所示:
逻辑运算符的运算结果如下表所示:
位运算的操作数类型是整型,可以是有符号的,也可以是无符号的。位运算符可以分为位逻辑运算符和位移运算符两大类。
位逻辑运算符包括 &、|、^和 ~,前三个是双目运算符,第四个是单目运算符。这四个运算符的运算结果如下表所示:
参照上表来看一下这四个运算符的实际运算过程:
1)位逻辑与实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求与,
若两个操作数对象同一位都为1,则结果对应位为1,否则结果中对应位为0。例如,12和8经过位逻辑与运算后得到的结果是8。
2)位逻辑或实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求或,
若两个操作数对象同一位都为0,则结果对应位为0,否则结果中对应位为1。例如,4和8经过位逻辑或运算后的结果是12。
3)位逻辑异或实际上是将操作数转换成二进制表示方式,然后将两个二进制操作数对象从低位(最右边)到高位对齐,每位求异或,
若两个操作数对象同一位不同时,则结果对应位为1,否则结果中对应位为0。例如,31和22经过位逻辑异或运算后得到的结果是9。
4)取反运算符,实际上是将操作数转换成二进制表示方式,然后将各位二进制位由1变为0,由0变为1。
例如,123取反运算后得到的结果是-124。
&、| 和 ^ 也可以用于逻辑运算,运算结果如下表所示:
【示例10】位逻辑运算符的使用场景。示例代码如下:
移位运算有三个,分别是左移 <<、右移>> 和无符号右移 >>>,这三个运算符都属于双目运算符。左移是将一个二进制操作数对象按指定的移动位数向左移,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用0补充。左移相当于乘以2的幂,如下图所示:
右移是将一个二进制的数按指定的位数向右移动,右边(低位端)溢出的位被丢弃,左边(高位端)用符号位补充,正数的符号位为0,负数的符号为1。右移位运算相当于除以2的幂,如下图所示:
例如 short 型整数 9115 的二进制是 01 1011,右移一位变成 4557,右移两位变成 2278,运行过程如下图所示:
无符号右移是将一个二进制的数按指定的位数向右移动,右边(低位端)溢出的位被丢弃,左边(高位端)一律用0填充,运算结果相当于除以2的幂。例如 int 型整数 -32766 的二进制是 11 00 ,右移一位变成 ,右移两位变成 ,运行过程如下图所示:
【示例11】位移运算符的使用场景。示例代码如下:
常见错误:byte、short 类型做 >>> 操作时,可能会发生数据溢出,结果仍为负数。从二进制的实现机制来说,byte 类型和 short 类型不适用于 >>> 操作。
数据类型 变量名称 = 布尔表达式1 ? 表达式2 : 表达式3;
(2)如果布尔表达式1的结果为true,就把表达式2的结果赋值给左侧的变量
(3)如果布尔表达式1的结果为false,就把表达式3的结果赋值给左侧的变量
【示例13】用三元运算符完成判断一个数字的奇偶性。示例代码如下:
【示例14】使用条件表达式判断一个数是否是3和5的公倍数。示例代码如下:
圆括号可以提升公式中计算过程的优先级,在编程中非常常用。如下图所示,使用圆括号更改运算的优先级,可以得到不同的结果。
圆括号还有调整代码格式,增强阅读性的功能。比如下面的这个公式:
Java 中的表达式就是使用运算符连接起来并且符合 Java 规则的式子。运算符的优先级决定了表达式中运算的先后顺序。通常优先级由高到低的顺序依次是:自增和自减运算、算术运算、位运算、逻辑运算、赋值运算。如果两个运算有相同的优先级,会以从左到右的方式进行运算。下表显示 Java 中的运算符的优先级。
今日份分享已结束,请大家多多包涵和指点!