二.Java基本语法

转载自:Java笔记目录

 

1.标识符&关键字

【标识符】:

Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符。

凡是自己可以起名字的地方都叫标识符

命名规则:(一定要遵守,不遵守就会报编译的错误)

由26个英文字母大小写,0-9 ,_或 $ 组成 

数字不可以开头。

不可以使用关键字和保留字,但能包含关键字和保留字。

Java中严格区分大小写,长度无限制。

标识符不能包含空格。

注意:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。

Java中的名称命名规范:(不遵守,也不会出现编译的错误)

包名:多单词组成时所有字母都小写:xxxyyyzzz

类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz

变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz

常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

【关键字】:

被Java语言赋予了特殊含义,用做专门用途的字符串(单词),关键字中所有字母都为小写。

用于定义数据类型的关键字:

class  interface      enum      byte short  int  long    float  double  char  boolean void

用于定义数据类型值的关键字:true  false      null        

用于定义流程控制的关键字:

If else     switch     case  default  while     do    for break continue  return                        

用于定义访问权限修饰符的关键字:private    protected public           

用于定义类,函数,变量修饰符的关键字:abstract       final static       synchronized  

用于定义类与类之间关系的关键字:extends    implements                  

用于定义建立实例及引用实例,判断实例的关键字:new     this  super       instanceof      

用于异常处理的关键字:try       catch       finally     throw      throws

用于包的关键字:package   import                  

其他修饰符关键字:native  strictfp    transient  volatile    assert

保留字:

Java版本尚未使用,但以后版本可能会作为关键字使用。

自己命名标记符时要避免使用这些保留字:

byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const

2.变量

 

l  变量的概念:

  • 内存中的一个存储区域
  • 该区域有自己的名称(变量名)和类型(数据类型)和值
  • Java中每个变量必须先声明,再赋值,然后才能使用
  • 该区域的数据可以在同一类型范围内不断变化
  • Java 中的变量有四个基本属性:变量名,数据类型,存储单元和变量值

变量名:合法的标识符

变量的数据类型:可以是基本类型和引用类型(必须包含类型)

存储单元:存储单元大小是由数据类型决定的,如:int 为4 个字节32 位

变量值:在存储单元中放的就是变量值(如果是基本类型放的就是具体值,如果是引用类型放的是内存地址,如果null,表示不指向任何对象)

l  定义变量的格式:数据类型    变量名  =  初始化值

l  变量是通过使用变量名来访问这块区域的

//int是一种数据类型,是整型。

int a; //在内存中开辟一块空间,这块空间的类型是整型,给这块空间起名叫a

//赋值

a = 100;

//通过变量名去访问那块内存。

System.out.println(a);

//重复访问

System.out.println(a);

l  使用变量注意:

  • 变量的作用域:一对{ }之间有效。出了大括号就不认识了。
  • 初始化值
  • 变量可以重复赋值,但不能重复声明,在同一个域中,变量名不能重复。

2.1 关于java中的字面值:

1.什么是字面值?

         一眼看上去就知道是多少的数据,就是字面值

2.字面值本质:

         字面值是有数据类型的:

                   整型 100

                   浮点型 3.14

                   布尔型 true/false

                   字符型 '中'

                   字符串型 "ABC"

                   在内存中占用空间。

                   字面值就是内存中的一块空间,这块空间有类型,有值。

                   只有字面值内存无法得到重复利用。

                   java语言中所有的字符都采用“单引号”括起来

                   java语言中所有的字符串都采用“双引号”括起来。

 

public class ConstTest01{

         public static void main(String[] args){

                   System.out.println(10);   //整数型的字面值

                   System.out.println(3.14);         //浮点型的字面值

                   System.out.println(true);         //布尔型字面值

                   System.out.println(false);       

                   System.out.println('a');   //字符字面值

                   System.out.println("Hello");   //字符串字面值

                   System.out.println(10); //新内存

                   //Error

                   //System.out.println('AB'); //AB本身不是一个字符,而是字符串.

                   System.out.println("A"); //这是一个字符串类型。

         }

}

2.2 java中变量按照数据类型来分类:

 

 

 

>引用类型默认值:null

>8种基本数据类型:注意定义值时不能超过范围

     整型:byte(8 bit)  short   int(默认类型)long:变量值的末尾要加“L”“l”

egbyte = 1,存储在计算机上为 0000 0001

     浮点型:float:末尾要加上“F”“f”、  double (默认类型)

     字符型:char(用‘ ’括起来)只能表示一个字符(英文/中文/标点/转义字符等),默认值是“\u0000,要定义多个字符用string。

     布尔类型: boolean(只能取值为true false,不能取null),默认值是false

2.3 java中变量按照声明位置的不同来分类:

 

 

 

2.4进制(了解):

 

2.4.1二进制:计算机底层都是用二进制来存储、运算。

2.4.2二进制与十进制之间的转换。

二进制转换为十进制:从右向左,2^0 + 2^1 +···+2^n

十进制转换为二进制:

2.4.3二进制在底层存储正数、负数都是以补码的形式存储的。(原码、反码、补码)

正数:原码、反码、补码三码合一

负数:正数的原码符号位由0变1è负数的原码è负数原码除符号位按位取反è负数的反码è负数反码加1è负数的补码

2.4.4四种进制间的转换

 

 

 

 

 

 

 

2.5变量的运算:不考虑布尔Boolean类型

   ①自动类型转换:容量小的数据类型自动转换为容量大的数据类型。

    short s = 12;     int i = s + 2;   char c1 = ’a’;//97  char c2 = ‘A’;//65

    注意:byte short char之间做运算,结果为int型!èlong èfloatèdouble

   ②强制类型转换:是①的逆过程。使用“()”实现强转。

会导致精度的损失(高位截掉了)。Eg: long a1 = 12345L; int a2 = (int)a1;

----------------------------------------------------------------------------------------------------------------------

//字符串与基本数据类型之间的运算:只能是连接运算:+。得到的结果仍为一个字符串

              String str = "abc";

              String str1 = str + m1;//abc12345

              System.out.println(str1);

----------------------------------------------------------------------------------------------------------------------

//题目:

              String st1 = "hello";

              int myInt1 = 12;

              char ch1 = 'a';//97

              System.out.println(str1 + myInt1 + ch1);//输出:hello12a

              System.out.println(myInt1 + ch1 + str1);//输出:109hello

              System.out.println(ch1 + str1 + myInt1);//输出:ahello12

------------------------------------------------------------------------------------------------- 

 

 

======================================================================
补充

一、关于变量

       1.java中如何定义变量,语法:

                     数据类型 变量名;

       2.如何给变量赋值,语法:

                     变量名 = 值;

       3.变量的本质是什么?

              变量就是内存中的一块空间,这块空间有“类型”,“名字”,“值”

public class VarTest01{

