Java.基础(学习笔记)

/*
1 标识符
    1.1. 在程序中所定义的一些名称,由26个英文字母大小写,数字0-9,符号:_$组成
    1.2 定义合法的标识符规则:
        a.数字不可以开头
        b.不可以使用关键字
        c.Java中严格区分大小写,在起名字时,为了提高阅读性,尽量起有意义的名字。
 
2 常量与变量
    2.1 常量:常量表示不能改变的数值
    2.2. Java中的常量分类:
        a.整数常量。所有整数
        b.小数常量。所有小数
        c.布尔型常量。较为特有,只有2个数值。true false
        d.字符常量。将一个数字字母或者符号用单引号(‘’)标识。
        e.字符串常量。将一个数字字母或者符号用双引号(“”)标识。
        f.null常量。只有一个数值就是null
        g.对于整数Java有三种表现形式:
            a)十进制:0-9满10进1。
            b)八进制:0-7满8进1,用0开头表示。
            c)十六进制:0-9,A-F,满16进1,用0x表示。
3 进制转换
    a.十进制转二进制:  原理:对十进制数进行除2运算  
    b.二进制转十进制:  原理:二进制乘以2的过程        
    c.转八进制:     原理:先转换成二进制,在转成八进制,3个代表一位 
    d.转十六进制:        原理:先转换成二进制,在转成十六进制,4个代表一位(可以做最低四位与运算)
    e.负数的二进制表现形式:   原理:将二进制的0变成1,1变成0
    ============================================================================
    例子:-6,在内存中的实际是如下样子的 取反+1 反码是-1取反
        -6在内存中的表现形式: 0000-0000 0000-0000 0000-0000 0000-0110
        对他进行取反运算:    1111-1111 1111-1111 1111-1111 1111-1001
        然后在加1:          0000-0000 0000-0000 0000-0000 0000-0001
                ---------------------------------------------------
                      1111-1111 1111-1111 1111-1111 1111-1010 = -6
    =============================================================================
    f.整数的最高位是0,负数的最高位是1,1是由取反取来的。
 
4 变量
a.变量:就是将不确定的数据进行存储。也就是需要在内存中开辟一个空间。
    例:
*/
class VarDemo
{
    public static void main(String[] args)
    {
    //定义变量的格式:
    //数据类型 变量名 = 初始化值
    //Or
    //数据类型 变量名
    //变量名 = 初始化值
    }
}
/*
b.数据类型:
    byte (number, 1 byte)
    short (number, 2 bytes)
    int (number, 4 bytes)
    long (number, 8 bytes)
    float (float number, 4 bytes)
    double (float number, 8 bytes)ee
    char (a character, 2 bytes)
    boolean (true or false, 1 byte)
 
5 类型转换
    a.自动类型转换:
*/
class TypeDemo1
{
    public static void main(String[] args)
    {
        byte b = 3;
        b = b + 2;
        System.out.println(b);
        /*
        会报错,这是因为JAVA是强类型语言导致的
        两个不同类型的数值进行运算会进行自动类型提升,默认是小的类型往大
        的转换             
        */
    }
}
 
//b.强制类型转换:
class TypeDemo2
{
    public static void main(String[] args)
    {
        byte b = 3;
        b = (byte)(b + 2);  //这里将b+2的和强制转换成byte类型再赋值给B
        System.out.println(b);   
    }
}
//c.引出的疑问
class TypeDemo3
{
    public static void main(String[] args)
    {
        System.out.println('a' + 1); //打印98,是因为ascii码的原因
        System.out.println((char)('a' + 1)) //这里强制转换,打印b  
    }
}
 
//6 运算符
//6.1 算术运算符
class OperateDemo1  //算术运算符+-*/
{
    public static void main(String[] args)
    {
        int x = 4270;
        x = x / 1000 * 1000;
        System.out.println(x);   //2个int数据进行运算还是int行,结果为4000
    }
}
 
class OperateDemo2   //取模运算%
{
    public static void main(String[] args)
    {
        System.out.println(10%4); //取模,实际就是取余数,左边小于右边,结果是左边,左边等于右边结果是0,右边是1结果是0
        System.out.println(1%-4); //结果等于1
        System.out.println(-1%4); //结果等于-1,由以上得出,对一个负数取模,只看左边
    }
}
 
