Java个人笔记05 变量与操作符 作业

1、变量

变量的作用就是用来接收,保存,传递,操作数据

  • 使用规则:
    • 先声明,在赋值,在使用
  • 变量的种类:
    1. 类型划分
      • 基本类型变量(byte short int long float double char boolean)
      • 引用类型变量(类类型,接口类型,数组类型)
    2. 范围划分
      • 局部变量
      • 实例变量
  1. 局部变量

    局部变量:定义在方法中的变量

    例如:

    public void test(int x){
        int a =1;
    }
    

    注意局部变量没有默认值,如果只声明了一个类型而不赋值,编译会报错

    还以,方法的参数(int x)也是局部变量,作用范围也在整个方法中

    作用的范围:包裹在大括号里面,一旦超过了这个范围,这个变量就不能使用了

  2. 实例变量

    实例变量就是类中的属性,也叫成员变量(非静态)

    例如

    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、操作符

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

  1. 赋值操作符

    操作符作用例子
    =最基础的赋值操作符,=号右边的值,赋给=号左边变量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
      
  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
    
  3. 相等操作符

    操作符作用例子
    ==比较两边的数据是否相等,相等返回true,不相等返回false1==2,o1 == o2
    !=比较两边的数据是否不相等,相等返回false,不相等返回true1!=2,o1!=o2

    可以用在俩个数字之间的判断,也可以用俩个对象之间的判断。

  4. 算术操作符

    操作符作用例子
    +数字之间使用+,表示俩个值相加int a = 1+1;
    -两个数字相减int a = 1-1;
    *两个数字相乘int a = 1*1;
    /两个数字相除int a = 1/1;
    %两个数字取余int a = 5%2;

    注意,使用+号,也可以连接(拼接)俩个字符串,数值也可以和字符串使用+号连接,连接之后的结果还是字符串

  5. 移位操作符

    操作符作用例子
    >>算术右移位运算,也叫做【带】符号的右移运算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位

  6. 位运算符

    操作符作用例子
    &(有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;
    
  7. 逻辑运算符

    • 短路与(逻辑与)&&

    再短路与中如果有一个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都会运算到底

    && 只能作为逻辑运算符,但是它会具备短路的功能。

    注意,|和||的区别也是类似的;

  8. 条件运算符

也可以称为三目运算符

语法:
boolean表达式 ? 表达式1 : 表达式2

例如,将x和y中,较大的数赋值给变量z

int x = 10;
int y = 5;
int z;
z = (x > y) ? x : y;//三目运算符

作业:
写Test.java,要求如下:

  1. 传入一个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©;
}
}

  1. 传入一个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);
    }
    }

  2. 实现两个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)+" ");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值