       public static void main(String[] args){

              //int是一种数据类型,是整型。

              int a; //在内存中开辟一块空间,这块空间的类型是整型,给这块空间起名叫a

              //赋值

              a = 100;

              //通过变量名去访问那块内存。

              System.out.println(a);

              //重复访问

              System.out.println(a);

              System.out.println(a);

       }

}

二、变量的声明

public class VarTest02{

              public static void main(String[] args){

              //申请一块int类型的空间,起名i,并赋值10

              int i = 10;

              System.out.println(i);

              //重新赋值

              i = 100;

              System.out.println(i);

              //变量可以重新赋值,但不能重复声明

              //在同一个域中,变量名不能重复。

              //int i = 200; //Error

              //java语言中的变量必须先声明,再赋值,才能使用。

              int a;

              a = 10;

              System.out.println(a);

              //声明三个变量i1,i2,i3,类型都是int类型,i1,i2两个变量没有赋值,只有i3变量赋值。

              int i1,i2,i3 = 456;

              //Error

              //System.out.println(i1); //i1没有赋值不能访问。

              System.out.println(i3);

       }

       public static void m1(){

              int i = 10; //不在同一个区域中可以声明。

       }}

三、关于变量的作用域:有效范围。作用范围。

出了大括号就不认识了。

public class VarTest03{

       //类体

       //声明变量

       int m = 100;

       public void m1(){

              int m = 200;

              System.out.println(m); //200 (就近原则.)

       }

       public static void m(){

             

              int k = 10;

       }

       public static void main(String[] args){

              int i = 10;

              System.out.println(i);

              //Error

              //无法访问m方法中的k变量.

              //System.out.println(k);

              //for循环

              /*

              for(int j=0;j<10;j++){

                     System.out.println(j);

              }

              //Error,j变量是属于for循环的。

              System.out.println(j);

              */

              //j的作用域在整个main方法中。

              int j;

                     for(j=0;j<10;j++){

                     System.out.println(j);

              }

              System.out.println(j);}}

四、变量根据出现的位置可以分为两种:

              1.局部变量,在方法体中声明的变量叫做局部变量。包括形式参数列表。

              2.成员变量,在类体中,方法之外声明的变量统称成员变量。

public class VarTest04{

       //成员变量

       int i = 10;

       //成员变量

       int m;

       public void m1(int m){ //m也是局部变量.

              int k = 10; //局部变量  

       }

       public void m2(){

              System.out.println(m); //0

       }

       public static void main(String[] args){

              VarTest04 vt = new VarTest04();

              vt.m2();

       }

}

五、关于整型类型:一个整数默认是int类型

              byte        1byte(8bit)  -128~127

              short              2byte

              int          4byte

              long        8byte

       整数型有三种表示方式:

              十进制

              八进制  以0开始

              十六进制  以0x开始

public class DataTypeTest01{

       public static void main(String[] args){

              //十进制

              int i1 = 10; //常用.

              //八进制

              int i2 = 010;

              //十六进制

              int i3 = 0x10;

              System.out.println(i1); //10

              System.out.println(i2); //8

              System.out.println(i3); //16

              //将一个int类型100字面值赋值给i4变量。

              int i4 = 100;

              //将一个int类型的123字面值赋值给long类型的l1

              //int类型容量小于long类型.

              //以下程序存在类型转换.只不过叫“自动类型转换”

              long l1 = 123;

              //由于123后面有一个L,所以上来就会把123看做long类型。

              //所以以下程序不存在类型转换,只是一个普通的赋值运算。

              long l2 = 123L;

              //可以(int类型-->long类型,自动类型转换)

              long l3 = 2147483647;

              //程序将2147483648看做int类型,但是这个数据本身已经超出了int的取值范围。

              //long l4 = 2147483648;

              long l4 = 2147483648L;

       }

}

六、整型类型间转换

public class DataTypeTest02{

       public static void main(String[] args){

              long l1 = 1000L;

              //将long类型转换成int类型,不能自动类型转换.

              //int i1 = l1;

              //需要强制类型转换

              //需要加强制类型转换符

              //以下的程序虽然编译通过了,但是程序在运行阶段可能损失精度,所以一定要谨慎使用。

              int i1 = (int)l1; //大容量向小容量转换,需要强制类型转换.

              //记忆一个规则:如果这个整数没有超出byte的取值范围,可以直接将这个整数赋值给byte类型.

              byte b1 = 10;

              byte b2 = 127;

              //Error

              //128本身已经超出了byte的取值范围。

              //byte b3 = 128;

              //如果整数本身没有超出short的取值范围,可以将这个整数直接赋值给short

              short s1 = 32767;

              //short s2 = 32768;

              //最后结论:如果整数没有超出byte,short,char的取值范围,可以直接将这个整数赋值给byte,short,char

              char c1 = 97;

              char c2 = 65535;          

              //char c3 = 65536;

       }

}

七、关于浮点类型:一个小数默认是double类型

              float  4个字节

              double 8个字节    

public class DataTypeTest03{

       public static void main(String[] args){

              double d1 = 1.2;

              //强制类型转换

              //float f1 = 3.2;

              float f1 = (float)3.2;

              //自动赋值运算

              float f2 = 3.2F;

       }

}

八、关于char类型

       char是字符类型,java中采用UNICODE编码。

       底层占用两个字节。

       char类型涉及到字符编码方式:

              1.字符编码方式是现实世界中的文字和计算机的表示方式的转换规则。

                     ASCII

                            'a'   97

                            'A'    65

                            '0'    48

                     ISO-8859-1

                     GB2312<GBK<GB18030

                     unicode UTF-8  UTF-16 UTF-32

              2.字符如果采用的编码和解码不一致的话,会出现乱码。

public class CharTest01{

       public static void main(String[] args){

              char c1 = 'a';

              //Error

              //char c2 = 'ab';

              //汉子占用2个字节,所以java中的char可以存储一个汉字。

              char c3 = '中';

              System.out.println(c1);

              System.out.println(c3);

       }

}

九、关于转义字符

public class CharTest02{

       public static void main(String[] args){

              /*

              char c1 = 't';

              System.out.print(c1);

              System.out.println("abc");

              */

              // 斜线在java语言中有转义功能,可以将普通t字符,转换成“制表符”

              char c1 = '\t';

              System.out.print(c1);

              System.out.println("abc");

              //这是一个普通的“单引号”字符

              char c2 = '\'';

              System.out.println(c2);

              //这是一个普通的“斜线”字符

              char c3 = '\\';

              System.out.println(c3);

              //这是一个普通的“双引号”字符

              char c4 = '\"';

              System.out.println(c4);

              //这是一个普通的换行符。

              char c5 = '\n';

              System.out.print("abc");

              System.out.print(c5);

              System.out.print("def");

              char c6 = '中';

              char c7 = '\u4e2d'; //'中'对的unicode码是 4e2d

              System.out.println(c6);

              System.out.println(c7);

       }

}

十、关于布尔类型

              1.boolean类型的数据只有两个值:true/false,没有1和0。

              2.boolean类型的数据主要用在逻辑运算和条件控制语句中。