class OperateDemo3  //自曾自减++
{
    public static void main(String[] args)
    {
        int a = 3,b;  //定义了2个变量,a初始化值为3,b没有值,不能直接被使用
        b = a++;  //对a进行+1操作,并把+1后的值重新赋值给a
        System.out.println(b);  //3
        System.out.println(a);  //4
        System.out.println("a=" + a + ",b=" + b); //利用字符串连接符打印
        /*
        由上引出的疑问,为什么b是3?
        原因是b = a++ 是先把a的值赋值给b然后a再进行++运算
        而b = ++a 是先把a的值进行++运算,再赋值给b
        */
    }
}
 
class OperateDemo4  //字符串连接符+
{
    public static void main(String[] args)
    {
        System.out.println("haha" + "haha"); //字符串和任何数据使用+都是相连接,最终都会变成字符串
        System.out.println("MyNameIs" + 5 + 5); //打印MyNameIs55,把固定的值放到""里面去,把不固定的用+相连接就可以了
    }
}       
    //6.2 转意字符
class OperateDemo5 //通过\来转变后面字母或者符号的含义
{
    public static void main(String[] args)
    {
        System.out.println("Hello \nWorld!");  //用2行来输出,现在我们想载Hello World中间进行换行那么就在\n
        System.out.println("MyNameis Crow!"); 
        System.out.println("\"Hello World!\"");  //用\来转意"
        /*
            \n: 换行
            \b: 退格,相当于backspace
            \r: 按下回车键,Linux用\r,Windows系统中回车符是由2个字符表示的\r\n
            \t: 制表符,相当于tab键
        */
    }
}
 
    //6.3 赋值和比较运算符 
        //a.赋值运算符
class OperateDemo6 // += -= *= /= %=
{
    public static void main(String[] args)
    {
        int x = 3; //把右边赋值给左边
        x+=4; //x = x + 4把右边和左边的和赋值给左边,其他同理
    }
}
 
        //b.比较运算符
class OperateDemo7 //> < >= <= == !=
{
    public static void main(String[] args)
    {
       if(4 == 3) //相等于,运算完的结果要么是true要么是false
        {
            System.out.println("true");                 
        }else
        {
            System.out.println("false");
        }
       if(4 != 3) //不等于,运算完的结果要么是true要么是false
        {
            System.out.println("true");                 
        }else
        {
            System.out.println("false");
        }
    }
}
         
    //6.4 逻辑运算符
class OperateDemo8 //逻辑运算符用来连接boolean类型的表达式
{
    public static void main(String[] args)
    {
                /*
                 & And(与)说白了就是并且的意思
                    无论左边是true还是false,右边都运算
                 | Or (或)
                    两边都参与运算
                 ^ Xor(异或)
                 ! Not(非) 取反,一元运算符
                 &&And(短路)
                    当左边为false时,右边不运算
                 ||Or (短路)
                    当左边为true时,右边不运算
 
                 
                int x = 4;
                x>3 & x<6 = true & true = true;
                true & true = true;
                true & false = false;
                false & true = false;
                false & false = false;
                & : 只要两边的boolean表达式结果,有一个为false,结果就为false,只有两边都为true,结果才为true
                 
                true | true = true;
                true | false = true;
                false | true = true;
                false | false = false;
                | : 只要两边的boolean表达式结果,有一个为true,结果为true,只有两边都为false,结果才为false
 
                true ^ true = false;
                true ^ false = true;
                false ^ true = true;
                false ^ false = false;              
                ^: 就是和|有点不一样,当true ^ true时候为false,两边相同结果为false,两边不同结果是true
                */
    }
}
 
    //6.5 位运算符
class OperateDemo9
{
    public static void main(String[] args)
    {
        3<<2 //3左移2位,打印12,最高位原来的值是什么,就补什么
        //0000-0000 0000-0000 0000-0000 0000-0011
        //0000-0000 0000-0000 0000-0000 0000-1100  左移以后为12,左移就是乘以2的n次方
                 
        6>>2 //6又移2位
        //0000-0000 0000-0000 0000-0000 0000-0110
        //0000-0000 0000-0000 0000-0000 0000-0001 //右移以后为1,右移就是除以2的n次方
                 
        //>>> 无符号右移,不管最高位原来值是什么,都拿0补齐
    }
}
 
