黑马程序员———基础预备知识

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


Java语言基础组成:

  • 关键字
          注意:main不是关键字,却是被虚拟机识别的,比较特殊。
  •      标识符 
      1.  a-z A-Z 0-9 _ $ 
      2.  数字不能开头,起名尽量有意义 
      3. 包名:xxxyyyzzz
      4. 类名接口名:XxxYyyZzz 
      5. 变量名和函数名:xxxYyyZzz
      6. 常量名:XXX_YYY_ZZZ。多单词时,用下划线连接。
  • 注释  
          可以注解程序和调试程序
          注意:先写注释,再写代码

  • 常量和变量
  1. 整数常量
  2. 小数常量
  3. 布尔型常量
  4. 字符常量
  5. 字符串常量
  6.  null常量

       
  • 运算符


    • 算术运算符
    • 赋值运算符
    • 比较运算符
    • 逻辑运算符
    • 位运算符
    • 三元运算符

    • 算术运算符
         
    %   取模   5%2  =  1
    x % y 
    x<y  则结果为x
    x=y  结果为0
    y=1, 结果为0
    1 % -5  结果为??  1
    -1 % 5  结果为??  -1
    只看左边的正负。面试的边边角角。
    ++  自增
    --  自减
    int a = 3, b;
    b = a++;
    先赋值给b,再自增
    System.out.println(b);3
    System.out.println(a);4
    b = ++a;
    先自增,再赋值
    字符串数据和任何数据使用+都是相连接,最终都会变成字符串。
    字符串连接符  +
    System.out.println("5+5="+5+5);//打印为"5+5=55"
        • 注意:代码阅读性重要。
    • 转义字符

    通过\来转变后面字母或者符号的含义。
    \n:换行。
    \b:退格。相当于backspace。
    \r:按下回车键。window系统,回车符是由两个字符来表示\r\n
    \t:制表符。相当于tab键。

    转义字符写在被转义的字符前面
    System.out.println("\"hello\"");//打印"hello"带双引号的

    char c h= '\n';//可以的,像'\'',打印为'
    char c = '你’;//可以装中文的


    • 赋值运算符:
    +=  -=  *=  /=  %=

    short s = 4;
    s = s + 5;//编译失败,因为s被提升为int类型,运算后结果还是int类型,无法
    赋值给short类型。
    short是2个8位,5是4个8位。会丢失精度

    s += 5;//编译通过,因为+=运算符在给s赋值时,自动
    完成了强转动作。


    int a,b,c;
    a = b = c = 5;//比较少见的形式。

    • 比较运算符:
    !=       <     >   <=     >=     ==   instanceof

    逻辑  运算符:
    &     AND(与)
    |     OR(或)
    ^     XOR(异或)
    !     Not(非)
    &&     AND(短路)
    ||     OR(短路)


    &:只要两边有一个为false,则为false。
    |:只要有一方为true,则为true。
    ^:和|有点不一样,当true ^ true 则为false。
    两边相同结果为假,两边不同,结果为真。

    int a = 2;
    a>3 & a<6;
    a>3 && a<6;//短路,当判断到前面的为false,则停止运算,直接输出false
    &:无论左边是true还是false,右边都运算。
    &&:当左边为false,右边不运算。
    |:两边都参与运算。
    ||:左边为true,右边不运算。

    • 位运算符:
    <<
    >>
    >>> 无符号位移
    &     与运算
    |     或运算
    ^     异或运算
    ~     反码

    example:
         3<<2 = 12;
             0000-0000 0000-0000 0000-0000 0000-0011
    左移两位:  00-0000 0000-0000 0000-0000 0000-001100

         6>>1 = 3;
           0000-0000 0000-0000 0000-0000 0000-0110
           000000-0000 0000-0000 0000-0000 0000-01
    <<:其实就是乘以2的移动的位数次幂。3<<2-->  3*2^2
    >>:其实就是除以2的移动位数次幂。6>>1-->  6/2^1

    添0,以最高位是1还是0来补。
    而>>>,无论最高位是1还是0,都拿0补。
    位运算运算速度最快,但局限性是只能是2的倍数增减。

    与运算,或运算,异或运算
          :  6 & 3  = 2;  6 | 5 = 7;      6 ^ 5 = 3;
             110            110             110
           & 011          | 101          ^ 101
             -------       --------          -------
               010 = 2;       111  = 7;       011 = 3;

    验证:System.out.println(6 ^ 5);//结果为3


    反码:
    负数的二进制表现形式为取反+1;
         000......000110   = 6;
         111......111001   取反
         000......000001   +1;
         111......111000   = -7;
         (因为 000......000111为7)
         ~6 = -7;


    另外:7 ^ 4 ^ 4 = 7;
    7 ^ 4 ^ 4:
    111
    ^100                  加密
    ----
    011
    ^100                  解密
    ----                   4相当于秘钥
    111
    一个数异或同一个数两次,结果还是那个数。

    2 * 8 =
        0000
      * 0010
    -------------
        0000
       1000
    ------------
       10000  = 16;就是下面的第一位与上面四位相乘,依次第二位与
    上面4位相乘。

    高效:
    2<<<3
    0000-0010  2
    0001-0000  16



    交换两整数
    1.temp = n;
      n = m;
      m = temp;

    2. n = n + m;
       m = n - m;
       n = n - m;

    3.n = n ^ m;
      m = n ^ m;
      n = n ^ m;


    ======================================

    public static void main(String[] args){
         int num = 60;
         //获取60的最低4位,通过&15
         int n1 = num & 15;
         System.out.println(n1>9?(char)n1-10+'A')":n1);
        
         //要获取下一组四位,将60右移4位。
         int temp = 60 >>> 4;
         //对temp的值进行最低4位的获取。
         int n2 = temp & 15;
         System.out.println(n2>9?(char)n1-10+'A')":n2);
    /*
                   0-9  'A'-   -  -   -   -'F'
    ASCII表现形式:     65  66 67
                         10  11 12

         12 - 10 = 2;
            2 + 'A' = 67;
         char(67);


    (获取4最低四位,&15,获取最低8位,&255)
    */



    • 三元运算符:

    (条件表达式)?表达式1:表达式2;
    true返回表达式1
    false返回表达式2

    语句:

    程序流程控制
    1. 顺序结构:
    2. 判断结构:
    3. 选择结构:
    4. 循环结构:

    • 判断结构:
    if语句:
    如果if控制的语句只有1条,则大括号可以不写。
    若不写大括号且有几条语句,则控制离他最近的语句。
    三种格式:
         if(条件表达式){
         }
         if(条件表达式){
         }
         else{
         }
         if(条件表达式){
         }
         else if(条件表达式){
         }
         else{
         }
    if else简写格式:变量 = (条件表达式)?表达式1:表达式2;
    三元运算符:
         好处:可以简化if else代码
         弊端:因为是一个运算符,所以运算完必须要有一个结果。
    int a = 9, b;
    b = (a>1)?100:200;
    if(a>1)
       b =100;
    else
       b=200;
    ============================
    需求:根据用户指定月份,打印该月份所属的季节,
    用switch和ifelse的形式。代码得敲,得熟,知识点得熟。
    =============

    • 选择结构:
    switch语句:4个关键字
    格式:
         switch(表达式)
         {
           case 取值1:执行语句;
           break;
           case 取值2:执行语句;
            。。。
           default:
           执行语句;
           break;//可不写
         }

    • 特点:
              1选择的类型只有四种:byte,short,int,char。
              2case之间与default没有顺序,先执行第一个case,没有
               匹配的case执行default。
              3结束switch语句的两种情况:遇到break,执行到switch语句结束。
              4如果匹配的case或者default没有对应的break,那么
               程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束。

    int a = 3,b = 2;
    char ch = '+';
    switch(ch)
    {
         case '-':
              sop(a-b);
         break;
         case '+':
              sop(a+b);
         break;
         case '*':
              sop(a*b);
         break;
         case '/':
              sop(a/b);
         break;
         default:
              sop("非法输入");
         break;
    }



    if和switch语句很像。
    具体什么场景下,应用哪个语句呢?
    如果判断的具体数值不多,而且符合byte,short,int,char这四种类型。
    虽然两个语句都可以使用,但建议使用switch语句,因为效率稍高。

    其他情况:对区间判断:对结果为boolean类型判断,使用if,if的
              使用范围更广。

    switch类型在1.4可以对字符串进行判断。
    而在1.5则可以对枚举进行选择。


    ==============================


    • 循环结构:

    while   do  while     for


    •      while语句格式:
    while(条件表达式)
    {
         执行语句;
    }
    do while语句格式:
    do
    {
         执行语句;
    }while(条件表达式);
    do while特点是条件无论是否满足,循环体至少被执行一次


    •      while语句中:
              定义初始化表达式:
              while(条件表达式)
              {
                  循环体(执行语句);
              }


    int x = 1;
    while(x<10)
    {
         Sop("x"+x);
         x++;
    }

    do while语句中:
         int x=1;
         do{
              sop("do:x="+x);
              x++;
           }
         while(x<3);

    while的特点:先判断条件,只有条件满足才执行循环体。
    do while的特点:先执行循环体,在判断条件,条件满足,
    再执行循环体。就是无论条件是否满足,循环体至少执行一次。
    while的后面要么是{},要么是;




    • for语句:
    for(初始化表达式;循环条件表达式;循环后的操作表达式)
    {
         执行语句;
    }

    for(int x = 0;x<3;x++)
    {
         sop("x="+x);
    }
    //sop("x============="+x);
    //变量x作用域在for循环的大括号内。
    //x在内存生成后就,又随着for循环的结束而消失。

    解析:  A:int x = 0;--->在内存中开辟一块空间
            B:x<3?--->若满足,
         C:则执行语句。
         D:x++---->x自增
         E:x<3?-->继续判断
         F:执行语句
         G:x++--->x继续自增
         H:x<3?再判断,不满足
         I:跳出循环


    int y = 0;
    while(y<3)
    {
         SOP("y="+y);    
         y++;
    }
    sop("y==========="+y);
    //y在内存中生成后,再执行while循环,循环结束后,y仍然在内存中。

    • 两者有什么区别呢?

    1,变量有自己的作用域,对于for来讲,如果将用于控制循环
    增量定义在for语句中。那么该变量只在for语句内有效。
    for语句执行完毕。该变量在内存中被释放。
    2,for和while可以进行互换,如果需要定义循环增量,用for
    更为合适。

    •           总结:
                        什么时候使用循环结构?
                        当要对某些语句执行很多次时,就是用循环结构。


    •           无限循环的最简单表达形式:
    * for(;;)
    * {
    * }
    *
    * while(true)
    * {
    * }


              注意嵌套循环的使用。


    •      其他流程控制语句:
    break(跳出),continue(继续)
    break语句:应用范围:选择结构和循环结构
    continue语句:应用于循环结构。

    •     注意:
                   a.这两个语句离开应用范围,没有存在的意义。
         b.这两个语句单独存在,下面都不可以有语句,因为执行不到。
         c.continue语句是结束本次循环继续下次循环。
         d.标号的出现,可以让这两个语句作用于指定的范围。

  • 函数
    • 函数的定义
    • 函数的特点
    • 函数的应用
    • 函数的重载(特性)overload

    • 函数的定义:

    1. 什么是函数?
         函数就是定义在类中的具有特定功能的一段
         独立小程序。
         函数也称为方法
         2.   函数的格式:
          修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2)
         {
                执行语句;
              return 返回值;
         }

    返回值类型:函数运行后的结果的数据类型。
    参数形式:是形式参数的数据类型。
    形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
    return:用于结束函数。
    返回值:该值会返回给调用者。



    • 函数的特点:

    定义函数可以将功能代码进行封装
    便于对该功能进行复用
    函数只有被调用才会被执行
    函数的出现提高了代码的复用性
    对于函数没有具体返回值的情况,返回值类型用关键字void表示,
    那么该函数中的return语句如果在最后一行可以省略不写

    注意:
         函数中只能调用函数,不可以在函数内部定义函数。
         定义函数时,函数的结果应该返回给调用者,交由调用者处理。

    • 如何定义一个函数呢?
    1.既然函数是一个独立的功能,那么该功能的运算结果是什么?先明确。
    2.在明确在定义该功能的过程中,是否需要未知的内容参与运算?
     
       可以这么理解:主函数就是调用函数,来测试这段功能代码。

              例子:
    需求:定义一个功能完成3+4的运算,并将结果返回给调用者
              思路:1.明确功能结果是3+4的和,既一个整数的和
                2.在实现该功能的过程中,没有未知内容参与运算。
               其实这两个功能就是在明确函数的定义。
                1.明确函数的返回值类型。
                2.明确函数的参数列表。(参数类型,参数个数)


    主函数就是调用函数,来测试这段功能代码。
    返回值类型为void的情况,不能再主函数中输出,
    应为System.out.println并不明确该函数的返回值类型。




    • 函数的重载:overload

    重载的概念:
         在同一个类中,允许存在一个以上的同名函数,只要让他们的参数个数或者参数类型不同即可。
    重载的特点:
         与返回值类型无关,只看参数列表
    重载的好处:
         方便于阅读,优化了程序的设计。



                什么时候用重载?
      当定义的功能相同,但参与运算的未知内容不同。则定义一个函数名称以表示其功能,方便阅读。
      而通过参数列表 的不同来区分多个同名函数。

  • 数组
    • 数组的定义
    • 数组的内存分配及特点
    • 数组操作常见问题
    • 数组常见操作
    • 数组中的数组


    • 数组的定义:
    概念:
         同一种类型数据的集合。其实数组就是一个容器。
    数组的好处:
         可以自动给数组中的元素从0开始编号,方便操作这些元素。
    格式1:
         元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
         示例: int[] arr = new int[5];
    格式2:
         元素类型[] 数组名 = new 元素类型[]{元素,元素,元素.....};
         示例:int[] arr = new int[]{3,6,5,7};
               int[] arr = {3,6,5,7};


    • 数组的内存分配及特点:

    内存结构:
         java程序在运行时,需要在内存中分配空间。为了提高运算效率,
         又对空间进行了不同区域的划分,因为每一片区域都有特定
         的处理数据方式和内存管理方式。

    栈内存:
         用于存储局部变量,当数据使用完,所占空间会自动释放。

    堆内存:
         数组和对象,通过new建立的实例都存放在堆内存中。
         每一个实体都有内存地址值
         实体中的变量都有默认初始化值
         实体不在被使用,会在不确定的时间内被垃圾回收器回收

    方法区,本地方法区,寄存器




    数组中的选择排序:
              1:先拿0角标的元素依次和其他角标比较,若比0角标元素小,则0角标替换成该元素。
                   在0角标位置产生了最小值,
              2:再拿1角标的元素依次比较,1角标位置产生最小值。
              3:依次类推。
              (内循环结束一次,最值出现在头角标位置上)
             
              数组中的冒泡排序:面试中比较常见。
              1.相邻的两个元素进行比较,如果符合条件就换位。第一圈:最值出现在最后位。
        
              提供了一种排序方式:Arrays.sort(arr);



         数组的查找:
                   拆半查找。如:34;1~200--》  猜100.   1~100--》猜50 。。。。。

         数组中十进制转成其他进制:
                 Integer.toBinaryString(3)
                Integer.toHexString(60)
                Integer.toOctalString(4)
     


         还有二维数组
              int[][] arr1 = new int[3][4];//二维数组,有3个一维数组,每个一维数组有四个元素。  
              int[][] arr2 = new int[3][];
              arr2[0] = new int[3];
              arr2[1] = new int[2];
              arr2[2] = new int[5];
             
              System.out.println(arr2.length);//打印的是二维数组的长度。
              System.out.println(arr2[0].length);//打印二维数组中第一个一维数组的长度。

           另外:
    int[] x,y[];//x一维,y二维  分解后为:int[] x; int[] y[];
     int[] x;  int x[];
     int[][] y; int[] y[];  int y[][];

    ------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值