public class DataTypeTest04{

       public static void main(String[] args){

              //Error:boolean只能是true/false

              //boolean b1 = 1;

              boolean sex = false;

              if(sex){

                     System.out.println("男");

              }else{

                     System.out.println("女");

              }

       }

}

十一、混合类型间运算

//byte,short,char做混合运算的时候先各自转换成int在做运算。

public class DataTypeTest05{

       public static void main(String[] args){

              byte b1 = 10;

              short s1 = 20;

              int i1 = b1 + s1;    

              System.out.println(i1); //30(int)

              //java程序分编译期和运行期

              //编译阶段只是知道b1+s1的结果是int类型。

              //int类型无法直接赋值给byte类型.

              //byte b2 = b1 + s1;

              //可以.

              byte b3 = 100;

       }

}

十二、关于基本数据类型转换规则

              1. 8种基本数据类型除boolean类型之外都可以相互转换.

              2. 小容量向大容量转换叫做自动类型转换:

                            byte<short<int<long<float<double

                                 char<

              3. byte,short,char做混合运算的时候,各自都先转换成int在做运算

              4.大容量向小容量转换是强制类型转换,需要加强制转换符,

              编译虽然通过,运行期可能损失精度。谨慎使用。

              5.如果整数没有超出byte,short,char的取值范围,可以直接将这个整数赋值给byte,short,char

              6.多种数据类型做混合运算,先转换成容量最大的那种再做运算。

public class DataTypeTest06 {

       public static void main(String[] args) {

              //出现错误,1000超出了byte的范围

              //byte a = 1000;

              //正确,因为20没有超出byte范围

              //所以赋值

              byte a = 20;

              //变量不能重名

              //short a =  1000;

              //正确,因为数值1000没有超出short类型的范围

              //所以赋值正确

              short b =  1000;

              //正确,因为默认就是int,并且没有超出int范围

              int c = 1000;

              //正确,可以自动转换

              long d = c;

              //错误,出现精度丢失问题,大类型-->>小类型会出现问题

              //int e = d;

              //将long强制转换成int类型

              //因为值1000,没有超出int范围,所以转换是正确的

              int e = (int)d;

              //因为java中的运算会会转成最大类型

              //而10和3默认为int,所以运算后的最大类型也是int

              //所以是正确的

              int f = 10/3;   

              //声明10为long类型

              long g = 10;

              //出现错误,多个数值在运算过程中,会转换成容量最大的类型

              //以下示例最大的类型为double,而h为int,所以就会出现大类型(long)到小类型(int)的转换,将会出现精度丢失问题

              //int h = g/3;

//可以强制转换,因为运算结果没有超出int范围

              //int h = (int)g/3;

              //可以采用long类型来接收运算结果

              //long h = g/3;

              //出现精度损失问题,以下问题主要是优先级的问题

              //将g转换成int,然后又将int类型的g转换成byte,最后byte类型的g和3运算,那么它的运算结果类型就是int,所以int赋值给byte就出现了精度损失问题

              //byte h = (byte)(int)g/3;

              //正确

              //byte h = (byte)(int)(g/3);                  

              //不能转换,还有因为优先级的问题

              //byte h = (byte)g/3;     

              //可以转换,因为运算结果没有超出byte范围

              //byte h = (byte)(g/3);

              //可以转换,因为运算结果没有超出short范围

              short h = (short)(g/3);

              short i = 10;

              byte j = 5;

              //错误,short和byte运算,首先会转换成int再运算

              //所以运算结果为int,int赋值给short就会出现精度丢失问题

              //short k = i + j;

              //可以将运算结果强制转换成short

              //short k = (short)(i + j);

              //因为运算结果为int,所以可以采用int类型接收

              int k  = i + j;

              char l = 'a';

              System.out.println(l);

              //输出结果为97,也就是a的ascii值

              System.out.println((byte)l);

              int m = l + 100;

              //输出结构为197,取得a的ascii码值,让后与100进行相加运算

              System.out.println(m);

       }

}

3.运算符

 

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。包括:算术运算符、赋值运算符、比较运算符(关系运算符)、逻辑运算符、位运算符、三元运算符。

3.1算术运算符:

正号: + 负号: -

加号: + 减号: -  乘号: * 除号:  / 取模: %

前/后置加: ++ 前/后置减 –

连接符: +

 

注意:1)除:/

              int i = 12;

              int j = i/5;

              double d = i / 5;

              double d1 = i/5.0;

              System.out.println(j);//2

              System.out.println(d);//2.0

              System.out.println(d1);//2.4

         2)取模:%:取余数. 结果的符号取决于被模数(%左边的数)

              int i1 = 12 % 5;

              int i2 = -12 % 5;

              int i3 = 12 % (-5);

              int i4 = -12 % (-5);

              System.out.println(i1);//2

              System.out.println(i2);//-2

              System.out.println(i3);//2

              System.out.println(i4);//-2

         3)前++:先自增1,后做运算;后++:先做运算,后自增1

--------------------------------------------------------------------------

              int myInt1 = 10;

              int myInt2 = myInt1++;//++

              System.out.println(myInt1);//11

              System.out.println(myInt2);//10

------------------------------------------------------------------------

              int myInt3 = 10;

              int myInt4 = ++myInt3;//++

              System.out.println(myInt3);//11

              System.out.println(myInt4);//11

-----------------------------------------------------------------------------

           4)连接符 +String字符串与其他数据类型只能做连接运算,且结果为String类型。

“+”除字符串相加功能外,还能把非字符串转换成字符串。

【举例】:

class Testjia

{

           public static void main(String[] args)

           {

              System.out.println("5+5="+5+5); //输出:5+5=55

              System.out.println('*' + '\t' +'*');//输出:93

        System.out.println("*" + '\t' +'*');//输出:*        *

           }

}

3.2赋值运算符:

=    +=   -=  *=    /=   %=

 

【举例】

int i= 12;

i  = i * 5;

i *= 5;//与上一行代码同样的意思

 

【注意】

short s = 10;

s = s + 5;//报编译的异常

s = (short)(s + 5);//不建议如此实现,容易损失精度

s += 5;//既可以实现运算,又不会改变s的数据类型。

3.3比较运算符(关系运算符)

==  !=

>   <  > =   <=   

instanceof  检查是否是类的对象

【举例】

范例

结果

“Hello”  instanceof  String

true

“Hello”  instanceof  System

false

【注意】

①  区分 ==  与 =  区别。

②  进行比较运算操作以后,返回一个boolean类型的值,要么是true,要么是false。

4 >= 3  表达的是4 > 3或者 4 = 3。结果是true。

③if(i > 1 && i < 10){  }   不能写为:if(1 < i < 10){  }

 

3.4逻辑运算符(运算符的两端是boolean值)

&   逻辑与       |  逻辑或         ! 逻辑非

&&  短路与       ||  短路或        ^  逻辑异或

a

b

a&b

a|b

