运算符(理解)
背下面的干货分享
package com.jr.curriculum;
import org.junit.Test;
import java.util.Scanner;
public class Demo {
@Test
public void test01(){
int a = 9;
int b = a++;//先赋值,再自增
System.out.println("a="+a+"\tb="+b);
int c = ++b;//先自增,再赋值
System.out.println("b="+b+"\tc="+c);
/*
【运算符】:模拟生活中的运算。
1.算术运算符:+ - * / %
java程序跟生活中的求商求余不一样:
生活中:5除2 = 2 余 1
java中:5 / 2 = 2 5 % 2 = 1
++ -- 都是变量自身加1/减1
int a = 9;
a++; --->a=a+1;
a--; --->a=a-1;
面试常考:a++、++a、a--、--a有什么异同
相同点:都是代表 变量a 自身加/减1
当表达式中,只有a++/++a 的时候,结果没区别
不同点:当表达式中除了a++/++a以外,还有其他功能代码的时候,就有区别了
++在前时,先进行自身的+1,再进行其他功能的操作
++在后时,先进行其他功能的操作,再进行自身的+1
*/
}
@Test
public void test02(){
int a = 9;
int b = 9;
System.out.println(a <= b);//true
String str = "吉软";//字面常量,放在常量池里(重复值不开辟空间)
String str1 = "吉软";
String str2 = new String("吉软");//new出来的,放在堆里(新开辟空间)
String str3 = new String("吉软");
System.out.println(str == str1);//true 比的是地址
System.out.println(str1 == str2);//false
System.out.println(str2 == str3);//false
System.out.println("请输入学校姓名");
Scanner input = new Scanner(System.in);
String str4 = input.next();//假设输入的是吉软 也是堆里(新开辟空间)
System.out.println(str == str4);//false
System.out.println(str2 == str4);//false
System.out.println(str.equals(str4)?"在同一所学校":"不在同一所学校");//true 三目运算符
/*
2.赋值运算符:= += -= *= /=
int a = 9;
a += 500; a = a + 500;
3.关系运算符:> < >= <= == !=
1)使用关系运算符 比较 数值内容的 大小 以及 是否相等
2)字符串的比较 是否相同用什么比较?
【数字之间的 == 是在比较内容/值 是否相同】
【字符串之间的 == 是在比较内存的空间位置 是否相同】
##########常量池规则:相同的值共用<--->堆规则:开辟新空间##########
【字符串之间的 equals() 是在比较字符串之间的内容】
4.三目运算符:逻辑表达式?语句1:语句2
逻辑表达式为真执行语句1,为假执行语句2
*/
}
@Test
public void test03(){
System.out.println(5 > 3 && 7 < 6 ? true : false);//7<6为假
System.out.println(5 > 3 & 7 < 6 ? true : false);//7<6为假
System.out.println(!(5 > 3) ? true : false);//5>3为真,取反为假
int a = 9;
if(7 < 6 && (++a) > 9){//根本没执行++a
System.out.println("条件为真");
}else {
System.out.println("条件为假");
}
System.out.println("a="+a);
/*
5.逻辑运算符:&& &并且 || |或者 !取反 ^异或
&&和&的异同?
相同点:都可以进行 表达式的逻辑判断,都代表"并且"的意思(前后表达式同时为真 结果才是真)。
不同点:
1) &&、|| 是逻辑运算符
2) &、| 既是逻辑运算符 又是位运算符
3) && 是逻辑判断的短路与(前面语句为假,后面不执行)||(前面语句为真,后面不执行)
& 不是逻辑判断的短路与(效率低,相对不安全)
*/
}
@Test
public void test04(){
/*
6.条件运算符/三目运算符:
表达式1?表达式2:表达式3
表达式1:必须是boolean
表达式2、表达式3 不限定类型,但是必须是相同类型
使用场合:简写if选择结构
7.位运算符:& | ^ ~ >> << ...
8.运算符执行顺序:
() > 递增递减 > 算数运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符 > 逗号
9.字符串运算符:
字符串拼接运算符:当 +加号 左右有一个String类型表达式的时候,+就是字符串拼接。
算数运算符:当 +加号 左右都是数字类型表达式的时候,+就是算数运算符。
*/
}
}
其他:(理解)
当表达式中除了a++/++a以外,还有其他功能代码的时候,就有区别了
++在前时,先进行自身的+1,再进行其他功能的操作
++在后时,先进行其他功能的操作,再进行自身的+1
4乘以8最快的方式: 4<<3 这里相当于4乘2的3次幂
当 +加号 左右有一个String类型表达式的时候,+就是字符串拼接。
运算符优先级:赋值<三目<逻辑<关系<算术<单目
其他:(重点)
【数字之间的 == 是在比较内容/值 是否相同】
【字符串之间的 == 是在比较内存的空间位置 是否相同】
常量池规则:相同的值共用
堆规则:开辟新空间
【字符串之间的 equals() 是在比较字符串之间的内容 是否相同】
比较String、Integer、Date的内容是否相同(比对象是地址,可重写比较对象)
&&、|| 是逻辑运算符
&、| 既是逻辑运算符 又是位运算符
&& 是逻辑判断的短路与(前面语句为假,后面不执行)||(前面语句为真,后面不执行)
选择结构:(理解)
背下面的干货分享
@Test
public void test1(){
System.out.println("请输入你的成绩");//用switch写区间的条件(比if麻烦)
Scanner input = new Scanner(System.in);
int score = input.nextInt();
switch (score){
case 100:
case 99:
case 98:
case 97:
case 96:
case 95:
case 94:
case 93:
case 92:
case 91:
case 90:
System.out.println("A级");
break;
case 89:
// ....
}
/*
《选择结构》
1.程序执行顺序分为三种:
顺序结构: {} 所有代码都 逐行(一行挨着一行,从上到下,从左到右)执行
选择结构: 根据判断的结果, 有选择性的选择一部分代码进行执行。
循环结构: 根据判断的结果, 重复执行 某一部分代码
2.选择结构:
java中的选择结构分为两种:
if选择结构: 单分支 if(boolean表达式){}
双分支 if(boolean表达式){
}else{
}
多分支 if(boolean表达式){
}else if(boolean表达式){
}else if(boolean表达式){
}else{
}
嵌套分支if(boolean表达式){
if(boolean表达式){
}else{
}
}else{
}
switch选择结构
int i = 9;
char c = '鼠'
String name = "惠常哲";
switch(byte short int char String 枚举 表达式){
case "7":
case "8":
case "9":
代码
break;
case "10":
default :
}
【if选择结构 和 switch选择结构的异同】
相同点:两者都可以做 选择分支判断
不同点:if更擅长做 区间判断
switch只能做等值判断
*/
}
其他(重点)
控制语句分为三类:顺序、选择和循环。
顺序结构:执行顺序是从上到下,从左到右,逐行执行
选择结构:if、switch
switch(表达式) 不能用于double,float类型
只能用于byte short int char String 枚举类型
在JDK1.7之后允许使用字符串(String)
循环结构:(理解)
背下面的干货分享
@Test
public void test2(){
//输出10遍今天是星期五
int i = 1;//循环的开始条件
while (i <= 10){//循环条件(结束条件)
System.out.println(i+"今天是星期五");//循环内容
i ++;//条件修改
}
i = 1;
do {//风险:不管如何都执行一遍(例如登录不管密码对不对都进入)
System.out.println(i);
i++;
}while (i <= 10);
for (i = 1; i <= 10; i++) {
System.out.println("i"+i);
}
/*
3.循环结构:
1)Java中的循环结构 4种: while、do...while、for、增强for=foreach
while一般用于循环次数不固定的情况
2)循环结构根据循环次数可以分为: 固定循环次数 不固定循环次数
3)所有的循环结构 都是由两部分组成:
循环条件:开始条件(循环开始前写) 循环条件(循环结构的小括号里) 条件修改(循环内容的最后一行)
循环内容:重复做的内容
*/
}
其他:(重点)
IDEA快捷键:fori
循环结构有:while、do-while、for、foreach
循环的内部结构:开始条件、循环条件、条件修改、循环内容
面试题(重点)
8种基本数据类型及其字节数
数据类型 | 关键字 | 字节数 | |
---|---|---|---|
数值型 | 整数型 | byte | 1 |
数值型 | 整数型 | short | 2 |
数值型 | 整数型 | int | 4 |
数值型 | 整数型 | long | 8 |
数值型 | 浮点型 | float | 4 |
数值型 | 浮点型 | double | 8 |
布尔型 | boolean | 1**(位)** | |
字符型 | char | 2 |
i++和++i的共同点:
1、i++和++i都是变量自增1,都等价于i=i+1
2、如果i++,++i是一条单独的语句,两者没有任何区别
3、i++和++i的使用仅仅针对变量。 5++和++5会报错,因为5不是变量。
i++和++i的不同点:
如果i++,++i不是一条单独的语句,他们就有区别
i++ :先运算后增1。如:
int x=5;
int y=x++;
System.out.println("x="+x+", y="+y);
//以上代码运行后输出结果为:x=6, y=5
++i : 先增1后运算。如:
int x=5;
int y=++x;
System.out.println("x="+x+", y="+y);
//以上代码运行后输出结果为:x=6, y=6
&和&&的区别和联系,|和||的区别和联系
&和&&的联系(共同点):
&和&&都可以用作逻辑与运算符
,但是要看使用时的具体条件来决定。
操作数1&操作数2,操作数1&&操作数2,
表达式1&表达式2,表达式1&&表达式2,
情况1:当上述的操作数是boolean类型变量时,&和&&都可以用作逻辑与运算符。
情况2:当上述的表达式结果是boolean类型变量时,&和&&都可以用作逻辑与运算符。
表示逻辑与(and),当运算符两边的表达式的结果或操作数都为true时,整个运算结果才为true,否则,只要有一方为false,结果都为false。
&和&&的区别(不同点):
(1)、&逻辑运算符称为逻辑与运算符,&&逻辑运算符称为短路与运算符,也可叫逻辑与运算符。
对于&:无论任何情况,&两边的操作数或表达式都会参与计算。
对于&&:当&&左边的操作数为false或左边表达式结果为false时,&&右边的操作数或表达式将不参与计算,此时最终结果都为false。
综上所述,如果逻辑与运算的第一个操作数是false或第一个表达式的结果为false时,对于第二个操作数或表达式是否进行运算,对最终的结果没有影响,结果肯定是false。推介平时多使用&&,因为它效率更高些。
(2)、&还可以用作位运算符。当&两边操作数或两边表达式的结果不是boolean类型时,&用于按位与运算符的操作。
|和||的区别和联系与&和&&的区别和联系类似
用最有效率的方法算出2乘以8等于多少
使用位运算来实现效率最高。位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数。对于位运算符“<<”, 是将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,位运算cpu直接支持的,效率最高。所以,2乘以8等于几的最效率的方法是2 << 3。
基本数据类型的类型转换规则
基本类型转换分为自动转换和强制转换。
自动转换规则:容量小的数据类型可以自动转换成容量大的数据类型,也可以说低级自动向高级转换。这儿的容量指的不是字节数,而是指类型表述的范围。
*强制转换规则:*高级变为低级需要强制转换。
如何转换:
(1)、赋值运算符“=”右边的转换,先自动转换成表达式中级别最高的数据类型,再进行运算。
(2)、赋值运算符“=”两侧的转换,若左边级别>右边级别,会自动转换;若左边级别 == 右边级别,不用转换;若左边级别 < 右边级别,需强制转换。
(3)、可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,前提是不超出其表述范围,否则必须进行强制转换。