class OperateDemo10
{
    public static void main(String[] args)
    {
    /*
        6 & 3 = 2 //只要一边为false,结果就为false
        110   0 代表false
           &011   1 代表true
        -----
        010  = 2 
 
        6 | 5 = 7 //只要一边为true,结果就为true
        110
           |101
        ----
        111 = 7
 
        6 ^ 5 = 3 //两边相同为false
        110
           ^101
        ----
        011 = 3
 
        ~ //反码,就是二进制-1再取反
        System.out.println(~6); //-7
    */
    }
}
 
class OperateDemo11 //简单的思考,有趣的问题
{
    public static void main(String[] args)
    {
    /*
        7 ^ 4 ^ 4= 7
        111
           ^100
        ---
        011
           ^100
        ---
        111  = 7 //7^4^4结果=7
        //一个数异或同一个数2次,结果还是那个数,这个特性可以用来做简单的加密
    */
    }
}
 
    //6.6 位运算符练习
        //a.对2乘以8进行运算
            //a)因为是2的倍数,最有效的方式是用<<运算。
        //b.对两个整数的值进行互换
class OperateDemo12
{
    public static void main(String[] args)
    {
        int n = 3, m = 8;
        //1通过第三方变量
        int temp;
        temp = n;
        n = m;
        m = temp;
        //2不用第三方变量,如果n和m的值非常大,容易超出int范围
        n = n + m; //n = 11
        m = n - m; //m = 3
        n = n -m   //n = 8
 
        n = n ^ m;
        m = n ^ m; //(n^m)^m
        n = n ^ m; //n^(n^m)
    }
}
 
/*
      6.7 三元运算符
        格式:
            (条件表达式)?表达式1:表达式2
            如果条件结果为true,那么执行表达式1
            如果条件结果为false,那么执行表达式2
            三元运算符:
                好处:可以简化代码
                弊端:因为是一个运算符,所以运算为必须要有一个结果
*/
class OperateDemo13
{
    public static void main(String[] args)
    {
        int x = 3,y;
        y = (x>1)?100:200; //如果x的值>1那么把100赋值给y,如果<=1那么把200赋值给y
        System.out.println(y);
    }
}
 
//7 流程控制语句
    //7.1 判断结构
        //if 有3种形式
//a)
class IfDemo1
{
    public static void main(String[] args)
    {
        int x = 3;
        if(x>1)
        {
            System.out.println("Yes");
        }
        System.out.println("Over"); //这里无论If是否满足都执行,因为此句不再if控制区间内
    }
}
 
//b)
class IfDemo2
{
    public static void main(String[] args)
    {
        int x = 3;
        if(x>1)
        {
            System.out.println("Yes");
        }else
        {
            System.out.println("No"); //这里受else控制
        }
                         
    }
}
         
//c)
class IfDemo3
{
    public static void main(String[] args)
    {
        int x = 3;
        if(x>1)
        {
            System.out.println("x > 1");
        }else if (x == 1){
            System.out.println("x == 1");
        }else{
            System.out.println("No");
        }
                         
    }
}           
/*
      7.2 选择结构
        缺点:if能够判断区间,case不能,因为要判断区间必须把值全写出来,很费劲
             switch不能判断boolean值的类型
     
        switch(表达式) //表达式的值只能是4种类型byte short int char
        {
            case 取值1: //case和default的顺序是随意的,但是执行是从case开始的
                执行语句;
            break;
            case 取值2:
                执行语句;
            break;
            ......
            default:
                 执行语句;
            break;  //语句可以从break跳出,也可以从}结束
        }
*/
 
//a)
class SwitchDemo1
{
    public static void main(String[] args)
    {
        int x = 2;
        switch(x)
        {
            case 1:
                System.out.println("1");
                break;
            case 2:
                System.out.println("2");
                break;
            case 3:
                System.out.println("3");
                break;
            case 4:
                System.out.println("4");
                break;
            default:
                System.out.println("default");
                break;   //最后这个break可以省略
        }
                         
    }
}
 
