1、变量
变量的作用就是用来接收,保存,传递,操作数据
- 使用规则:
- 先声明,在赋值,在使用
- 变量的种类:
- 类型划分
- 基本类型变量(byte short int long float double char boolean)
- 引用类型变量(类类型,接口类型,数组类型)
- 范围划分
- 局部变量
- 实例变量
- 类型划分
-
局部变量
局部变量:定义在方法中的变量
例如:
public void test(int x){ int a =1; }
注意局部变量没有默认值,如果只声明了一个类型而不赋值,编译会报错
还以,方法的参数(int x)也是局部变量,作用范围也在整个方法中
作用的范围:包裹在大括号里面,一旦超过了这个范围,这个变量就不能使用了
-
实例变量
实例变量就是类中的属性,也叫成员变量(非静态)
例如
public class Test{ public int a; }
这里指的注意的是实例变量即使不赋值也会有一个默认值
不同类型的实例变量,它们的默认值是:
- byte类型,默认值为0
- short类型,默认值为0
- int类型,默认值为0
- long类型,默认值为0L
- float类型,默认值为0.0F
- double类型,默认值为0.0D
- boolean类型,默认值false
- char类型,默认值是’\u0000’
- 引用类型,默认值是null
实例变量的作用范围是当前坐在的类中所有的方法中(非静态)
2、操作符
对常量和变量进行操作的符号称为操作符
-
赋值操作符
操作符 作用 例子 = 最基础的赋值操作符,=号右边的值,赋给=号左边变量 int a = 1; int x = 0; *= 一个变量和另一个数据相乘,并把结果再赋值给这个变量 int a = 1; a*=2; //a = a*2; /= 一个变量和另一个数据相除,并把结果再赋值给这个变量 int a = 2; a/=2; //a = a/2; %= 一个变量和另一个数据相余,并把结果再赋值给这个变量 int a = 5; a%=2; //a = a%2; += 一个变量和另一个数据相加,并把结果再赋值给这个变量 int a = 5; a+=2; //a = a+2; -= 一个变量和另一个数据相减,并把结果再赋值给这个变量 int a = 5; a-=2; //a = a-2; -
a++和++a的区别
a++是先执行再自增1,++a是先自增1再执行
- a++
int a =1; int b = a++;//此时 b的值为1 a的值为2
- ++a
int a =1; int b = ++a;//此时a,b的值都为2
-
-
比较操作符
操作符 作用 例子 > 比较是否大于 1>0 >= 比较是否大于等于 1>=0 < 比较是否小于 1<2 <= 比较是否小于等于 1<=2 instanceof 判断对象是否属于指定类型 stu instanceof Student instanceof,判断一个指定的对象,是否【属于】另一个指定的类型
person o; System.out.println(o instanceof Person);//这里编译会报错 //这是因为 Person o;并没有创建一个对象 Person o = new Person(); //表示引用o所指向的对象,是不是属于Person类型 System.out.println( o instanceof Person );//这里编译通过,结果为true
-
相等操作符
操作符 作用 例子 == 比较两边的数据是否相等,相等返回true,不相等返回false 1==2,o1 == o2 != 比较两边的数据是否不相等,相等返回false,不相等返回true 1!=2,o1!=o2 可以用在俩个数字之间的判断,也可以用俩个对象之间的判断。
-
算术操作符
操作符 作用 例子 + 数字之间使用+,表示俩个值相加 int a = 1+1; - 两个数字相减 int a = 1-1; * 两个数字相乘 int a = 1*1; / 两个数字相除 int a = 1/1; % 两个数字取余 int a = 5%2; 注意,使用+号,也可以连接(拼接)俩个字符串,数值也可以和字符串使用+号连接,连接之后的结果还是字符串
-
移位操作符
操作符 作用 例子 >> 算术右移位运算,也叫做【带】符号的右移运算 8 >> 1 << 左移位运算 8 << 1 >>> 逻辑右移位运算,也叫做【不带】符号的右移运算 8 >>> 1 **>>**右移位运算
int a=3;intb=a>>2
a对应的二进制:0000 0000 0000 0000 0000 0000 0000 0011
a再右移位之后:0000 0000 0000 0000 0000 0000 0000 0000
此时b的值为0
这个操作的本质上其实是除以2n,这个n就是我们右移的位数,例如b=a/22
注意,正数右移之后,最左边空出的位置,都要补0
注意,负数右移之后,最左边空出的位置,都要补1<<左移位运算
int a=3;intb=a<<2
a对应的二进制:0000 0000 0000 0000 0000 0000 0000 0011
a再右移位之后:0000 0000 0000 0000 0000 0000 0000 1100
此时b的值为12
这个操作的本质上其实是乘以2n,这个n就是我们左移的位数,例如b=a*22
注意,无论正数负数左移之后,最右边空出的位置,都要补0
注意,当左移之后,得到的数字已经超出当前类型所能表示的最大值的时候,这个值最终会被限定到这个当前类型中 ,所以最终显示的值会和我们逻辑上算出的值有所不同。
例如:直接使用2进制表示数字
int a = 0b01000000000000000000000000000000;
int result = a<<2; //其实这个结果已经超出了int能表示的最大值
System.out.println(result); //结果是0特殊情况:
int a = 0b00000000000000000000000000000001;
System.out.println(a<<32); //结果是1 相当于1<<0
System.out.println(a<<33); //结果是2 相当于1<<1
System.out.println(a<<34); //结果是4 相当于1<<2
原因:
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模/取余。如果对int型移动33位,实际上只移动了33%32=1位。如果对int型移动32位,实际上只移动了32%32=0位 -
位运算符
操作符 作用 例子 &(有0则0) 与运算 1&1=1,1&0=0, 0&1=0, 0&0=0 |(有1则1) 或运算 1|1=1,1|0=1,0|1=1,0|0=0 ^(相同则0,不同则1) 异或运算 1^1=0, 0^0=0, 1^0=1, 0^1=1,相同为0,不同为1 ~(取反包括符号位) 取反运算 0 -> 1 ,1 -> 0 一个数异或另外一个数 5105=10
//交换两变量的值 //使用中间变量的情况 int a = 1; int b = 2; int temp = a; //a:1 b:2 temp:1 a = b;//a:2 b:2 temp:1 b = temp;//a:2 b:1 //不是使用中间变量,使用+ -操作 int a = 1; int b = 2; a = a+b;//a:3 b:2 b = a-b;//a:3 b:1 a = a-b;//a:2 b:1 //不是使用中间变量,使用^操作 int a = 1; int b = 2; a = a^b; b = a^b; a = a^b;
-
逻辑运算符
- 短路与(逻辑与)&&
再短路与中如果有一个false,那么整个表达式的结果就是false例如:2>1&&1<0&&1>2,在这表达式中结果为true&&false&&false,在进行第二个运算的时候已经为false,那么后面的表达式就不用再继续判断。
int a = 1; int b = 5; boolean result; // a>4 这布尔表达式为false // 后的(b++)>1就不需要计算了 // 因为当前是短路与(&&)运算,第一个false已经能够决定整个表达式的结果了 result = a>4 && (b++)>1; System.out.println(result);//false System.out.println(b);//输出5 // 这种情况下,a>0为true // 必须要再进行后面表达式的计算,最终才能得到结果,所以要计算后的(b++)>1的部分 result = a>0 && (b++)>1; System.out.println(result);//true System.out.println(b);//输出6
|| 短路或,和上面&&的操作类似,||的逻辑是:第一个布尔表达式为true,才能决定整个表达式的结果
& 和 && 有什么区别?
&既可以作为二进制数字的位运算符,也可以作为布尔表达式中的逻辑运算符,但是作为逻辑运算符的时候,&并没有&&符合的那种短路的功能
&&只要出现了false就不再进行后面的逻辑运算,但&不论出现多少个false都会运算到底
&& 只能作为逻辑运算符,但是它会具备短路的功能。
注意,|和||的区别也是类似的;
-
条件运算符
也可以称为三目运算符
语法:
boolean表达式 ? 表达式1 : 表达式2
例如,将x和y中,较大的数赋值给变量z
int x = 10;
int y = 5;
int z;
z = (x > y) ? x : y;//三目运算符
作业:
写Test.java,要求如下:
- 传入一个int数,要求清除该数的低8位,高24位不变,将结果以十进制形式输出
public class Test{
public static void main (String[] args){
int a =65535;
int b = a>>8;
int c = b<<8;
System.out.println©;
}
}
-
传入一个int数,要求将该数的低16位置1,高16位不变,将结果以十进制形式输出
public class Test{
public static void main (String[] args){
int a =65536;
int b = a>>16;
int c = b<<16;
int result = c +65535;
System.out.println(result);
}
} -
实现两个int类型变量值的交换,要求不使用中间变量
public class Test{
public static void main (String[] args){
int a = 11,b=22;
System.out.println(“a:”+a+" b:"+b);
a = a+b;
b = a-b;
a = a-b;
System.out.println(“a:”+a+" b:"+b);
int i =11,j=22;
System.out.println(“i:”+i+" j:"+j );
i = i^j;
j = i^j;
i = i^j;
System.out.println(“i:”+i+" j:"+j );
}
}
以二进制形式输出一个十进制数
public class Test{
public static void main (String[] args){
int a = 20;
String result = Integer.toBinaryString(a);
System.out.println(result);
}
}
3. (附加题) 给出一堆数据
奇数在前并且按照升序排序
偶数在后并且按照降序排序
例如 1 ~ 10 最后的结果位
1 3 5 7 9 10 8 6 4 2
如果有相同的数据,需要将重复的数据去除掉
package com.briup.demo;
import java.util.ArrayList;
public class Sorting {
public static void main(String[] args){
int arr[]={4,1,8,3,2,5,9,6,0,7};
ArrayList list = new ArrayList();
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
for (int i = 0;i<arr.length;i++){
if (arr[i]%2!=0){
list1.add(arr[i]);
}else{
list2.add(arr[i]);
}
}
int size1=list1.size();
Integer [] array1 = (Integer[]) list1.toArray(new Integer[size1]);
int size2=list1.size();
Integer [] array2 = (Integer[]) list2.toArray(new Integer[size2]);
for (int i=0;i<array1.length;i++){
for (int j=0;j<array1.length-i-1;j++){
if (array1[j]>array1[j+1]){
array1[j]=array1[j]^array1[j+1];
array1[j+1]=array1[j]^array1[j+1];
array1[j]=array1[j]^array1[j+1];
}
}
list.add(array1[i]);
}
for (int i=0;i<array2.length;i++){
for (int j=0;j<array2.length-i-1;j++){
if (array2[j]<array2[j+1]){
array2[j]=array2[j]^array2[j+1];
array2[j+1]=array2[j]^array2[j+1];
array2[j]=array2[j]^array2[j+1];
}
}
list.add(array2[i]);
}
for(int i=0;i<list.size();i++){
System.out.print(list.get(i)+" ");
}
}
}