javaSE笔记

1.
九九乘法表:
四个方向,八种情况,1*19*9只能在两锐角处:
 //		***
//		**
//		*右上角是1*1
		for(int i=1;i<10;i++) {
			for(int j=9;i<=j;j--) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}
//		***
//		**
//		*右上角是9*9
		for (int i = 9; i >0; i--) {
			for (int j = 1; i>=j; j++) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}
//		   *
//		  **
//		 ***又上是1*1
		for (int i = 1; i < 10 ;i++) {
			for (int j = 9; j >0; j--) {
				if(i<j) {
					System.out.print('\t');
				}else {
					System.out.print(i+"*"+j+"="+i*j+"\t");
				}
				}
				System.out.println();
			}
//		   *
//		  **
//		 ***右上是9*9
		for (int i = 9; i > 0; i--) {
			for (int j = 1; j < 10; j++) {
				if(i>j) {
					System.out.print('\t');
				}else {
					System.out.print(i+"*"+j+"="+i*j+"\t");
				}
			}
			System.out.println();
		}
//		***
//		 **
//		  *左上1*1
		for (int i = 1; i < 10; i++) {
			for (int j = 1; j < 10; j++) {
				if(i>j) {
					System.out.print('\t');
				}else {
					System.out.print(i+"*"+j+"="+i*j+"\t");
				}
			}
			System.out.println();
		}
//		***
//		 **
//		  *左上9*9
		for (int i = 9; i > 0; i--) {
			for (int j = 9; j > 0; j--) {
				if(i<j) {
					System.out.print('\t');
				}else {
					System.out.print(i+"*"+j+"="+i*j+"\t");
				}
			}
			System.out.println();
		}
//		*
//		**
//		***左上1*1
		for (int i = 1; i < 10; i++) {
			for (int j = 1; i>=j; j++) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}
//		*
//		**
//		***左上9*9
		for (int i = 9; i > 0; i--) {
			for (int j = 9; i<=j; j--) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}