//b)
class SwitchDemo2
{
    public static void main(String[] args)
    {
    //需求,根据用户指定月份,打印该月份所属的季节
    //3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12 1 2 冬季
        int x = 4;
        switch(x)
        {
            case 3:
            case 4:
            case 5:
                System.out.println(x + "月是春季");
                break;
            case 6:
            case 7:
            case 8:
                System.out.println(x + "月是夏季");
                break;
            case 9:
            case 10:
            case 11:
                System.out.println(x + "月是秋季");
                break;
            case 12:
            case 1:
            case 2:
                System.out.println(x + "月是冬季");
                break;
            default:
                System.out.println("NoNo");
        }
                         
    }
}
/*            switch应用场景:如果判断的具体数值不多,而且符合byte short int char这四种类型,虽然两个语句都
              可以使用,建议使用switch语句,因为效率稍高。
              其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广
*/
/*
      7.3 循环结构
      循环语句的特点:当一个语句需要循环很多次的时候使用,while或者for语句
      只是考虑变量的作用域问题
        a.while语句
            定义初始化表达式
            while(条件表达式)
            {
                执行语句;           
            }
*/
//a)
class WhileDemo1
{
    public static void main(String[] args)
    {
        int x = 1;
        while(x < 3) //条件满足,执行控制区间中的语句
        {
            System.out.println("Hello World!"); //打印2次
            x++;
        }
                         
    }
}
         
/*
          b.do while语句
            定义初始化表达式
            do
            {
                执行语句;
            }
            while(条件表达式); //do while最后判断条件,也就意味着do while无论如何都会执行至少一次
*/
//a)
class WhileDemo2
{
    public static void main(String[] args)
    {
        int x =1;
        do
        {
            System.out.println("Hello World!"); //打印2次
            x++;                            
        }
        while(x < 3);
                         
    }
}
//b)while无限循环最简单的表现形式
class WhileDemo3
{
    public static void main(String[] args)
    {
        while(true){}
    }
}
/*c.for语句
            for(初始化表达式;循环条件表达式;循环后的操作表达式)
            {
                执行语句;
            }
*/
//a)
class ForDemo1
{
    public static void main(String[] args)
    {
        for(int x = 0; x<3; x++)
        {
            System.out.println("Hello World!");
        }
    }
}
/*
              for和while的区别:
              for的变量作用域范围只能载for语句中有效,那么对于变量来讲,如果这个变量只作用与循环的增量
              来存在的话,那么建议使用for
*/
//b)
class ForDemo2
{
    public static void main(String[] args)
    {
        int x = 1;
        for(System.out.println("a"); x<3; System.out.println("c"))  //疑问,有结果吗?结果是什么?
        {
            System.out.println("d");
            x++;
        }
    }
}
                //由上可只for必须要有真假,不要一位写for循环就一定要写int x = 1;只要是合法的表达式就可以
//c)
class ForDemo3
{
    public static void main(String[] args)
    {
        int x = 1;
        for(System.out.println("a"); x<3; System.out.println("c"),x++)  //多个表达式出现的时候用,分开就可以了
        {
            System.out.println("d");
        }
    }
}
 
//d)for无限循环最简单的表现形式
class ForDemo4
{
    public static void main(String[] args)
    {
        for(;;){}  //对于for来讲,如果不写循环条件表达式,默认为true
    }
}
 
//e)获取1~10的和,并打印
    //e.a)利用while循环来实现
class ForDemo4
{
    public static void main(String[] args)
    {
        int sum = 0;
        int x = 1;
        while(x <= 10)
        {
            sum = sum + x;
            x++;
        }
        System.out.println("sum= " + sum);
    }
}
 
                //e.a)利用for循环来实现
class ForDemo5
{
    public static void main(String[] args)
    {
        int sum = 0;
        for(int x = 1; x <= 10; x++)
        {
            sum += x;
        }
        System.out.println("sum= " + sum);
    }
}
             
            //e)for语句嵌套
class ForDemo6
{
    public static void main(String[] args)
    {
        for(int x = 0; x < 3; x++)
        {
            for(int y = 0; y < 4; y++) //此循环体结束后才会执行父循环体
            {
                System.out.println("ok");
            }
        }
    }
}
 
    //7.4 其他流程控制语句
        //a.break(跳出)
class BreakDemo1
{
    public static void main(String[] args)
    {
        for(int x = 0; x<3; x++)
        {
            System.out.println("x= " + x);
            break; //跳出,这时候循环语句就结束了,break只能跳出当前循环
        }
    }
}
 
class BreakDemo2
{
    public static void main(String[] args)
    {
        w:for(int x = 0; x<3; x++)  //这里可以给for循环加标记
        {
            for(int y = 0; y<4; y++)
            {
                System.out.println("x= " + x);
                break w; //这里跳转到指定标记
            }
        }
    }
}
 
        //b.continue(继续)