!a

a^b

a&&b

a||b

true

true

true

true

false

false

true

true

true

false

false

true

false

true

false

true

false

true

false

true

true

true

false

true

false

false

false

false

true

false

false

false

【注意】

①逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。

“&”“&&”的区别:

  • 单&时,左边无论真假,右边都进行运算;
  • 双&时,如果左边为真,右边参与运算,如果左边为假,则右边不参与运算。

“|”“||”区别同理,||时:左边为真,右边不参与运算。我们使用的时候,选择&&||

③异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。

  理解:异或,追求的是”!

3.5位运算符(两端是数值类型的数据)

 位运算是直接对二进制进行运算,注意:无<<<(无符号左移)

运算符

运算

范例

<< 

左移

3 << 2 = 12 --> 3*2*2=12 ;m<<n结果:m*(2^n)

>> 

右移

3 >> 1 = 1--> 3/2=1 ;m>>n结果:m/(2^n)

>>> 

无符号右移

3 >>> 1 = 1 --> 3/2=1;m>>>n结果:m/(2^n)

&

与运算

6 & 3 = 2

|

或运算

6 | 3 = 7

^

异或运算

6 ^ 3 = 5

~

反码

~6 = -7

【规则】

①     左移(二进制左移n位,低位补0)有限度,正数的二进制左移后,首位变1了就错了

②     右移:二进制右移n位,原来最高位是几,高位就补几

③     无符号右移:二进制右移n位,无论高位是几,高位都补0

④     与运算:左右两端数的二进制所对应位都是1则变1,否则为0,所得二进制数为结果

⑤     或运算:左右两端数的二进制所对应位至少有一个是1则变1,否则为0,所得二进制数为结果

⑥     异或运算:左右两端数的二进制所对应位不同则变1,否则为0,所得二进制数为结果

⑦     反码:该数的二进制对应位1变0,0变1,最后所得二进制数为结果

【小练习】

交换两个变量的值

//方法一:提供一个临时变量。

              Int  temp = m;

                  m = n;

                     n = temp;

              System.out.println("m:" + m + " n:" + n);

 

//方法二:当mn较大时,有可能出现精度损失

              m = m + n;//m = 12 + 5;

              n = m - n;//n = 17 - 5;

              m = m - n;//m = 17- 12

              System.out.println("m:" + m + " n:" + n);

 

//方法三:优点:没有上面两种方法的缺点。缺点:难!

              m = m ^ n;

              n = m ^ n; //(m ^ n) ^ n == m

              m = m ^ n; //(m ^ n) ^ m == n

              System.out.println("m:" + m + " n:" + n);

3.6三元运算符

(条件表达式)表达式1 表达式2

若条件表达式结果为true运算后的结果是表达式1

若条件表达式结果为false运算后的结果是表达式2

【注意】

①  既然是运算符,一定会返回一个结果,并且结果的数据类型与表达式1,2的类型一致

②  表达式1与表达式2 的数据类型一致。

③  三元运算符与if-else的联系与区别:三元运算符可简化if-else语句;三元运算符要求必须返回一个结果;if后的代码块可有多个语句;使用三元运算符的,一定可以转换为if-else,反之不一定成立。

【小练习】如何使用三元运算符,输出三个数中的较大值。

              int m = 12;int n = 23;int k = -9;

              int max1 = (m > n)? m : n;

    int max2 = (max1 > k)? max1 : k;

              System.out.println(max2);

3.7运算符的优先级

●运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算符总优先于下一行;只有单目运算符、三元运算符、赋值运算符是从右向左运算的。

【小练习】输出60的十六进制。

              int i = 60;

              //法一:自动调用Integer类现成的方法

              String binary = Integer.toBinaryString(i);System.out.println(binary);

              String hex = Integer.toHexString(i);System.out.println(hex);

       //法二:手动的方式,从控制台输出60的十六进制。

              /*

              char c = 'a';

              char c1 = (char)(c + 2);

              System.out.println(c1);//c

              */

              int j = i & 15;//获取到i的最低4位对应的值。

              String k1 = (j <= 9)? j + "" : (char)(j - 10 + 'a') + "";

              i = i >> 4;

              int z = i & 15;

              String k2 = (z <= 9)? z + "" : (char)(z - 10 + 'a') + "";

              System.out.println(k2 + k1);

 

4.流程控制

 

4.1关于代码的三种结构

顺序结构

程序从上到下逐行地执行,中间没有任何判断和跳转。

分支结构

根据条件,选择性地执行某段代码。有if…elseswitch-case两种分支语句。

循环结构

根据循环条件,重复性的执行某段代码。有while(){}do{}while()for(;;){}三种循环语句。(注:JDK1.5提供了for each循环,方便的遍历集合、数组元素)

4.2分支结构

4.2.1条件判断: if-else语句

第一种结构:

       if(boolean表达式){

                                   java语句;

                            }

第二种结构:

       if(boolean表达式){

                                   java语句;

                            }else{

                                   java语句;

                            }

第三种结构:

       if(boolean表达式){

                                   java语句;

                            }else if(boolean表达式){

                                   java语句;

                            }else if(boolean表达式){

                                   java语句;

                            }       

第四种结构:

if(boolean表达式){

                                   java语句;

                            }else if(boolean表达式){

                                   java语句;

                            }else {

                                   java语句;

                            }

注意:

①一旦满足某个条件表达式,则进入其执行语句块执行,执行完毕,跳出当前的条件判断结构,不会执行其以下的条件结构语句。即在if语句中只要有一个分支执行,则整个if语句结束。上面的结构二和四可以保证一定会有一个分支语句执行,因为他们都有else语句。

②如果诸多个条件表达式之间为“互斥”关系,多个结构可以上下调换顺序。如果诸多个条件表达式之间为“包含”关系,要求条件表达式范围小的写在范围大的上面。

分支语句中,如果只有一条java语句,大括号可以省略。不推荐使用,别人这样写能看懂就行。

if(isSuccess)

                     System.out.println("登录成功"); 

              else

                     System.out.println("登录失败");

④例题:

系统给定人的年龄.[1-100]

系统给定程序,通过人的年龄,来判断这个人处于生命的哪个阶段:

[1-5] 幼儿 [6-18] 少年 [19-35] 青年 [36-55] 中年 [56-100] 老年

public class IfTest02{

       public static void main(String[] args){

       //该程序假定年龄是合法的。

              int age = 56;

              /*if(age>=1 && age<=5){

                     System.out.println("幼儿");

              }else if(age<=18){

                     System.out.println("少年");

              }else if(age <= 35){

                     System.out.println("青年");

              }else if(age<= 55){

                     System.out.println("中年");

              }else{

                     System.out.println("老年");

              }*/

           //String不是基本数据类型,是引用类型

              String grade = "老年";

              if(age>=1 && age<=5){

                     grade = "幼儿";

              }else if(age<=18){

                     grade = "少年";

              }else if(age <= 35){

                     grade = "青年";

              }else if(age<= 55){

                     grade = "中年";

              }

              System.out.println(grade);

       }}