2.判断是否是质数
    两种方法:(1)标签法(2break
break:
    for(int i=1;i<=100;i++) {//对1到100的数进行遍历
			int j=2;
			for(;j<i;j++) {
				if(i%j==0) {//该数存在一个可以被整除的数
					break;//跳出
				}
			}
			if(i==j) {//如果没有存在一个可以被整除的数跳出循环的,i一定等于j
                System.out.println(i+"是质数");
            }
    }
标签法:
    //定义一个变量让其从1跑到100
    for (int n = 1; n <=100; n++) {
        //判断当前n是不是质数
        boolean b=true;//定义一个变量 作为标签
        //使用循环让一个变量m从2跑到n/2
        for (int m =2; m <=n/2; m++) {
            //循环判断m是否除尽n
            if(n%m==0) {
                b=false;//如果n被m除尽 就更改标签的值
            }
        }
        //循环完后 通过判断标签的值是否更改 来判断n是否被m除尽过  进而判断n是不是质数
        if(n!=1 && b==true) {
            System.out.println("n==="+n+",是质数!!");
        }
    }
3.获取所有的水仙花数:
// 三位数  各个位数的值的三次方之和等于此数
//使用循环 把所有的三位数跑完
int n=100;
while(n<1000) {
    //判断当前n是不是水仙花数
    //获取当前n各个位数的值
    int a=n/1%10,b=n/10%10,c=n/100%10;
    //获取更改位数值的三次方之和
    int sum=a*a*a+b*b*b+c*c*c;
    //判断sum是不是等于当前n
    if(sum==n) {
        System.out.println(n+"是水仙花数!");
    }
    n++;//迭代语句
}
4.获取110000内的所有完数

Dos

cd子文件夹 :::change directory 进入当前目录下一个文件夹

dir :::directory显示当前文件夹下的所有子文件夹

cd/ :::退到根目录下

cd… :::后退一步

盘符 :::进入指定盘

tab键 :::自动补齐

Java相关软件

jvm

java virtual machine

虚拟机:把电脑的所有组件分割一部分,组成一个整体专门用于运行java程序。

​ :java.exe

jre

java runtime environment

java运行环境:给Java程序提供运行的平台
:jre=jvm+基础类库(提高编程效率 java大师提供的一些Java小零件)

安装:客户(软件的使用者)

jdk

java development kits

java开发工具包:Java程序的开发者安装的软件

​ :jdk=jre+开发工具(javac.exe+javadoc.exe)

安装:开发者

配置环境变量

配置环境变量:把jdk安装目录的bin包写入环境变量path中

为什么配置环境变量:在任意位置都能运行java.exe和javac.exe

配置环境变量的步骤:

1 复制jdk的bin 包的目录 C:\Program Files\Java\jdk1.8.0_131\bin

2 编辑环境变量path

​ 我的电脑–右键属性–高级系统配置–环境变量–系统变量–path–编辑

3 验证

​ 重新打开一个命令行:在任意目录输入java和javac

编译:根据java源文件 生成java字节码文件

编译工具:javac.exe编译器

编译准备:在命令行把目录切到源文件所在目录下

编译命令:javac源文件名.java

编译作用:对源文件进行语法检查+生成类名.class字节码文件

运行:运行java程序

运行工具:java.exe虚拟机

运行准备:在命令行把目录切到字节码文件所在目录下

运行命令:java 类名

运行结果:把打印输出语句的内容打印到命令行中

1.无须添加.class后缀。
2.main函数的args直接在命令后添加即可,空格隔开。例如:java ZzTest param1 param2。
3.若有包名,则需要有同样包路径的父文件夹,并在所有包之外的上一级执行该类。
如ZzTest.class文件,包名路径package zz,存放在D:\下,
则需要有D:\zz文件夹,把.class文件放在D:\zz文件夹下,
在D:\路径下执行java zz.ZzTest。
或者在编译时添加d参数,

javac -encoding utf-8 -d . xxx.java

,编译后就会自动创建包路径的文件夹,随后直接

java package1.package2.xxx 

语法之标示符(标识符)

标示符:名字

标示符作用:和同类以区分+方便调用

标示符命名规则:违反就是语法错误

  • 由数字 字母 下划线 美元符号 组成
  • 不能以数字开头
  • 不能是java关键字
  • 区分大小写

标示符命名规范:程序员写代码的习惯 违反语法不错 但代码读起来很难受

  • 尽量增加可读性
  • 类名:所有单词首字母大写

​ 包名:域名倒写 所有字母小写

语法之数据类型

数据类型:对数据进行分类

数据:所有有价值的信息

先按数据的性质分类、再按数据所占空间大小分类

整数类型:没有小数点的数字

字节型:byte

  • java存储数据的基本单位(计算机存储数据的基本单位bit(字节),一个二进制)
  • 1byte=8bit
  • byte取值范围[-128,127]

短整型:short

  • 1short=2byte
  • short取值范围[-32768,32767]

整型:int

  • 1int=4byte
  • int取值范围[-20亿,20亿]
  • 整数数据默认是int类型

长整型:long

  • 1long=8byte

  • long类型的数据后面加 l/L

    1 int

    1L long

浮点类型:有小数点的数字

单精度:float

  • 1float=4byte
  • float小数点后有效位数为6~8位
  • float类型的数据后面加 f/F

双精度:double

  • 1double=8byte

  • double小数点后的有效位数为12位

  • 浮点数据默认是double类型

    1.1 double类型

    1.1F float类型

字符类型:所有的符号/文字

字符型:char

  • 1char=2byte

  • char类型的数据必须写在单引号中,单引号中有且只有一个字符

    1 int

    1.0 double

    1L long

    1.0f float

    ‘1’ char

    ‘梁’‘贵’‘莹’ 三个字符

布尔类型:结果只有true或false

布尔型:boolen

  • 1boolen=1byte
  • boolen数据只有两个值:true、false

笔试题:描述八种基本数据类型及其所占的字节数

常量和变量

常量:运算中值不能改变的数据

  • 整数类型:1 1L
  • 字符常量:‘1’ ‘a’ ‘梁’ ‘ ’
  • 浮点常量:1.1 1.1f
  • 布尔常量:true false

变量:运算过程中值可以更改的数据

变量类似于代数中的未知数

  • 定义变量格式:变量类型 变量名;
  • 变量赋值格式:变量名=值;

注意事项:

  • 同名的变量只能定义一次
  • 变量必须先定义 再赋值 然后使用
  • 变量赋的值的类型必须和变量的类型一致
  • =:把右边的值赋值给左边的变量

数据类型转换

不同数据类型之间相互转换

//数据类型精度表:byte--short--int(char)--long--float--double
//1 自动类型转换情况1:高精度变量=低精度数据;
//         编译器会自动的把低精度数据 转换为和变量一致的高精度数据 然后赋值
//如:float f=1;
//2 自动类型转换情况2:byte\short\char类型的变量=int常量值;
//         编译器会自定判断变量是否能装下右边的值  装的下就转换然后赋值  装不下就报错
//如:char c=98;
//强制类型转换:低精度变量=(低精度变量的类型)高精度数据;
//         注意:强制类型转换可能会出现数据丢失
//如:float f=(float)1.1;

编码集

//编码集:计算机只识别01---只识别数字
//       人类语言是字符
//编码集:实现整数int和字符char之间的对应关系 
//编码集:ascii    所有的编码表兼容ascii表
//支持中文:GBK(一个序列:gb2312 gb18030)  utf-8  
//不支持中文:iso-8859-1  ascii

运算后结果的数据类型

byte short char 不能直接参加运算 需要自动提升为int

byte b1=1,b2=1;
		short s1=1,s2=1;
		char c1=1,c2=1;
//		b1=b1+b2;//Type mismatch: cannot convert from int to byte
//		         //byte+byte=int
//		b1=b1+s1;//byte+short=int
//		b1=s1+c1;//short+char=int

运算后结果的数据类型取决于精度最高的数据

运算符

算术运算符

已有的算数运算符:+  -  *  /
java中特有的算数运算符:
			1:+	
			2:%
			3:++ --
  • +作为加法号
System.out.println(1+1);//加法运算
  • +作为正号
System.out.println(+1-(+2)-(-1));//表示正负
  • +作为字符串连接符
  • %求余 取模
  • ++自增
  • –自减

赋值运算符

已有的:= 把右边的值赋值给左边的变量

java特有的:+= -= /= %= *=

int a=1,b=2;
a+=b;//等价于a=a+b;
System.out.println("a="+a+",b="+b);
byte b1=1,b2=2;
b1+=b2;//a+=b 完全等价于:a=(a的类型)(a+b);

比较运算符

结果是boolean类型的值

已有的:> >= < <=

特有的:== 恒等号 判断两边的值是不是相等

​ != 不等号 判断两边的值是不是不相等

System.out.println(1>2);
System.out.println(1==2);
System.out.println(1!=2);

逻辑运算符

逻辑运算符:只能操作boolean数据 结果是boolean类型的数据

& 单与

&& 双与 and 两边只要有一个false 结果就是false

| 单或

|| 双或 or 两边只要有一个true 结果就是true

^ 异或 两边不同则为true 两边相同则为false

! 取反 非

System.out.println("测试&");
System.out.println("true&false="+(true&false));//false
System.out.println("false&false="+(false&false));//false
System.out.println("true&true="+(true&true));//true
System.out.println("false&true="+(false&true));//false

int a=1,b=2,c=3;
System.out.println(a>b&&a>c);//判断a是最大的
System.out.println((a-b)*(a-c)<0);//a是中间值
System.out.println((a>b&&a<c)||(a>c&&a<b));//a是中间值

位运算符

(了解)

| & >> <<

位运算符操作的是整数的二进制

0作为false

1作为true

System.out.println("(15|2)="+(15|2));//15
System.out.println("(15&2)="+(15&2));//2
System.out.println("(15<<2)="+(15<<2));//60
System.out.println("(15>>2)="+(15>>2));//3

三元运算符

boolean表达式?值1:值2

如果boolean表达式结果位true 取值值1 否则取值值2

int a,b,c;
a=1>2?3:4;
System.out.println("a="+a);
a=1;b=2;
int max1;//定义变量记录大值
max1=a>b?a:b;//给max1赋值大值

a=1;b=2;c=3;
max1=a>b?a:b;
max1=max1>c?max1:c;//max1取值三个中的大值
max1=(a>b)&&(a>c)?a:(b>c?b:c);
max1=a>b?(a>c?a:c):(b>c?b:c);

//怎么获取abc中的大值 小值  中间值
int max=(a>b)&&(a>c)?a:(b>c?b:c);
int min=(a<b)&&(a<c)?a:(b<c?b:c);
int mid=a+b+c-min-max;

流程控制之 选择结构

if-else

if-else:单分支

if(条件表达式) {条件表达式成立时 执行的代码块}

if-else: 双分支

if(条件表达式) {表达式成立时 执行的代码块}else {表达式不成立时 执行的代码块}

if-else:多分支

float score=(float)81.5;
if(score<60) {
    System.out.println("score="+score+",等级是不及格!");
}else if(score<70) {//隐藏条件score>=60
    System.out.println("score="+score+",等级是及格!");
}else if(score<80) {//隐藏条件score>=70
    System.out.println("score="+score+",等级是良好!");
}else {//隐藏条件 score>=80
    System.out.println("score="+score+",等级是优秀!");
}

if(score<60) {
    System.out.println("score="+score+",等级是不及格!");
}else if(score>=60&&score<70) {
    System.out.println("score="+score+",等级是及格!");
}else if(score>=70&&score<80) {
    System.out.println("score="+score+",等级是良好!");
}else {
    System.out.println("score="+score+",等级是优秀!");
}

if-else的练习

//1 判断一个数是不是水仙花数
// 水仙花数 必须是三位数:并且各个位数的值的三次方之和等于此数 
//如:153==1*1*1+5*5*5+3*3*3=1+125+27=
{
    int a;//定义变量记录要判断的数据
    a=372;//为了程序正常运行  赋值
    //对a进行判断  是不是水仙花数
    //判断是不是三位数
    if(a>=100&&a<=999) {
        //获取a各个位数的值
        int a1=a/1%10;  //获取个位数
        int a2=a/10%10; //获取十位数
        int a3=a/100%10;//获取百位数
        //获取三次方之和
        int  sum=a1*a1*a1+a2*a2*a2+a3*a3*a3;
        //判断是否等于a
        if(a==sum) {
            System.out.println(a+"是三位数 并且是水仙花数!");
        }else {
            System.out.println(a+"是三位数 但不是水仙花数!");
        }
    }else {
        System.out.println(a+"不是三位数 肯定不是水仙花数!");
    }
}
//2 判断一个年 是不是闰年
//情况1:可以被4整除  单不能被100整除
//情况2:可以被400整除
{
    //定义变量记录要判断的年
    int year=1900;
    if(year%4==0&&year%100!=0) {
        System.out.println(year+"年是闰年!");
    }else if(year%400==0) {
        System.out.println(year+"年是闰年!");
    }else {
        System.out.println(year+"年不是闰年!");
    }

    if((year%4==0&&year%100!=0)||(year%400==0)) {
        System.out.println(year+"年是闰年!");
    }else {
        System.out.println(year+"年不是闰年!");
    }
}

//3 根据月份判断季节:3 4 5春季 678夏 9 10 11秋 12 1 2 冬
{
    int month=11;//定义变量记录月
    if(month==3||month==4||month==5) {
        System.out.println(month+"月是春季!");
    }else if(month==6||month==7||month==8) {
        System.out.println(month+"月是夏季!");
    }else if(month>=9&&month<=11) {
        System.out.println(month+"月是秋季!");
    }else {
        System.out.println(month+"月是冬季!");
    }
}
//4 根据年龄和性别 判断称呼:
//小男孩  18 帅哥  35 叔叔  60爷爷
//小女孩       美女        阿姨      奶奶
{
    //定义变量记录年龄和性别
    int age=19;char sex='男';
    //有八种情况  使用多分支
    if(sex=='男'&&age<18) {
        System.out.println("sex="+sex+",age="+age+",称呼是小男孩!");
    }else if(sex=='男'&&age<35) {//隐藏条件:如果是男的  age>=18
        System.out.println("sex="+sex+",age="+age+",称呼是帅哥!");
    }else if(sex=='男'&&age<60) {
        System.out.println("sex="+sex+",age="+age+",称呼是叔叔!");
    }else if(sex=='男') {
        System.out.println("sex="+sex+",age="+age+",称呼是爷爷!");
    }else if(age<18) {//隐含条件:sex=='女'
        System.out.println("sex="+sex+",age="+age+",称呼是小女孩!");
    }else if(age<35) {
        System.out.println("sex="+sex+",age="+age+",称呼是美女!");
    }else if(age<60) {
        System.out.println("sex="+sex+",age="+age+",称呼是阿姨!");
    }else{
        System.out.println("sex="+sex+",age="+age+",称呼是奶奶!");
    }


    //先判断性别  再判断年龄
    if(sex=='男') {
        //判断男生的年龄
        if(age<18) {
            System.out.println("sex="+sex+",age="+age+",称呼是小男孩!");
        }else if(age<35) {
            System.out.println("sex="+sex+",age="+age+",称呼是帅哥!");
        }else if(age<60) {
            System.out.println("sex="+sex+",age="+age+",称呼是叔叔!");
        }else {
            System.out.println("sex="+sex+",age="+age+",称呼是爷爷!");
        }
    }else {
        //判断女生的年龄
        if(age<18) {
            System.out.println("sex="+sex+",age="+age+",称呼是小女孩!");
        }else if(age<35) {
            System.out.println("sex="+sex+",age="+age+",称呼是美女!");
        }else if(age<60) {
            System.out.println("sex="+sex+",age="+age+",称呼是阿姨!");
        }else {
            System.out.println("sex="+sex+",age="+age+",称呼是奶奶!");
        }
    }
}

switch

switch格式:

 /*switch(表达式){
		 *        case 值1:
		 *             表达式值为值1时  要执行的代码块
		 *             break;
		 *        case 值2:
		 *             表达式值为值2时  要执行的代码块
		 *             break;
		 *        case 值3:
		 *             表达式值为值3时  要执行的代码块
		 *             break;
		 *        case 值n:
		 *             表达式值为值n时  要执行的代码块
		 *             break;
		 *        default:
		 *             表达式值不为以上所有值时  要执行的代码块
		 *             break;      
		 *    }
		 *    
		 * 注意事项:
		 *     1 switch只适用于穷举法:列举出所有的情况
		 *     2 switch表达式的值仅限于:byte、short、int、 char
		 *     3 只有当所有的case都不得于switch表达式的值是  才执行default 与其位置无关
		 *     4 break作用是结束switch结构
		 *     5 case不能重复
		 * */
//根据月份判断季节
int month=4;
//Cannot switch on a value of type double. Only convertible int values, strings or enum variables are permitted
switch(month) {
    default:
        System.out.println(month+"月是火星季!default");
        //break;
    case 12:
    case 1:
    case 2:
        System.out.println(month+"月是冬季!");
        break;
    case 3:
    case 4:
    case 5:
        System.out.println(month+"月是春季!");
        break;
    case 6:
    case 7:
    case 8:
        System.out.println(month+"月是夏季!");
        break;
    case 9:
    case 10:
    case 11:
        System.out.println(month+"月是秋季");
        break;
}

循环结构

while

  • while格式
/* while格式
			 * while(添加表达式){
			 *     条件表达式成立时执行的代码块
			 * }
			 * 格式与if完全相同
			 * */
  • while执行过程
int a=1;
if(a<5) {
    System.out.println("if   a="+a);
}
//if :条件表达式成立  执行代码块一次
a=1;
while(a<5) {
    System.out.println("while   a="+a);
    Thread.sleep(200);
    a++;//完全等价于 a=a+1;
}
//while :1  判断条件表达式是是否成立 不成立结束while
//      : 2 条件表达式成立  执行代码块一次
//      : 3 继续 1 2  直到条件表达式不成立
  • while组成
/*while的组成:
			 *    1 a<5:条件表达式   
			 *    2 System.out.println("while   a="+a);  循环执行的代码::循环体
			 *    3 a++;迭代语句
			 *选择执行或者不执行  用if-elase
			 *需要一个数从值1有规律的跑到值2时  用while    
			 * */

do-while

//for和while完全等价:格式不同
		/*for(初始化语句;条件表达式;迭代语句){
		 *     循环体(条件表达式成立时执行的代码块)
		 *}
		 *初始化语句:用于定义变量、给变量赋初始值的语句
		 *
		 *while(条件表达式){
		 *   循环体(条件表达式成立时执行的代码块)
		 *   迭代语句
		 *}
		 * */

for

//for和while完全等价:格式不同
		/*for(初始化语句;条件表达式;迭代语句){
		 *     循环体(条件表达式成立时执行的代码块)
		 *}
		 *初始化语句:用于定义变量、给变量赋初始值的语句
		 *
		 *while(条件表达式){
		 *   循环体(条件表达式成立时执行的代码块)
		 *   迭代语句
		 *}
		 * */
九九乘法表:
四个方向,八种情况,1*19*9只能在两锐角处:
 //		***
//		**
//		*右上角是1*1
		for(int i=1;i<10;i++) {
			for(int j=9;i<=j;j--) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}
//		***
//		**
//		*右上角是9*9
		for (int i = 9; i >0; i--) {
			for (int j = 1; i>=j; j++) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}
//		   *
//		  **
//		 ***又上是1*1
		for (int i = 1; i < 10 ;i++) {
			for (int j = 9; j >0; j--) {
				if(i<j) {
					System.out.print('\t');
				}else {
					System.out.print(i+"*"+j+"="+i*j+"\t");
				}
				}
				System.out.println();
			}
//		   *
//		  **
//		 ***右上是9*9
		for (int i = 9; i > 0; i--) {
			for (int j = 1; j < 10; j++) {
				if(i>j) {
					System.out.print('\t');
				}else {
					System.out.print(i+"*"+j+"="+i*j+"\t");
				}
			}
			System.out.println();
		}
//		***
//		 **
//		  *左上1*1
		for (int i = 1; i < 10; i++) {
			for (int j = 1; j < 10; j++) {
				if(i>j) {
					System.out.print('\t');
				}else {
					System.out.print(i+"*"+j+"="+i*j+"\t");
				}
			}
			System.out.println();
		}
//		***
//		 **
//		  *左上9*9
		for (int i = 9; i > 0; i--) {
			for (int j = 9; j > 0; j--) {
				if(i<j) {
					System.out.print('\t');
				}else {
					System.out.print(i+"*"+j+"="+i*j+"\t");
				}
			}
			System.out.println();
		}
//		*
//		**
//		***左上1*1
		for (int i = 1; i < 10; i++) {
			for (int j = 1; i>=j; j++) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}
//		*
//		**
//		***左上9*9
		for (int i = 9; i > 0; i--) {
			for (int j = 9; i<=j; j--) {
				System.out.print(i+"*"+j+"="+i*j+"\t");
			}
			System.out.println();
		}

break continue

跳转:

break使用场景1:switch 结束switch结构

​ 使用场景2:用在循环中 结束本次循环

continue使用场景1:用在循环中 跳过本次循环 继续进行下次循环

数组

数组:装指定个数个 相同类型数据的容器

元素:数组中的每个数据—数组的元素

指定个数:数组创建之前必须指定元素个数

相同类型:数组创建之前必须指定元素类型

数组:多个基本数据(8种基本数据类型)有机组合形成一个复杂数据

引用数据类型数据:复杂数据 非基本数据类型数据

基本数据类型数据的值:常量值 int a=10

引用数据类型数据的值:对象/数组对象

基本数据类型数据的名字:变量名

引用数据类型数据的名字:对象名/数组名/引用名

数据少时用变量记录 同一类型数据多时用数组记录

数组关键字:[]

二 数组创建


//创建数组  存储班级学生的年龄
//创建数组前必须先明确:元素类型+元素个数
//元素个数:10
//元素类型:int
int[] arr;//定义数组名:元素类型[] 数组名;
arr=new int[10];//创建数组对象:new 元素类型[元素个数]; 并赋值给数组名arr
arr=new int[10];//数组名arr指向了一个新的数组对象
//关键字new 每被调用一次  就创建一个新的对象
arr=new int[3];
int[] array;//定义一个新的数组名
array=arr;//让数组名array指向数组名arr指向的数组对象  对象int[3]有两个引用 arr 和 array

三种创建方式

//创建数组对象并起个名字  有三种格式:
//格式1: 元素类型[] 数组名=new 元素类型[元素个数];
int[] arr1=new int[10];//元素都是默认初始值
//格式2:元素类型[] 数组名=new 元素类型[]{值1,值2,值3....};
int[] arr2=new int[] {1,4,7,8,9};//元素都是指定的值
//格式3:元素类型[] 数组名={值1,值2,值3....};
int[] arr3= {1,5,7,8,9,0};//格式3是格式2的简写方式 编译器会自动补齐

数组的好处

//使用数组好处:
//1 数组会给其中的元素自动分配编号:(编号、索引、下标)  编号0开始
//2 可以通过数 组名 编号 的方式设置和获取其中的元素:数组名[元素下标]
arr[0]=13;//给arr的第一个元素赋值
System.out.println(arr[0]);//打印第一个元素的值
arr[2]=11;
//arr[3]=1;//ArrayIndexOutOfBoundsException  下标越界异常

数组的使用

//数组中的元素如果不赋值 有默认初始值--编译器
//默认初始值是什么 取决于元素的类型  --指定类型的0
//获取所有个数:对象名.length 
System.out.println(arr.length);//3
int[] arr0=new int[10];
//左边:int[] arr0: 定义一个要指向int数组的数组名(引用)arr0
//右边:new int[10]:创建一个装10个int元素的数组对象
//=:让左边的数组名arr0指向右边的数组对象
//数组使用1:遍历数组
arr0=new int[] {1,4,5,8,9,0,12};
for (int i = 0; i < arr0.length; i++) {
    //System.out.print(arr0[i]+(i==arr0.length-1?"\n":","));
    if(i==arr0.lengrh-1){
        System.out.print("\n");
    }else{
        System.out.print(",");
    }
}
//数组使用2:获取最大值
int max;//定义变量记录最大值
max=arr0[0];//赋初始值为第一个元素的值
for (int i = 1; i < arr0.length; i++) {//拿max与所有元素做比较
    max=max>arr0[i]?max:arr0[i];
}
System.out.println("元素的最大值:"+max);

数组排序

顺序排序

//排序规则:依次拿当前元素和其后面的所有元素做比较
int[] arr= {1,5,9,0,2,3};
//打印比较的细节
for (int i = 0; i < arr.length-1; i++) {//外层for循环变量i 记录当前元素的下标
    for (int j =i+1; j < arr.length; j++) {//内层for循环变量j 记录当前元素的后面元素的下标
        System.out.print("arr["+i+"]-arr["+j+"]\t");
    }
    System.out.println();
}
//把打印更改为比较 互换
for (int i = 0; i < arr.length-1; i++) {//外层for循环变量   i 记录当前元素的下标
    for (int j =i+1; j < arr.length; j++) {//内层for循环变量 j 记录当前元素的后面元素的下标
        //拿arr[i]和arr[j]比较
        if(arr[j]<arr[i]) {
            int k=arr[i];arr[i]=arr[j];arr[j]=k;
        }
    }
}

冒泡排序

//冒泡排序:依次拿相邻元素做比较
//通过代码实现排序细节
int[] arr= {1,6,9,0,2,1};
for (int i = 0; i < arr.length-1; i++) {//外层for循环控制比较的轮数
    for (int j = 0; j < arr.length-i-1; j++) {
        System.out.print("arr["+j+"]-arr["+(j+1)+"]\t");
    }
    System.out.println();
}
//把细节更改为比较
for (int i = 0; i < arr.length-1; i++) {//外层for循环控制比较的轮数
    for (int j = 0; j < arr.length-i-1; j++) { //让j记录相邻的两个元素前面的一个元素的下标
        //拿arr[j]和arr[j+1]比较
        if(arr[j]<arr[j+1]) {
            int k=arr[j];arr[j]=arr[j+1];arr[j+1]=k;
        }
    }	
}

插入排序

		for(int i=1; i<ins.length; i++){//i表示当前未排序元素的下标
			for(int j=i; j>0; j--){//让当前元素依次和前面的元素进行比较
				if(ins[j]<ins[j-1]){
					int temp = ins[j-1];
					ins[j-1] = ins[j];
					ins[j] = temp;
				}else{
                    break;
                }
			}
		}

二维数组

* 数组:装指定个数个 相同类型 的数据的容器 n维数组:装指定个数个 相同类型的n-1维数组的容器 n维数组的元素是n-1维数组
* 默认情况下:数组指的就是一维数组
* 二维数组关键字:[][]
* 创建二维数组格式1:
      元素类型[][] 数组名=new 元素类型[一维数组的个数][一维数组中元素的个数]; 
* 创建二维数组格式2:
      元素类型[][] 数组名=new 元素类型[][]{{1,2..},{1,2..},{1,2..}}; 
* 创建二维数组格式3:
      元素类型[][] 数组名={{1,2..},{1,2..},{1,2..}};
int[][] arr1 = new int[3][4];
// arr1---二维数组的名字
// new int[3][4]---二维数组对象
// int---二维数组中数据的类型
// 3----二维数组中有3个一维数组
// 4----每个一维数组中有4个元素
System.out.println(arr1);// [[I@7852e922
System.out.println(arr1.length);// arr.length:二维数组中一维数组的个数
System.out.println(arr1[0]);// [I@4e25154f arr[i]:二维数组中下标为i的一维数组对象
System.out.println(arr1[0].length);// arr[i].length:二维数组中下标为i的一维数组中的元素个数
System.out.println(arr1[0][1]);// arr[i][j]:二维数组中下标为i的一维数组中下标为j的元素
// 要求:会创建+会遍历
int[][] arr2 = { { 1, 2 }, { 11, 12, 5, 6, 1 }, { 21, 22, 4, 3 }, { 31, 32, 3 } };
// 遍历二维数组 使用两层for循环
for (int i = 0; i < arr2.length; i++) {// 外层for循环当前二维数组中所有的一维数组
    for (int j = 0; j < arr2[i].length; j++) {// 内层for循环遍历当前一维数组中元素
        System.out.print(arr2[i][j] + (j == arr2[i].length - 1 ? "\n" : ","));
    }
}

二维数组练习

// 练习:获取二位数组中元素的平均值
// 定义变量记录和 定义变量记录个数
int sum = 0, count = 0;
// 遍历二维数组
for (int i = 0; i < arr2.length; i++) {
    for (int j = 0; j < arr2[i].length; j++) {
        sum += arr2[i][j];
        // count++;
    }
    count += arr2[i].length;
}
System.out.println("元素的平均值=" + sum * 1.0 / count);
/*
		 * 1
		 * 1 1 
		 * 1 2 1 
		 * 1 3 3 1 
		 * 1 4 6 4 1 
		 * 1 5 10 10 5 1 
		 * 1 6 15 20 15 6 1
		 * 
		 * 打印前10行的数据 使用二维数组arr装所有的数据 arr中有10个1维数组对象 arr[i]中应该有i+1个元素
		 * 元素的特点:arr[i][j]------j==0||j==arr[i].length-1----arr[i][j]=1 arr[i][j]=
		 * arr[i-1][j]+arr[i-1][j-1]
		 */
//杨辉三角
int[][] a1 = new int[10][];
for (int i = 0; i < array.length; i++) {
    // 给当前一维数组a1[i]中的元素赋值
    System.out.println(a1[i]);// null 表示对象名没有指向任何对象
    a1[i] = new int[i + 1];//创建一维数组
    System.out.println(al[i]);//[I@4e25154f [I@70dea4e [I@5c647e05 ··· 十个一维数组的地址
    for (int j = 0; j < a1[i].length; j++) {
        // 首尾赋值1
        if (j == 0 || j == a1[i].length - 1) {
            a1[i][j] = 1;
        } else {
            a1[i][j] = a1[i - 1][j] + a1[i - 1][j - 1];
        }
    }

}
for (int i = 0; i < a1.length; i++) {
    for (int j = 0; j < a1[i].length; j++) {
        System.out.print(a1[i][j] + (j == a1[i].length - 1 ? "\n" : "\t"));
    }
}

++参加混合运算

int a=1;
a++;//等价于a=(a的类型)(a+1);

a=5;
//++在前 先自增后运算  ++在后 先运算后自增
//a=5
int b=a+(a++)+2+(++a)/a+(--a)+(a--)*a;
//  b=5+ 5  + 2+ 7/7   + 6   +  6*5
System.out.println(b);

&& 和 & 的区别

//阐述a和b的区别
//1 先解释a  解释b
//2 列举a和b的相同之处
//3 列举a和b的不同之处

//&& 和 & 区别
//&& 是逻辑运算符的双与
//&  是逻辑运算符的单与 和 位运算符的单与
//相同之处:作为逻辑运算符时:&&和&的结果一样:两边只要有一个false 结果就是false
//不同之处:1 &还可以作为位运算符:位运算符操作的是数字的二进制
//        2 &&存在逻辑短路的现象:A&&B 当通过A就知道结果时 B就不再执行直接给出结果
//逻辑运算时&&的效率更高
a=3;
if(false&&++a<3) {}
System.out.println("&& a="+a);//3
a=3;
if(false&++a<3) {}
System.out.println("& a="+a);//4

a=3;
if(true||++a<3) {}
System.out.println("|| a="+a);//3
a=3;
if(true|++a<3) {}
System.out.println("| a="+a);//4

方法/函数(method/function)

方法:类中定义的 一段具有特定功能的代码块

方法意义:提高代码的复用性

 * 方法:在类中定义的具有特定功能的代码块
    * 方法关键字:()
    * 方法格式:
    *   修饰符  返回值类型 方法名(参数列表){
    *        实现方法具体功能的代码块(方法体)
    *        return 返回值;
    *   }
    * 方法:小程序 --计算机命令和数据的集合
    *      程序作用--处理数据  ---把原始数据 通过指定的算法处理后 得到结果数据
    * 修饰符:让被修饰者具有一些本来不具有的特征
    *      public static
    *      public :  可以让方法在整个项目中访问到
    *      static :  可以让方法在主方法(主方法是类运行的入口)中调用
    * 返回值:     方法运行完后得到的结果数据
    * 方法名:方法的标示符:::命名规则--命名规范(和变量名完全相同::尽量增加可读性+除了第一
                                           个单词 其他单词首字母大写)
    * 参数列表:定义的多个变量 来接受方法运行需要的原始数据
    * 
    * 
    * 通过方法来模拟洗衣机
    * public static 干净衣服类型  小天鹅(脏衣服类型 a,水类型 b,电类型 c){
    *        注水
    *        搅拌
    *        甩干
    *        return 干净衣服;
    * }
    * 
    * 
    * 方法声明部分: 修饰符  返回值类型 方法名(参数列表)
    *         :方法的使用说明
    * 方法体部分:   {....}
    *         :方法功能的具体实现

案例1

//求两个int数的和
//确定方法的参数列表 :为接受方法运行需要的原始数据定义的变量
//确定方法的返回值:方法运行完后返回给调用者的结果数据
public static int  add(int n,int m) {//定义方法
    int sum=n+m;
    System.out.println(n+"+"+m+"="+(n+m));
    return sum;
}

public static void main(String[] args) {
    //调用方法
    int s=add(1, 2);//int s:调用者用于接受方法运行后的结果数据而定义的变量
    System.out.println("s="+s);
    add(11, 22);//调用者可以不接收方法的返回值
}

案例2

//打印一个int和一个doublde的和
//方法参数列表:int ,double
//方法返回值:无
public static void addIntDouble(int a,double b) {//如果方法没有返回值 返回值类型用void标示
    System.out.println(a+"+"+b+"="+(a+b));
    //return ; //当没有返回值时 return是可以省略
    return;
    //System.out.println(1);//Unreachable code
}
public static void main(String[] args) {
    addIntDouble(1, 1.2);//调用方法
}

方法注意事项

    * 注意事项1:方法定义在类中  而非主方法中
    * 注意事项2:方法原始数据可以有多个  而结果数据最多只能有一个
    * 注意事项3:方法必须在主方法中调用 才能运行
    * 注意事项4:方法有返回值 调用者可以选择不接收方法的返回值
    * 注意事项5:方法如果没有返回值  返回值类型用void来标示
    * 注意事项6:方法没有返回值 return可以省略
    * 注意事项7return两个作用:把返回值返回给调用者  + 结束方法

形参和实参

**形参:定义方法时 用于接受方法运行需要的原始数据而定义的参数列表
实参:调用方法时 调用者给方法传递的原始数据 **

基本数据类型和引用数据类型作为参数

//方法参数是基本数据类型:实参给形参传递的是常量值
public static void testInt(int a) {
    a++;
    System.out.println("a="+a);//13
}
public static void main(String[] args) {
    int aa=12;
    testInt(aa);//等价于:int a=aa;a++;System.out.println("a="+a);
    //int a=aa;把 变量aa的值 复制一份 给 a  在方法体中对a进行修改  跟变量aa没有关系
    System.out.println("aa="+aa);//12
}
//方法参数列表是引用数据类型 :传递的是对象的地址
//                         两个引用指向同一个对象
public static void testArray(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        arr[i]++;
    }
}
public static void main(String[] args) {
    int[] array= {2,4,5,6,3};
    testArray(array);//等价于:int[] arr=array;让数组名arr指向了array指向的数组对象 
    //等于说是给18行的数组对象起了两个名字:main方法中的array 和testArray方法中的arr
    System.out.println(array[0]);//3
    //System.out.println(arr);
}