class ContinueDemo1
{
    public static void main(String[] args)
    {
        for(int x = 0; x<3; x++)
        {
            if(x%2==1)
            {
                continue;  //continue结束本次循环,继续下一次循环,continue也可以加标记        
            }
            System.out.println("x= " + x);
        }
    }
}
/*
8 函数
    8.1 什么是函数?
        函数就是定义在类中的具有特定功能的一段独立小程序。
        函数也称为方法
    8.2 函数的格式:
        修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2, ...)
        {
            执行语句;
            return 返回值;
        }
        返回值类型: 函数运行后的结果的数据类型
        参数类型: 是形式参数的数据类型
        形式参数: 是一个变量,用于存储调用函数时传递给函数的实际参数
        实际参数: 传递给形式参数的具体数值
        return: 用于结束函数
        返回值: 该值会返回给调用者
    8.3 example:
*/
        //a.需要定义一个功能,打印x*3+5
class FunctionDemo1
{
    public static void main(String[] args)
    {
        int x = getResult(4); //这里调用函数
    }
 
    public static int getResult(int x) //函数定义在类中,被调用才执行
    {
        return x * 3 + 5;
    }
}
/*  
    8.4 函数的特点
        定义函数可以将功能代码进行封装,便于对该功能进行复用
        函数只有被调用才会执行
        函数的出现提高了代码的复用性
        对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的
        return语句如果在最后一行可以省略不写
        注意:
            函数中只能调用函数,不可以在函数内部定义函数
            定义函数时,函数结果应该返回给调用者,交由调用者处理
    8.5 没有具体返回值的情况
        a.//void练习,当函数没有返回值的时候,return可以不写
*/
class FunctionDemo2
{
    public static void main(String[] args)
    {
        getResult(4); //这里调用函数
    }
 
    public static void getResult(int x) //当函数运算后没有具体的返回值时,这是返回值类型用void来标识
    {
        System.out.println(x * 3 + 5;);
    }
}
/*
    8.6 函数的重载
        在同一个类中,允许存在一个以上同名函数,只要它们的参数个数或者参数类型不同即可重载
        重载示例:
            //返回两个整数的和
            int add(int x, int y){return x+y;}
            //返回三个整数的和
            int add(int x,int y,int z)return x+y+z;}
            //返回两个小数的和
            double add(double x,double y){return x+y;}
 
9 数组
    9.1 数组的定义:同一种类型的数据的集合,其实数组就是一个容器
    9.2 数组的好处:可以自动的给数组中的元素从0开始编号,方便操作这些元素
    9.3 数组的格式:
        a.格式1:
            元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
            示例: int[] arr = new arr[5];
        b.格式2:
            元素类型[] 数组名 = new 元素类型[]{元素1,元素2,......};
            示例: int[] arr = new arr[]{3,5,1,7};
                  int[] arr = {3,5,1,7};
    9.4 example:
*/
        //a.
class ArrayDemo1
{
    public static void main(String[] args)
    {
    //需求,想定义一个可以存储3个整数的容器
        int[] x = new int[2];
        x[0] = 4;
        x[1] = 6;
        System.out.println(x[0]);
        System.out.println(x[1]);
    }
}
    //9.5 数组操作常见的问题
        //b.
class ArrayDemo2
{
     public static void main(String[] args)
     {
        //Java中常见的错误
        int[] arr = new int[3];
        System.out.println(arr[3]); //这里编译不会报错,在运行的时候会报错
     }
}
 
        //c.    
class ArrayDemo3
{
    public static void main(String[] args)
    {
        int[] arr = new int[3];
        arr = null; //这里把引用置空
        System.out.println(arr[1]); //编译时不会报错,当程序执行到这里是报错              
    }
}
    //9.6 数组的常见操作
        /*
        a.数组的遍历
        获取数组的元素,通常利用for循环来解决
         
        */
class ArrayDemo4
{
    public static void main(String[] args)
    {
        int[] arr = new int[]{22,412,23,441}; //这里一个一个数比较麻烦,载数组中有一个属性可以直接获取到数组元素的个数。length
        //使用方法:数组名称.length =
        for(int x=0; x<arr.length; x++)
        {
            System.out.println("arr["+x+"]="+arr[x]";");
        }
    }
}
             
        //定义功能:打印数组中的元素,元素之间用逗号隔开.