4.2.2选择结构:switch语句

格式:

switch(变量){

case 常量1:语句1;break;

case 常量2:语句2;break;

… …

case 常量N:语句N;break;

default:语句;break;

}

规则:

①switch(表达式)中表达式的返回值必须是下述几种类型之一:byteshortcharint,枚举,String

②case子句中的值必须是常量,且所有case子句中的值应是不同的;

③default是可以省略的,并且其位置也是灵活的,但是通常将其放在case语句之后,当没有匹配的case时,执行default;

④break语句用来在执行完一个case分支后使程序跳出switch语句块;break语句也可以没有,如果没有break,程序会顺序执行到switch结尾。

switchif语句的对比:

⑤如果判断的具体数值不多,而且符合byte、 short 、int、 char这四种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。

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

4.3循环结构

循环语句功能

  • 在某些条件满足的情况下,反复执行特定代码的功能

循环语句的四个组成部分

  • 初始化部分(init_statement)
  • 循环条件部分(test_exp)
  • 循环体部分(body_statement)
  • 迭代部分(alter_statement)

循环语句分类

  • for 循环
  • while 循环
  • do/while 循环

4.3.1 for 循环

for(表达式1;表达式2;表达式3){

                      java语句;

               }

 

表达式1是初始化表达式,最先执行,只执行一次。表达式2必须是boolean类型的表达式。

for循环开始执行,先执行表达式1,并只执行一次。进而判断表达式2的结果,如果是true,则执行java语句。再执行表达式3,然后再判断表达式2的结果,直到表达式2的结果是false,则for循环结束。

 

 

注:死循环

for(;;){

                     System.out.println("Test");

               }

doc环境下ctrl+c 停止,强制退出。

②关于for循环的嵌套,所有控制语句都可以嵌套在一起使用。

public class ForTest02{

              public static void main(String[] args){

                     for(int i=5;i>0;i--){

                            for(int j=0;j<i;j++){

                                   System.out.print(j+" ");

                            }

                            //换行

               //System.out.println();

                            System.out.print("\n");

                     }

              }

}

练习:①使用嵌套的for循环打印九九乘法表

              1*1=1

              2*1=2 2*2=4

              .......

              9*1=9...............9*9=81

public class ForTest03{

       public static void main(String[] args){

              for(int i=1;i<=9;i++){//一共有9行

                     for(int j=1;j<=i;j++){//每行有i个等式

                            System.out.print(i + "*"+ j +"=" + (i*j) + " ");

                     }

                     System.out.println();

              }

       }}

②计算1-100之间所有奇数的求和。

public class ForTest04{

       public static void main(String[] args){

              /*

              int sum = 0;

              for(int i=1;i<=100;i++){

                    

                     if(i%2 != 0){

                         //奇数

              //追加

                            sum += i;

                     }

              }

              System.out.println(sum);

              */

       //加入人为因素

       //效率高.

              int sum = 0;

              for(int i=1;i<=99;i+=2){

                     sum += i;

              }

              System.out.println(sum);

       }

}

4.3.2 while 循环语句(while循环的次数是:0-N次)

while(boolean表达式){

                            java语句;

                       }

4.3.3 do-while 循环语句(该循环执行的次数是:1-N)

do{

                            java语句;

                      }while(boolean表达式);

注:①不同的循环结构之间可以相互转换

    ②while和do-while的区别:do-while程序至少会执行一次。while先判断符合条件才执行,do-while循环先执行一次再判断。

       ③死循环:

       while(true){

                     System.out.println("Test");

              }

④嵌套循环:循环结构还可以声明循环。让内层循环结构整体充当外层循环的循环体。若外层循环执行m次,内层循环执行n次,整个程序执行m*n次。

  ⑤格式:①初始化条件②循环条件③迭代部分④循环体

for(①;②;③){

              ④

}

while(②){

              ④

              ③

}

do{

              ④

              ③

}while(②);

 

【题目1

打印下面图形

******

******

******

for(int i = 0;i < 3;i++){

       for(int j = 0;j < 6;j++){

              System.out.print("*");

       }

       System.out.println();

}

说明:外层循环控制行数,内层循环控制列数

【题目2输出100内的质数。(两种)

法一:

class TestPrimeNumber{