方法递归

递归:方法自己调用自己
方法递归 必须有一个出口

//求1到n的和
public static int getSum1(int n) {
    int sum=0;
    for (int i = 1; i <=n; i++) {
        sum+=i;
    }
    return sum;
}
//1+2+3+4+....+(n-1)+n;
//1到n的和 等价于n+ 1到n-1的和
//使用递归实现
public static int getSum2(int n) {
    if(n==1) {
        return 1;
    }
    return n+getSum2(n-1);
}
public static void main(String[] args) {
    System.out.println(getSum2(10));
    //如果递归没有出口  会出现栈溢出错误StackOverflowError
}

形参和实参

**形参:定义方法时 用于接受方法运行需要的原始数据而定义的参数列表
实参:调用方法时 调用者给方法传递的原始数据 **

基本数据类型和引用数据类型作为参数

//方法参数是基本数据类型:实参给形参传递的是常量值
public static void testInt(int a) {
    a++;
    System.out.println("a="+a);//13
}
public static void main(String[] args) {
    int aa=12;
    testInt(aa);//等价于:int a=aa;a++;System.out.println("a="+a);
    //int a=aa;把 变量aa的值 复制一份 给 a  在方法体中对a进行修改  跟变量aa没有关系
    System.out.println("aa="+aa);//12
}
//方法参数列表是引用数据类型 :传递的是对象的地址
//                         两个引用指向同一个对象
public static void testArray(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        arr[i]++;
    }
}
public static void main(String[] args) {
    int[] array= {2,4,5,6,3};
    testArray(array);//等价于:int[] arr=array;让数组名arr指向了array指向的数组对象 
    //等于说是给18行的数组对象起了两个名字:main方法中的array 和testArray方法中的arr
    System.out.println(array[0]);//3
    //System.out.println(arr);
}

方法递归

递归:方法自己调用自己
方法递归 必须有一个出口

//求1到n的和
public static int getSum1(int n) {
    int sum=0;
    for (int i = 1; i <=n; i++) {
        sum+=i;
    }
    return sum;
}
//1+2+3+4+....+(n-1)+n;
//1到n的和 等价于n+ 1到n-1的和
//使用递归实现
public static int getSum2(int n) {
    if(n==1) {
        return 1;
    }
    return n+getSum2(n-1);
}
public static void main(String[] args) {
    System.out.println(getSum2(10));
    //如果递归没有出口  会出现栈溢出错误StackOverflowError
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值