class ArrayDemo5
{
    public static void main(String[] args)
    {
        int[] arr = new int[4];
        arr[0] = 32;
        arr[1] = 47;
        arr[2] = 76;
        arr[3] = 51;
        printArray(arr);
    }
                 
    public static void printArray(int[] arr)
    {
        for(int x=0; x<arr.length; x++)
        {
            if(x!=arr.length-1)
            {
                System.out.print(arr[x] + ",");
            }else
            {
                System.out.println(arr[x]);
            }
        }
    }
}           
        //给定一个数组{2,1,5,8,3,0,7},获取数组中的最大值,最小值
class ArrayDemo6
{
    public static void main(String[] args)
    {
        int[] arr = new int[]{2,1,5,8,3,0,7};
        /*
        1.获取最值需要进行比较,每次比较都会有一个较大的值,因为该值不确定,那么通过变量进行临时存储
        2.让数组中每一个元素都和这个变量中的值进行比较,如果大于变量中的值,就用该变量记录较大的值。
        3.当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值。
        */
        int max = getMax(arr);
        System.out.println("max = " + max);
    }
                 
    public static int getMax(int[] arr)
    {
        int max = arr[0];
        for(int x=1; x<arr.length; x++)
        {
            if(arr[x]>max)
            {
                max = arr[x];
            }
        }
        return max;
    }
 
}
 
        //思考:可不可以将临时变量初始化为0呢?
class ArrayDemo7
{
    public static void main(String[] args)
    {
        int[] arr = new int[]{2,1,5,8,3,0,7};
        int max = getMax(arr);
        System.out.println("max = " + max);
    }
                 
    public static int getMax(int[] arr)
    {
        //int max = arr[0];
        int max = 0 //这里把它初始化为0,是可以的,因为是把它看成初始化为数组中任意一个下标
        for(int x=1; x<arr.length; x++)
        {
            if(arr[x]>arr[max])
            {
                max = x;
            }
        }
        return arr[max]; //这里返回数组是max下标的元素
    }
 
}
             
        //获取最小值,作为练习
         
/*
        数组的排序
            a.选择排序
*/ 
class ArrayDemo8
{
    public static void SelectSort(int[] arr)
    {
        for(int x=0; x<arr.length-1; x++)
        {
            for(int y=x+1; y<arr.length; y++)
            {
                if(arr[x]>arr[y])
                {
                    int temp = arr[x];
                    arr[x] = arr[y];
                    arr[y] = temp;
                }
            }
        }
    }
 
    public static void printArray(int[] arr)
    {
        for(int x=0; x<arr.length; x++)
        {
            if(x!=arr.length-1)
            {
                System.out.println("Arr[]={" + arr[x] +"},");
            }else
            {
                System.out.println("Arr[]={" + arr[x] +"}");
            }
        }
    }
 
    public static void main(String[] args)
    {
        int[] arr = new int[]{1,5,3,6,8,7,0,9,2};
        System.out.println("=============排序前=================");
        printArray(arr);
        System.out.println("=============排序后=================");
        SelectSort(arr);
        printArray(arr);
    }
}
 
/*
        数组的排序
            b.冒泡排序
*/
class ArrayDemo9
{
    public static void BubbleSort(int[] arr)
    {
        for(int x=0; x<arr.length-1; x++)
        {
            for(int y=0; y<arr.length-x-1; y++)
            {
                if(arr[y]>arr[y+1])
                {
                    int temp = arr[y];
                    arr[y] = arr[y+1];
                    arr[y+1] = temp;
                }
            }
        }
 
    }
 
    public static void printArray(int[] arr)
    {
        for(int x=0; x<arr.length; x++)
        {
            if(x!=arr.length-1)
            {
                System.out.println("Arr[]={" + arr[x] +"},");
            }else
            {
                System.out.println("Arr[]={" + arr[x] +"}");
            }
        }
    }
 
    public static void main(String[] args)
    {
        int[] arr = new int[]{1,5,3,6,8,7,0,9,2};
        System.out.println("=============排序前=================");
        printArray(arr);
        System.out.println("=============排序后=================");
        BubbleSort(arr);
        printArray(arr);
    }
}
/*
        数组的排序
            c.封转位置置换功能
*/
class ArrayDemo10
{
    public static void main(String[] args)
    {
 
    }
     