       public static void main(String[] args){

              boolean flag = false;

              long start = System.currentTimeMillis();//获取系统当前的毫秒数

              for(int i = 2;i <= 100000;i++){//实现100以内的自然数的遍历

                     //如何判断i是否为一个质数

                     for(int j = 2;j <= Math.sqrt(i);j++){

                            if(i % j == 0){

                                   flag = true;

                                   break;

                            }

                     }

                     if(!flag){//if(flag == false){//System.out.println(i);}

                     flag = false;

              }

              long end = System.currentTimeMillis();

              System.out.println("所花费的时间为:" + (end - start));

              //35535--加上break10059--使用Math.sqrt():}}

法二:

class TestPrimeNumber1{

       public static void main(String[] args){

              //boolean flag = false;

              long start = System.currentTimeMillis();//获取系统当前的毫秒数

              l:for(int i = 2;i <= 100000;i++){//实现100以内的自然数的遍历

                     //如何判断i是否为一个质数

                     for(int j = 2;j <= Math.sqrt(i);j++){

                            if(i % j == 0){

                                   //flag = true;

                                   //break;

                                   continue l;}}

                     //if(!flag){//if(flag == false){

                            System.out.println(i);

                     //}

                     //flag = false;}

              long end = System.currentTimeMillis();

              System.out.println("所花费的时间为:" + (end - start));

              //35535--加上break10059--使用Math.sqrt():}}

4.2.4 无限循环结构

for(;;){

   ...

   if(  ){

       break;

   }

   ...

}

或者

while(true){

   ...

   if(  ){

       break;

   }

   ...

}

往往我们在无限循环结构内部提供循环的终止条件,使用break关键字。否则,此循环将无限制的执行下去,形成死循环!死循环是我们要避免的。

4.4 break&continue

4.4.1 break

使用switch-case结构或者循环结构中,一旦执行到break,就跳出当前循环体,默认情况下结束离它最近的一个循环。

 

 

4.4.2 continue

使用在循环结构中,一旦执行到continue,就跳出当次循环。

for(int i = 1;i <= 10;i++){

              if(i % 4 == 0){

                     //break; //123

                     continue;  //123567910

              }

              System.out.print(i);

}    

在嵌套循环中,使用带标签的breakcontinue,可通过标签指明要终止的是哪一层语句块

 

 

label:for(int i = 1;i < 5;i++){

                          for(int j = 1;j <= 10;j++){

                                 if(j % 4 == 0){

                                    //break;

                                    //continue;

                                    //break label;

                                    continue label;

                                            }

                                  System.out.print(j);

}

                           System.out.println();

}

4.4.3 return

①并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。

②与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。

注意:

①break只能用于switch语句循环语句中。

②continue 只能用于循环语句中。

③二者功能类似,但continue是终止本次循环,break是终止本层循环。

④break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。

⑤标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。

 

5.初识方法

 

方法就是一段代码片段,这个片段可以完成特定的功能,并且可以重复利用。

5.1 方法的定义

5.1.1方法的定义格式

[方法修饰列表] 返回值类型 方法名(方法参数列表){

方法体

}

①方法修饰列表

是可选项,方法的修饰符可以包括:public,protected,private,abstract,static, final,synchronized,其中public,protected,private 不能同时存在。

②返回值类型

如果没有返回值使用void 关键字,如果存在返回值可以是基本类型和引用类型;如果存在返回值,必须使用 return语句,return语句后面不能再执行语句,因为不可能会执行到,编译会发生错误。

③方法名:任意合法的标识符。

④方法参数列表

参数列表可以有多个,也可以没有参数。如:method1(int a,int b),多个采用逗号分割。

5.1.2普通方法示例

public class MethodTest02{

       public static void main(String[] args){ //入口

              //在main方法中对sumInt方法进行调用,完成功能.

              //注意:加有static的方法,调用的时候必须采用“类名.”的方式调用。

              MethodTest02.sumInt(10,20);

              MethodTest02.sumInt(50,100); //调用

       }

       //定义方法,完成两个整数的求和。

       //注意:目前所有的方法请定义成public static .

       public static void sumInt(int a,int b){

              int c = a + b;

              System.out.println(a + "+" + b +"=" +c);

       }

}

public class MethodTest03{

       public static void main(String[] args){ //入口

              //方法调用.

              MethodTest03.println("Hello World"); //"Hello World" 是实际参数(实参)

              //方法调用

              MethodTest03.m1(13,15);

              MethodTest03.m2();     

              //调用m3

              int retValue = MethodTest03.m3(100,200);

             

              System.out.println("计算结果是:"+retValue);}

       //方法的定义

       //方法的形式参数列表中起决定性作用的是参数的类型。

    //参数的名字(局部变量的名字)是随意的只要是合法的标识符即可。

       public static void println(String msg){ //String msg 是形式参数列表(形参)

              System.out.println(msg);

       }

       public static void m1(int a,int b){

              System.out.println(a+"+"+b+"="+(a+b));

       }

       public static void m2(){

              System.out.println("呵呵");

       }

       //该方法有返回值,程序必须使用return语句返回值。

       public static int m3(int a,int b){

              int c = a + b;

              return c; //程序执行到此处m3方法执行结束。并返回值c

              //return语句下面不能再有其他代码,因为根本无法执行到。

              //System.out.println("ABC"); //编译无法通过。

       }

}

public class MethodTest04{

      

       //入口

       public static void main(String[] args){

              A.m1();

              //Error:在当前类中没有m1方法.

              //m1();

              MethodTest04.m2();

              //前提:在当前类中.

       //类名. 可以省略

              m2();

       }    

       public static void m2(){

              System.out.println("m2.....");

       }

}

class A{

       public static void m1(){

              System.out.println("A's m1 method invoke!");

       }

}

 

 

 

public class MethodTest06{

       public static void main(String[] args){

              m1(0);

              System.out.println("ABC");

              //以下程序编译可以通过。(程序分编译期和运行期,编译期只看语法不运算)

              if(true){

                     return;

              }

              System.out.println("bjpowernode");

       }

5.2方法的重载(overload)

5.2.1重载的条件:

①方法名相同

②方法的参数类型,个数,顺序至少有一个不同

③方法的返回类型可以不同(不依靠返回类型来区分重载)

④方法的修饰符可以不同,因为方法重载和修饰符没有任何关系

⑤方法重载只出现在同一个类中

5.2.2重载的优点:

①程序员只需要记忆很少的方法名,方便调用

②代码更加美观。

public class MethodTest08{

       //入口

       public static void main(String[] args){

              //对于程序来说需要记忆1个方法名.

              System.out.println(Compute.sum(10,20));

              System.out.println(Compute.sum(1.0,2.0));

              System.out.println(Compute.sum(10L,20L));

       }

    //以下都构成方法重载

       public static void m1(int a){}

       public static void m1(double a){}

       public static void m2(int a,int b){}

       public static void m2(int a){}

       public static void m3(int a,double b){}

       public static void m3(double a,int b){}

      

       //以下两个m4方法并没有构成重载.

       //方法重复。错误的。

       //public static void m4(int a){}

       //public static void m4(int b){}

       //方法的重载和方法的返回值类型无关.

       /*

       public static void m5(){}

       public static int m5(){

              return 100;

       }

       */

    //方法的重载和方法的修饰符列表无关

       /*

       static void m6(){}

       public static void m6(){}

       */

}

class Compute{

       public static int sum(int a,int b){

              return a + b;

       }

       public static double sum(double a,double b){

              return a + b;

       }

       public static long sum(long a,long b){

              return a + b;

       }

}

分析:System.out.println();这个println方法是否构成了方法的重载?

       一个类中可以有多个main方法(要求与程序入口的main方法参数列表类型、个数或顺序不同),只不过是与程序入口的main方法构成了重载

public class MethodTest09{

       public static void main(String[] args){

              //System.out SUN提供的PrintStream类型

              //printlnPrintStream类型的方法,该方法已经构成了重载。

              System.out.println(10);

              System.out.println(3.14);     

              System.out.println(true);

              System.out.println('a');

              System.out.println("Hello World!");

             

       }

}

5.3 加深对方法的理解

 

 

5.3.1方法的执行原理

①方法在调用的时候,才会给该方法在内存中分配空间;如果这个方法只是定义没有调用,则不会在内存中分配空间。

②方法在调用的时候在“栈”中分配空间。(JVM内存中有一块内存是栈内存。)

③方法调用其实就是“压栈(push)”,方法结束其实就是“弹栈(pop)”。

5.3.2 栈的结构

 

 

 

 

6.递归调用

方法的递归调用就是方法自身调用自身。

以下程序因为递归没有结束的条件,所以一直压栈,没有弹栈,导致栈内存溢出错误!所以递归必须要有结束条件。

public class RecursionTest01{

       //入口

       public static void main(String[] args){

              m1();

       }

       public static void m1(){

              m1(); //java.lang.StackOverflowError

       }

}

【例题1】:不使用递归,计算1-N的求和。

public class RecursionTest02{

       public static void main(String[] args){

              int n = 5;

              //调用该方法完成1-N的求和

              int retValue = method1(n);

              System.out.println(retValue); //15

       }

       //该方法完成1-N的求和.

       public static int method1(int n){

              int sum = 0;

              for(int i=0;i<=n;i++){

                     sum += i;

              }

              return sum;

       }

}

【例题2】:使用递归,计算1-N的求和。

public class RecursionTest03{

       public static void main(String[] args){

              int n = 5;

              //调用该方法完成1-N的求和

              int retValue = method1(n);

              System.out.println(retValue); //15

       }

      

       //该方法完成1-N的求和.

       //1+2+3+4+5+...N

       public static int method1(int n){

              if(n==1){

                     return 1;

              }else{

                     return n + method1(n-1); }}}

【练习】:计算N的阶乘。两种方式:使用递归和不使用递归。

public class RecursionTest04{

       public static void main(String[] rgs){

              System.out.println(method1(5)); //120

       }

       public static int method1(int n){

           //不使用递归

              int result = 1;

              for(int i=1;i<=n;i++){

                     result *= i;

              }

              return result;

           //使用递归

              if(n==1){

                     return 1;

              }else{

                     return n * method1(n-1); }

       }

}

 

 

 

 

7.数组

7.1数组

l  数组是多个相同类型数据的组合,实现对这些数据的统一管理

l  数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型

l  数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量

7.2一维数组

public class TestArray {

       public static void main(String[] args) {

              int i1;

              i1 = 12;

              boolean b = true;

              //1.如何定义一个数组

              //1.1数组的声明

              String[] names;

              int scores[];

//【注】Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法

              //1.2初始化

              //第一种:静态初始化:初始化数组与给数组元素赋值同时进行。

              names = new String[]{"周爽","郭强强","俞乾龙"};

              //第二种:动态初始化:初始化数组与给数组元素赋值分开进行。

              scores = new int[4];

              //2.如何调用相应的数组元素:通过数组元素的下角标的方式来调用。

              //下角标从0开始,到n -1 结束。其中n表示的数组的长度。

              scores[0] = 87;

              scores[1] = 89;

              scores[3] = 98;

              //3.数组的长度:通过数组的length属性。

              System.out.println(names.length);//3

              System.out.println(scores.length);//4

              //4.如何遍历数组元素

              for(int i = 0;i < names.length;i++){

                     System.out.println(names[i]);

              }}}

//声明数组的错误写法:

     1)String[] names = new String[5]{"AA","BB","CC"};//右边[ ]中的5不用写了

     2)int i[10];//正确写法:int i[] = new int[10];

     3)int i = new int[];//[ ]中要指明数组长度

【注】不管是动态还是静态初始化数组,一定在创建的时候,就指明了数组的长度!每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长度(元素个数)。数组一旦初始化,其长度是不可变的。

关于数组元素的默认初始化值

//关于数组元素的默认初始化值:

1)byte short int long 而言:0

2)float double 而言:0.0

3)char而言:空格

4)boolean而言:false

