一、计算机基础知识
(一)计算机相关基础概念
- 计算机:计算机(computer)俗称电脑,是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。
- 硬件:是计算机硬件的简称,是指计算机系统中由电子,机械和光电元件等组成的各种物理装置的总称。例如CPU、内存条等。
- 软件:是一系列按照特定顺序组织的计算机数据和指令的集合。一般来讲软件被划分为系统软件(Windows、Linux、Mac等)、应用软件(QQ、微信等)和介于这两者之间的中间件。
- 软件开发:软件开发是根据用户要求借助开发工具利用计算机语言建造出软件系统或者系统中的软件部分的过程。
- 计算机语言:计算机语言指用于人与计算机之间通讯的语言。计算机语言是人与计算机之间传递信息的媒介。例如C、C++、Java等。
- 人机交互方式:
- 命令行界面:是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。
- 图形界面(简称GUI):是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。
(二)DOS命令
1.概念
DOS命令:计算机术语,是指DOS操作系统的命令。
2.win10如何打开DOS控制台?
- windows+R->打开运行窗口->输入cmd->回车
- 开始->找到windows系统->命令提示符
- 打开我的电脑->找到需要操作的路径->路径前面加上cmd和空格->回车
3.常见的DOS命令
命令 | 解释 | 例子 |
---|---|---|
mspaint | 打开画图 | |
calc | 打开计算器 | |
notepad | 打开记事本 | |
cls | 清屏 | |
exit | 退出 | |
盘符号: | 切换到哪个盘符 | D: |
dir | 查看该目录下所有的文件或文件夹 | |
cd 目录名 | 进入该目录 | cd Java |
cd.. | 回退至上一级目录 | |
cd../../../ | 回退多级目录 | |
cd / | 回退至根目录 | |
md 目录名 | 新建一个目录 | md Java |
rd 目录名 | 删除一个空目录 | rd Java |
rd /s 目录名 | 删除非空目录,会询问你是否删除 | rd /s Java |
rd /s /q 目录名 | 直接删除非空目录无需询问 ,注意删除后,回收站里面没有所以慎重 | rd /s /q Java |
cd /d 完整的路径名 | 进入该路径(可实现跨盘符操作) | cd /d D:\Java |
del 文件名.后缀名 | 删除指定的文件 | del a.txt |
del *.txt | 批量删除后缀名是txt的文件 | del *.txt |
getmac | 查看物理网卡的地址 | |
hostname | 查看主机名 | |
ipconfig /all | 查看ip相关的东西 | |
shutdown -s -t 0 | 立即关机 |
二、Java入门知识
(一)Java语言概述
-
1995年由SUN公司詹姆斯•高斯林(James Gosling)等人正式发布第一个版本。
-
Java语言平台版本
- J2SE(Java 2 Platform Standard Edition)标准版
是为开发普通桌面和商务应用程序提供的解决方案
该技术体系是其他两者的基础,可以完成一些桌面应用程序的开发 - J2ME(Java 2 Platform Micro Edition)小型版
是为开发电子消费产品和嵌入式设备提供的解决方案 - J2EE(Java 2 Platform Enterprise Edition)企业版
是为开发企业环境下的应用程序提供的一套解决方案
该技术体系中包含的技术如 Servlet、Jsp等,主要针对于Web应用程序开发
jdk1.5以后,我们将其更名为: JAVASE , JAVAME , JAVAEE
- J2SE(Java 2 Platform Standard Edition)标准版
-
Java语言特点
- 简单性:Java剔除了C++的操作符过载、多继承特征、预处理程序和指针等
- 面向对象:在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从父类继承行为。
- 分布性:Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。
- 编译和解释性:Java先编译程序生成字节码再在Java虚拟机中解释执行。
- 稳健性:Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java不支持指针,它消除重写存储和讹误数据的可能性。异常处理是Java中使得程序更稳健的另一个特征。
- 安全性
- 跨平台性:也称可移植性,一次编写,到处运行(不同操作系统)。
- 高性能
- 多线程性
- 动态性
-
请解释Java语言的跨平台特性
Java的跨平台特性也被称为可移植性、平台无关性,或者一次编写处处运行。他的意思就是如果用Java语言编写一个应用,那么就可以在不同平台上运行,而不需要为不同平台单独运行开发。之所以能实现跨平台的特性。主要得益于Java虚拟机(JVM),JVM解释器在运行Java应用时根据当前平台进行解释,解释成符合当前平台规范的机器码,所以可以实现同样的应用在不同平台上都能运行。
JAVA语言是跨平台的,而JVM不是跨平台的。
(二)JDK/JRE/JVM的区别
-
JDK(Java Development Kit)
JDK是Java开发工具包,是Sun公司针对Java开发员的产品。
JDK中包含JRE(所以安装了JDK,就不用再单独安装JRE了),在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM+lib=JRE。
JDK是整个JAVA的核心,包括了Java运行环境JRE、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 -
JRE(Java Runtime Environment)
是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等,这些是运行Java程序的必要组件。
与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。 -
JVM(Java Virtual Machine)
就是我们常说的Java虚拟机,它是整个Java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
只有JVM还不能完成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而JRE包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
(三)JDK安装路径下的目录解释
-
bin目录:该目录用于存放一些可执行程序。如javac.exe(java编译器)、java.exe(java运行工具),jar.exe(打包工具)和javadoc.exe(文档生成工具)等。
-
include目录:由于JDK是通过C和C++实现的,因此在启动时需要引入一些C语言的头文件,该目录就是用于存放这些头文件的。
-
jre目录:"jre"是 Java Runtime Environment 的缩写,意为Java程序运行时环境。此目录是Java运行时环境的根目录,它包括Java虚拟机,运行时的类包,Java应用启动器以及一个bin目录,但不包含开发环境中的开发工具。
-
lib目录:lib是library的缩写,意为 Java 类库或库文件,是开发工具使用的归档包文件。
-
src.zip文件:src.zip为src文件夹的压缩文件,src中放置的是JDK核心类的源代码,通过该文件可以查看Java基础类的源代码。
(四)第一个Java程序
- 准备工作
打开我的电脑->查看->文件夹选项->查看->去掉“隐藏已知文件类型的扩展名”前的对勾。
- 新建一个文本文档将后缀名改为.java 例如 Hello.java
点击“是”。 - 编写Java代码
class Hello{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}
- 在源文件路径打开命令行窗口,使用javac命令编译HelloWorld源文件,生成字节码文件(后缀名为.class)
格式: javac 文件名.java (注意:这里是带有后缀名的) - 使用java命令对class字节码文件进行解释运行
格式: java 字节码文件名 (注意:这里是没有后缀名的)
(五)注释概述
1.什么是注释
用于解释说明程序的文字。
2.注释的作用
通过注释提高Java源程序代码的可读性;使得Java程序条理清晰,易于区分代码行与注释行。另外通常在程序开头加入作者,时间,版本,要实现的功能等内容注释,方便后来的维护以及程序员的交流。
3.注释的分类
- 单行注释 格式:
//这是单行注释
- 多行注释 格式:
/*
注释的文字
*/
- 文档注释 格式:
/**
*注释的文字
*注释的文字
*/
三、Java语言基础
(一)关键字
- 什么是关键字
就是被java语言赋予特殊含义的单词。 - 关键字的特点
组成关键字的字母都是小写 - 常见关键字
class,public,static,void … - 关键字的注意事项
(1): goto和const是java语言的保留字
(2): 类似于editplus这样的高级文本编辑器对关键字都是有颜色变化的 - 关键字与保留字的区别
关键字, 一定是保留字。
保留字一般是等同于关键字的。
从字面含义上理解,保留字是语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用。而关键字则指在语言中有特定含义,成为语法中一部分的那些字。在一些语言中,一些保留字可能并没有应用于当前的语法中,这就成了保留字与关键字的区别。
(二)标识符
- 什么是标识符
就是给类,接口,方法,变量,常量等起名字时使用的字符序列 - 标识符的组成规则
(1): 英文的大小写字母
(2): 数字字符
(3): $和_ - 标识符注意事项
(1): 不能以数字开头
(2): 不能是java中的关键字
(3): 区分大小写 - 标识符中常见的命名规范
(1)包(就是文件夹,它的存在是为了解决我们同一个目录下不能同时存在两个相同名称文件的问题。)
字母都是小写 。例如itcast
(2)类或者接口
一个单词: 首字母大写,其余字母小写。例如Student , Teacher , Spring , Struts , Hibernate
多个单词: 每一个单词的首字母都是大写,其余字母小写。例如StudentName , UserLoginController
(3)方法或者变量
一个单词: 字母全是小写。例如name , age
多个单词: 从第二个单词开始,首字母大写,其余字母小写。例如getName , getAge
(4)常量
一个单词: 字母全是大写。例如NAME , AGE
多个单词: 字母全是大写,每一个单词之间使用 _ 隔开。例如STUDENT_MAX_AGE
(三)常量
- 什么是常量
就是在程序的执行过程中其值不发生改变的量。 - Java中常量的分类
(1):字面值常量
(2):自定义常量 - 字面值常量的分类
(1): 字符串常量 用双引号括起来的内容 “HelloWorld” ,“Hello”
(2): 整数常量 所有整数 12,23
(3): 小数常量 所有小数 12.34,56.78
(4): 字符常量 用单引号括起来的内容 ‘a’,‘A’,‘0’ (注意事项:单引号中只能是单个字母,单个数字,单个符号)
(5): 布尔常量 较为特有,只有true和false
(6): 空常量 null - Java针对整数常量提供了4种表现形式
(1):二进制
(2):八进制
(3):十进制
(4):十六进制
(四)变量
1.变量的概述和格式
- 什么是变量
在程序执行的过程中,在某个范围内其值可以发生改变的量
变量其实是内存中的一小块区域 - 为什么要定义变量
用来不断的存放同一类型的常量,并可以重复使用 - 变量的定义格式
数据类型 变量名 = 变量值 ;
例如 int i=1;
2.数据类型的概述和分类
1.为什么有数据类型
我们都知道,变量其实就是内存中的一小块区域。我们定义一个变量,其实就是开辟了一个内存空间。
如果没有数据类型,那么我们需要开辟多大的内存空间合适呢?
为了解决这种问题,java就给我们提供了不同的数据类型,那么针对不同的数据类型,在内存中分配了不同大小的内存空间。
2.Java中数据类型的分类
(1): 基本数据类型
(2): 引用数据类型: 数组 , 类 , 接口
3.基本数据类型的详细讲解
(1)数值型:
整数型 | 字节数 | 范围 |
---|---|---|
byte | 1(8bit) | -128~127 |
short | 2(16bit) | -215 ~ 215 - 1 |
int | 4(32bit) | -231 ~ 231 - 1 |
long | 8(64bit) | -263 ~ 263 - 1 |
浮点型 | 字节数 | 范围 |
---|---|---|
float | 4(32bit) | -3.403*1038 ~ 3.403*1038 |
double | 8(64bit) | -1.798*10308 ~ 1.798*10308 |
(2)字符型
字符型 | 字节数 | 范围 |
---|---|---|
char | 2(16bit) | 0 ~ 216 - 1 = 65535 |
(3)布尔型
布尔型 | 字节数 | 范围 |
---|---|---|
boolean | 1 |
4.整数默认是int类型的 , 浮点数默认是 double类型的
5.注意事项:
- 定义long类型的数据,值的后面需要加一个后缀L(大小写都可)
- 定义float类型的数据,值的后面必须要加一个后缀F(大小写都可)
- 变量在使用之前必须赋值
- 给变量赋值不能超过该数据类型的范围
- 相同的作用域内不能定义两个同名变量
3.数据类型转换
1. 自动类型提升
概念:byte short char任意一种类型在参与数学运算时(如加法运算),会自动提升为 int 类型,如果还有long float double类型参与运算则会相应地提升为long float double类型,布尔类型不参与数学运算,byte short char之间参与数学运算时不发生相互转换,而是转换成int再计算。
class A{
public void static main(String[] args){
byte a=10;
byte b=20;
byte r=a+b;//报错:不兼容的类型:从int转换到byte可能会有损失
System.out.println(r);
}
}
由于a和b参与运算自动转换成了int类型,因此上面的计算结果(a+b)也是int类型,不能直接赋给byte类型。
2. 隐式转换(自动类型转换)
- 自动类型转换的实现需要同时满足两个条件:①两种数据类型彼此兼容,②目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)。
例如 byte 类型向 short 类型转换时,由于 short 类型的取值范围较大,会自动将 byte 转换为 short 类型。但short类型数据和char类型数据之间相互转换只能靠强制类型转换,因为它们虽然内存占用相同但是表数范围不同(short是-215 ~ 215 - 1,char是0~65535)。
int a=10;
int b=100;
long c=a+b;//自动类型转换
- 在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:
数值型数据的转换:byte→short→int→long→float→double。
字符型转换为整型:char→int。
boolean类型不能转换为其他的数据类型。
以上数据类型的转换遵循从左到右的转换顺序,最终转换成表达式中表示范围最大的变量的数据类型。
3. 强制转换
- 当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。
- 强制转换的格式
目标数据类型 变量名=(目标数据类型)(被转换的数据);
例如int a=(int)3.14; - 强制转换的注意事项
尽量不要使用强制类型转化,因为可能存在损失精度的问题。 - 面试题
1.byte a = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
答:有问题,会报错:int类型转换为byte类型可能会有损失。可以强制转换:
class A{
public static void main(String[] args){
byte b=(byte)130;
System.out.println(b);
}
}
结果:
因为int类型的130是32位的,即00000000 00000000 00000000 10000010,强转为byte类型后为10000010,它是补码,推回原码为11111110,即-126。
2.byte b = (byte)128;
class A{
public static void main(String[] args){
byte b=(byte)128;
System.out.println(b);
}
}
结果:
为什么将128强转为byte型后结果是-128呢?
因为int类型的128是32位的,即00000000 00000000 00000000 10000000,强转为byte类型后为10000000,它是补码,表示-128,此处不需要推回去原码。详情见Java中,为什么byte类型的取值范围为-128~127?
3.byte c = 3+4;
class A{
public static void main(String[] args){
byte c = 3+4;
System.out.println(c);
}
}
结果:
为什么此处不会报错?
答:常量优化机制:多个常量相加时会先算出结果看在不在这个数据类型的范围内,若在不报错,否则报错。
4.Java语言中的字符char可以存储一个中文汉字吗?为什么呢?
可以。因为Java语言采用的是Unicode编码。Unicode编码中的每个字符占用两个字节。而当使用UTF-8编码方式时一个汉字占三个字节,char就存不下了。
(五)字符和字符串参与运算
1.字符参与运算
案例
class A{
public void static main(String[] args){
System.out.println('a'+1);
}
}
结果
字符参与数学运算,对照ASCII码表值
ASCII码表常用的值:
‘0’-‘9’----48-57
‘A’-‘Z’----65-90
‘a’-‘z’----97-122
‘空格’----32
2.字符串参与运算
"+"不仅可以当数学运算符使用,还可以当作连接符:
当"+“号运算符两端只要任意一端是一个字符串,那么”+"就起连接符的作用。
案例
class A{
public static void main(String[] args){
System.out.println("Hello" + 'a' + 1);//HElloa1(Hello先和a形成新的字符串,再和1连接)
System.out.println('a' + 1 + "Hello");//98Hello('a'先和1相加,再和hello连接)
System.out.println("Hello"+100);//Hello100
System.out.println("Hello"+100+33);//Hello10033(Hello先和100形成字符串Hello100,此时+左边仍是字符串,再和33形成字符串)
System.out.println("Hello"+"10033");//Hello10033
System.out.println(100+"Hello");//100Hello
System.out.println(100+"Hello"+100+33);//100Hello10033
System.out.println(100+11+"Hello"+100+33);//111Hello10033(100+11时+号两边没有字符串,所以做数学运算)
System.out.println("5+5="+5+5); //5+5=55
System.out.println(5+5+"=5+5");//10=5+5
}
}
(六)运算符
- 什么是运算符
对常量和变量进行操作的符号称为运算符 - 运算符的分类
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三目运算符
1.算术运算符
+ , - , * , / , % , ++ , --
案例演示
class A{
public static void main(String[] args){
int a=10;
int b=3;
int num=1;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);//整数相除,取的是商
System.out.println(a*1.0/b);//将a转换为double型,除b,结果为double型,保留了小数
System.out.println(a%b);//取余数
//单独使用自增、自减运算符时,运算符在前在后结果一样
num++;
++num;
num--;
--num;
//参与运算使用时,++在前,先自增,再使用;++在后,先使用,再自增
int r=num++;
System.out.println(r);
System.out.println(num);
num=1;
int sum=3+(num++)-1+(num--)+1+(++num)+2+(++num)+10;
System.out.println(sum);
System.out.println(num);
}
}
结果
注意事项:
- 整数相除只能得到整数。如果想得到小数,请使用浮点数
- /获取的是除法操作的商,%获取的是除法操作的余数
- %运算结果的符号,取决于参与运算时左边的符号
2.赋值运算符
=,+=,-=,*=,/=,%=
案例演示
class A{
public static void main(String[] args) {
//赋值运算符 = += -= *= /= %=
int a=10;//把右边这个整数常量10 赋值给左边这个int类型的变量a
int b=10;
b=b+10; //等价于 b+=10; 累加;其他几个赋值运算符同理
byte num=10;
//num=num+10;会报错:不兼容的类型,byte自动类型提升为int了
num+=5;//不会报错 会判断累加完的结果,在不在这个数据类型的范围内,如果不在会自动强制类型转换
System.out.println(num);//15
}
}
注意事项:
- 基本的赋值运算符:=
把=右边的数据赋值给左边。 - 扩展的赋值运算符:+=,-=,*=,/=,%=
+= 把左边和右边做加法,然后赋值给左边。 - 赋值运算符要求左边的数据必须是一个变量
3.比较运算符
<,>,>=,<=,==,!=,instanceof
案例演示
class A{
public static void main(String[] args) {
//比较运算符<,>,>=,<=,==,!=,instanceof
//比较运算符的运算结果是布尔类型 区分 =和 == 号
int a=10;
int b=20;
boolean flag1=a==b;
boolean flag2=a>b;
boolean flag3=a<=b;
boolean flag4=a!=b;
System.out.println(flag1);
System.out.println(flag2);
System.out.println(flag3);
System.out.println(flag4);
}
}
结果
4.逻辑运算符
&(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)
1.注意事项:
逻辑运算符一般用于连接boolean类型的表达式或者值。
在Java中我们要表示一个数大于3并且小于6 ,不可以写成3<x<6,应该写成 x>3 & x<6 。
2.案例演示
class A{
public static void main(String[] args) {
// 逻辑运算符的运算结果也是boolean类型
int a=10 ;
int b=20;
//& 并且 运算两端只要任意一端是false,其最终结果都是false,只有两端都为true最终结果才是true
boolean flag1=a>10&b<10;//false
boolean flag2=a==10&&b>10;//true
boolean flag3=true&&false;//false
// | 或者 运算两端只要任意一端为true,其最终结果都是true,只有两端都是false最终结果才是false
boolean flag4=a==20|b>10;//true
boolean flag5=false|false;//false
boolean flag6=a>10|b<100;//true
//! 取反 true变false false变true
System.out.println(!(a==b));
// ^(异或) 相同为false 不同为true
System.out.println(false ^ false);
System.out.println(true ^ true);
System.out.println(a>b^a<b);
System.out.println("---------------------------------------------------------");
// &(并且) , |(或者) 和 &&(短路与) , ||(短路或) 的区别
//他们在运算结果上没有区别,区别在运算效率上
boolean flag7=a<10&(b++)>10; //&两端都需要运算 &&只要左端为false 右端不需要运算,只有左端为true 右端才要运算
System.out.println(flag7);
System.out.println(b);
b=20;
boolean flag8=a<10&&(b++)>10;
System.out.println(flag8);
System.out.println(b);//b结果为20不变,因为短路右端未参与运算
boolean flag9=a==10|(b++)>10; // | 两端都需要运算,|| 只要左端为true 右端就不需要运算,只有左端为false 右端才要运算
System.out.println(flag9);
System.out.println(b);
b=20;
boolean flag10=a==10||(b++)>10; // | 两端都需要运算,|| 只要左端为true 右端就不需要运算,只有左端为false 右端才要运算
System.out.println(flag10);
System.out.println(b);//b结果为20不变,因为短路右端未参与运算
}
}
结果
3.&与&&、|与||的区别
- 最终结果一样,区别在于效率上。
- &和|两边都会执行。
- &&具有短路效果。左边是false,右边不执行。
- ||具有短路效果。左边是true,右边不执行。
4.结论:
- &逻辑与:有false则false。
- |逻辑或:有true则true。
- ^逻辑异或:相同为false,不同为true。
- !逻辑非:非false则true,非true则false。
特点:偶数个不改变本身。 - 开发中常用&&,||,!
5.位运算符
&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
注意事项:位运算符是直接对二进制补码进行运算。
1.规律:
- &:有0则0
- |:有1则1
- ^:相同则0,不同则1
- ~:按位取反 0变1 1变0
- <<:左移 空位补0,被移除的高位丢弃。
- >>:右移 被移位的二进制如果最高位是0,右移后,空缺位补0;如果最高位是1,高位补1。
- >>>:无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。
2.案例演示
class A{
public static void main(String[] args) {
System.out.println(3&4); //0
/*
00000011 补码
& 00000100 补码
--------------------------------------------
00000000 补码
*/
System.out.println(3|4); //7
System.out.println(3^4); //7
System.out.println(~3); //-4
// << : 把<<左边的数据乘以2的移动次幂 例如 10<<3 结果 10*2^3=80
// >> : 把>>左边的数据除以2的移动次幂 例如 40>>3 结果 40/2^3=5
System.out.println(3>>2); //3/2^2=0
System.out.println(3<<2); //3*2^2=12
//^ 特点 一个数被另外一个数位异或两次该数不变
System.out.println(3^4^4);//3
System.out.println(3^4^3); //4
}
}
结果
3.面试题
请实现两个整数变量的交换。
int a=10;
int b=20;
- 方式一:(找一个中间变量)
int t;
t=a;
a=b;
b=t;
- 方式二:(利用位异或运算符^的特点:一个数据被另一个数据位异或两次,该数本身不变)
a=a^b;
b=a^b;
a=a^b;
- 方式三:
a=a+b;
b=a-b;
a=a-b;
- 方式四:(一句话)
b=(a+b)-(a=b);
6.三目运算符
1.三元(三目)运算符的格式
(关系表达式) ? 表达式1 : 表达式2;
int a=(10>20)?30:50; a=50
2.三元运算符的执行流程
计算关系表达式的值,如果为true, 运算后的结果是表达式1;
如果为false,运算后的结果是表达式2;
3.案例演示
获取两个数中的最大值
class A{
public static void main(String[] args){
int a=10;
int b=20;
int max=a>b?a:b;
System.out.println("最大值是:"+max);
}
}
结果
获取三个数中的最大值
class A{
public static void main(String[] args) {
int a=10;
int b=20;
int c=30;
int max=a>b?a:b;
int max2=max>c?max:c;
System.out.println("最大值是"+max2);
}
}
结果