    public static void swap(int[] arr,int a,int b)
    {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}
        //数组的查找
class ArrayDemo11
{
    public static void main(String[] args)
    {
        int[] arr = new int[]{1,5,3,6,8,7,0,9,2};
        int index = getIndex(arr,3);
        System.out.println("index=" + index);
    }
    //定义功能:获取key第一次出现在数组中的位置,如果返回值是-1,那么代表该key在数组中不存在.
    public static int getIndex(int[] arr,int key)
    {
        for(int x=0; x<arr.length; x++)
        {
            if(arr[x]==key)
                return x;
        }
        return -1;
    }
}
            //a.折半查找
class ArrayDemo12
{
    public static void main(String[] args)
    {
        int[] arr = new int[]{1,3,5,6,7,8,9};
        int index = halfSearch(arr,7);
        System.out.println("index=" + index);
    }
    //折半查找,可以提高效率,但是必须要保证该数组是有序的数组.
    public static int halfSearch(int[] arr,int key)
    {
        int max,mid,min;
        min = 0;
        max = arr.length-1;
        mid = (max+min)/2;
         
        while(arr[mid]!=key)
        {
            if(key>arr[mid])
                min = mid + 1;
            else if(key<arr[mid])
                max = mid - 1;
            if(min>max)
                return -1;
            mid = (max+min)/2;
        }
        return mid;
    }
}
            //b.折半查找的第二种方式
class ArrayDemo13
{
    public static void main(String[] args)
    {
        int[] arr = new int[]{1,3,5,6,7,8,9};
        int index = halfSearch_2(arr,7);
        System.out.println("index=" + index);
    }
    //折半查找,可以提高效率,但是必须要保证该数组是有序的数组.
    public static int halfSearch_2(int[] arr,int key)
    {
        int min = 0,max = arr.length-1,mid;
        while(min<=max)
        {
            mid = (max+min)>>1;
            if(key>arr[mid])
                min = mid + 1;
            else if(key<arr[mid])
                max = mid - 1;
            else
                return mid;
             
        }
        return -1;
    }
}
 
        //利用程序进行进制转换
        //a.第一种方法
class ToBin1
{
    public static void main(String[] args)
    {
        toBin(6);
    }
    //十进制转二进制
    public static void toBin(int num)
    {
        while(num>0)
        {
            System.out.println(num%2);
            num = num / 2;
        }
    }
}
        //b.第二种方法
class ToBin2
{
    public static void main(String[] args)
    {
        toBin(6);
    }
    //十进制转二进制
    public static void toBin(int num)
    {
        StringBuffer sb = new StringBuffer();  //利用StringBuffer方法进行存储
         
        while(num>0)
        {
            sb.append(num%2);
            num = num / 2;
        }
        System.out.println(sb.reverse());
    }
}
    //十进制转十六进制
class ToBin3
{
    public static void main(String[] args)
    {
        toHex(60);
    }
    public static void toHex(int num)
    {
        for(int x=0; x<8; x++)
        {
            int temp = num & 15;
            if(temp>9)
                System.out.println((char)(temp-10+'A'));
            else
                System.out.println(temp);
             
            num = num >>> 4;           
        }
    }
}
    /*
      查表法
0 1 2 3 4 5 6 7 8 9 A  B  C  D  E  F
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
将所有元素临时存储起来,建立对应关系。每一次&15后的值作为索引
去查建立好的表。就可以找到对应的元素,这样就比-10+'a'简单的多
通过数组的形式建立表
*/
class ToBin4
{
    public static void main(String[] args)
    {
        toHex(60);  
    }
     
    public static void toHex(int num)
    {
        char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};  
        for(int x=0; x<8; x++)
        {
            int temp = num & 15;
            System.out.println(chs[temp]);
            num = num >>> 4;
        }
    }
}
//对结果还是不满意,我们需要只显示有效位,并且反转结果
class ToBin5
{
    public static void main(String[] args)
    {
        toHex(60);  
    }
     
    public static void toHex(int num)
    {
        char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};  
        //定义一个临时数组,用于反转结果
        char[] arr = new char[8];
        int pos = arr.length;
         
        while(num!=0)
        {
            int temp = num & 15;
            arr[--pos] = chs[temp];
            num = num >>> 4;
        }
         
        //存储数据的arr数组遍历
        for(int x=pos; x<arr.length; x++ ) //这里数组指针倒着存
        {
            System.out.print(arr[x] + ",");
        }
    }
}


你可能感兴趣的:(java基础)