5)引用类型变量而言:null

//初始化时的一些其他正确写法:

1.Int[]  myInt;  myInt = new int[]{1,2,3};

2.int[]  myInt = {1,2,3};

// 错误:

int myInt;

myInt = {1,2,3};

//数组的内存结构

 

 

 

 

【练习1】

/*

  1.(1)定义类Pritimive,在类中定义一个有3个元素的boolean类型的数组t作为其成员变量。数组元素未赋值。

       定义类TestPritimive,在TestPritimive的main()方法中创建Pritimive对象d,输出其成员变量t的三个元素值。

       练习目的:检验基本数据类型数组创建时的自动赋值。

   (2)给对象d的成员变量t赋值为{true,true,true},并输出t的三个元素值。

 */

public class TestPritimive {

       public static void main(String[] args) {

              //创建Pritimive的对象d

              Pritimive d = new Pritimive();

              //遍历d的数组元素

              for(int i = 0;i < d.t.length;i++){

                     System.out.println(d.t[i]);

              }

              //d的数组元素重新赋值

              d.t[0] = true;

              d.t[1] = true;

              d.t[2] = true;

              for(int i = 0;i < d.t.length;i++){

                     System.out.println(d.t[i]);

              }

       }

}

class Pritimive{

       boolean[] t = new boolean[3];

}

【练习2】

/*  从键盘读入学生成绩,找出最高分,并输出学生成绩等级。

       成绩>=最高分-10    等级为’A’  

       成绩>=最高分-20    等级为’B’

       成绩>=最高分-30    等级为’C’  

       其余               等级为’D’

       提示:先读入学生人数,根据人数创建int数组,存放学生成绩。

*/

import java.util.Scanner;

public class TestStudentScore {

       public static void main(String[] args) {

              //1.创建Scanner的对象,并从键盘获取学生的个数n

              Scanner s = new Scanner(System.in);

              System.out.println("请输入学生的个数:");

              int count = s.nextInt();//count用来记录学生的个数

              //2.根据输入的学生的个数n,创建一个长度为nint型的数组

              int[] scores = new int[count];

              int maxScore = 0;

              //3.依次从键盘获取n个学生的成绩,并赋给相应的数组元素,并获取n个学生中的最高分

              System.out.println("请输入" + count + "个成绩:");

              for(int i = 0;i < scores.length;i++){

                     int score = s.nextInt();//依次从键盘获取学生的成绩

                     scores[i] = score;

                     if(scores[i] > maxScore){

                            maxScore = scores[i];

                     }

              }

              //4.遍历学生成绩的数组,并根据学生成绩与最高分的差值,赋予相应的等级,并输出

              System.out.println("最高分为:" + maxScore);

              for(int i = 0;i < scores.length;i++){

                     char level;

                     if(scores[i] >= maxScore - 10){

                            level = 'A';

                     }else if(scores[i] >= maxScore - 20){

                            level = 'B';

                     }else if(scores[i] >= maxScore - 30){

                            level = 'C';

                     }else{

                            level = 'D';

                     }

                     System.out.println("student " + i + " score is " + scores[i] + " grade is " + level);

              }}}

//输出效果:

7.3二维数组

 

 

 

 

public class TestArray2 {

       public static void main(String[] args) {

              int[] scores1 = new int[10];

              int[][] scores2;

              String[][] names;

//1.二维数组的初始化

              scores2 = new int[][]{{1,2,3},{3,4,5},{6}};//静态初始化

names = new String[6][5];//动态初始化的方式一

 

              names = new String[6][];//动态初始化的方式二

              names[0] = new String[5];

              names[1] = new String[4];

              names[2] = new String[7];

              names[3] = new String[5];

              names[4] = new String[8];

              names[5] = new String[5];

//错误的初始化方式

              //names = new String[][];

              //names = new String[][5];

             

//2.如何来引用具体的某一个元素

              int[][] i = new int[3][2];//int[] i[] = new int[3][2];

              i[1][0] = 90;

              i[2][1] = 100;

//3.数组的长度

              //二维数组的长度:length属性

              System.out.println(i.length);//3

              //二维数组中元素的长度

              System.out.println(i[0].length);//2

              System.out.println(names.length);//6

              System.out.println(names[4].length);//8

              System.out.println();

              //4.如何遍历二维数组

              for(int m = 0;m < scores2.length;m++){//控制行数

                     for(int n = 0;n < scores2[m].length;n++){

                            System.out.print(scores2[m][n] + "  ");}

                     System.out.println();}

              //5.内存结构

              int[] x,y[];

              //int[] x;//一维

              //int[] y[];//二维

              y = new int[3][2];

              x = y[0];

              x[0] = y[1][2];}}

【练习1】

 

 

public class TestGetSum {

       public static void main(String[] args) {

              int[][] m = new int[][]{{3,8,2},{2,7},{9,0,1,6}};

              int sum = 0;

              for(int i = 0;i < m.length;i++){

                     for(int j = 0;j < m[i].length;j++){

                            System.out.print(m[i][j] + "\t");

                            sum += m[i][j];

                     }

                     System.out.println();

              }

              System.out.println("总和为:" + sum);

       }

}

【练习2】

【练习3】

 

 

public class TestYangHui {

       public static void main(String[] args) {

              int[][] yangHui = new int[10][];

//1.初始化二维数组

              for(int i = 0;i < yangHui.length;i++){

                     yangHui[i] = new int[i + 1];

              }

//2.显式的为二维数组的每个元素赋值

              for(int i = 0;i < yangHui.length;i++){

                     for(int j = 0;j < yangHui[i].length;j++){

                            yangHui[i][0] = yangHui[i][i] = 1;

                           

                            if(i > 1 && j > 0 && j < i){

                                   yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j-1];

                            }

                     }

              }

//遍历二维数组

              for(int i = 0;i < yangHui.length;i++){

                     for(int j = 0;j < yangHui[i].length;j++){

                            System.out.print(yangHui[i][j] + "\t");

                     }

                     System.out.println();

              }

       }

}

7.4数组的常见异常

public class TestException {

       public static void main(String[] args) {

//1.数组下标越界的异常:java.lang.ArrayIndexOutOfBoundsException

              int[] i = new int[10];

              i[0] = 90;

       i[10] = 99;    

              for(int m = 0;m <= i.length;m++){

                     System.out.println(i[m]);

              }

//2.空指针的异常:NullPointerException

       //第一种:

              boolean[] b = new boolean[3];

              b = null;//b指向的地址变成null了,找不到b[0]

              System.out.println(b[0]);

             

       //第二种:

              String[] str = new String[4];

              //str[3] = new String("AA");//str[3] = "AA";//没有这两句中的一句,就会出现异常

              System.out.println(str[3].toString());

             

       //第三种:

              int[][] j = new int[3][];

              j[2][0] = 12;

       }

}

7.5数组的常用算法问题

1.求数组元素的最大值、最小值、平均数、总和等

【练习】定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。

【代码】

public class TestArray3 {

       public static void main(String[] args) {

              int[] arr = new int[] { 12, 43, 9, 0, -65, -99, 100, 9 };

       // 最大值

              int max = arr[0];

              for (int i = 1; i < arr.length; i++) {

                     if (max < arr[i]) {

                            max = arr[i];}}

              System.out.println("数组的最大值为:" + max);

       // 最小值

              int min = arr[0];

              for (int i = 1; i < arr.length; i++) {

                     if (min > arr[i]) {

                            min = arr[i];

                     }

              }

              System.out.println("数组的最小值为:" + min);

       // 总和

              int sum = 0;

              for (int i = 0; i < arr.length; i++) {

                     sum += arr[i];

              }

              System.out.println("总和为:" + sum);

       // 平均数

              int avg = 0;

              avg = sum / arr.length;

              System.out.println("平均值为:" + avg);

}

}

【输出函数的快捷键】syso +alt+/

2.数组的复制、反转

【练习】

使用简单数组

(1)创建一个名为TestArray的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。

(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。

(3)显示array1的内容。

(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。

思考:array1和array2是什么关系?array2 = array1:表示将array1的地址值赋给了array2

拓展:修改题目,实现array2对array1数组的复制

【代码】修改array2的时候,array1也被改变了,类似“快捷方式”

public class TestArray {

       public static void main(String[] args) {

              int[] array1, array2;

              array1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };

       // 遍历array1

              for (int i = 0; i < array1.length; i++) {

                     System.out.print(array1[i] + "\t");

              }

              System.out.println();

              System.out.println(array1);

              array2 = array1;

              System.out.println(array2);

       // 修改array2

              for (int i = 0; i < array2.length; i++) {

                     if (i % 2 == 0) {

                            array2[i] = i;

                     }

              }

       // 遍历array1

              for (int i = 0; i < array1.length; i++) {

                     System.out.print(array1[i] + "\t");

              }}}

 

 

正确的复制方式:

public class TestArray3 {

       public static void main(String[] args) {

              int[] arr = new int[] { 12, 43, 9, 0, -65, -99, 100, 9 };

       // 数组的复制

              int[] arr1 = new int[arr.length];

              for (int i = 0; i < arr1.length; i++) {

                     arr1[i] = arr[i];

              }

       // 数组元素的反转(逆序)

        //方法一:

for(int i = 0;i < arr.length/2;i++){

               int temp = arr[i];

               arr[i] = arr[arr.length-1 - i];

               arr[arr.length - 1 - i] = temp;

               }

  //方法二:

       for (int x = 0, y = arr.length - 1; x < y; x++, y--) {

                     int temp = arr[x];

                     arr[x] = arr[y];

                     arr[y] = temp;

              }

              System.out.println("反转以后:");

       // 遍历

              for (int i = 0; i < arr.length; i++) {

                     System.out.print(arr[i] + "\t");

}}}

 

 

3.数组元素的排序(面试前看一看)

 

l  插入排序

  • 直接插入排序、折半插入排序、希尔(Shell)排序

l  交换排序

  • 冒泡排序、快速排序(或分区交换排序)

l  选择排序

  • 简单选择排序、堆排序

l  归并排序

 

l  基数排序

 

public class TestArray3 {

       public static void main(String[] args) {

              int[] arr = new int[] { 12, 43, 9, 0, -65, -99, 100, 9 };

       // 使用冒泡排序使数组元素从小到大排列

              for (int i = 0; i < arr.length - 1; i++) {

                     for (int j = 0; j < arr.length - 1 - i; j++) {

                            if (arr[j] > arr[j + 1]) {

                                   int temp = arr[j];

                                   arr[j] = arr[j + 1];

                                   arr[j + 1] = temp;}

                     }

              }

       //使用直接选择排序使数组元素从小到大排列

              for(int i = 0; i < arr.length - 1; i++){

                     int t = i; //默认i处是最小的

                     for(int j = i;j < arr.length;j++){

                            //一旦在i后发现存在比其小的元素,就记录那个元素的下角标

                            if(arr[t] > arr[j]){

                                   t = j;}}

                     if(t != i){

                            int temp = arr[t];

                            arr[t] = arr[i];

                            arr[i] = temp;}

              }

              Arrays.sort(arr);

              System.out.println("排序以后:");

       // 遍历

              for (int i = 0; i < arr.length; i++) {

                     System.out.print(arr[i] + "\t");

              }}}

 

 

posted @   mooyuu末鱼  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示