特殊流程控制
Braek:
public class Text1{
public static void main(String[]args){
for(int i=0 ;i<10 ;i++ ){
if(i==3){
break;
}
System.out.println("i="+i);
}
System.out.println("Game Over!");
}
}
Continue:
public class Text1{
public static void main(String[]args){
for(int i=0 ;i<100 ;i++ ){
if(i%10==0){
continue;
}
System.out.println("i="+i);
}
}
}
/*
break使用在 switch-case 循环结构中,作用是跳出当前循环
continue使用在循环结构中,跳出当次循环
*/
class code2{
public static void main(String[] args)
{
System.out.println("Hello World!");
for(int i=1 ;i<=10 ;i++ ){
if(i%4==0){
//break;
continue;
}
System.out.println(i);
}
level:for(int i=1 ;i<=5 ;i++ ){
for(int j=1 ;j<=10 ;j++ ){
if(j%4==0){
//break;123
//continue;1235678910
//break level;123132123123123
continue level;
}
System.out.print(j);
}
System.out.println();
}
}
}
//输出100以内的素数
public class code1{
public static void main(String[]args){
boolean b=false;
Lable:for(int i=2 ; i<=100;i++){
for(int j=2 ; j<Math.sqrt(i) ;j++ ){
if(i%j==0){
//b=true;
break Lable;
}
}
// if(!b){
System.out.println(i);
// }
// b=false;
}
}
}
Return:
return:并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内
注意:
break只能用于switch语句和循环语句中。
continue 只能用于循环语句中。 If ?\While +switch while +continue
二者功能类似,但continue是终止本次循环,break是终止本层循环。
break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
/*
编写程序:由键盘输入三个整数分别存入变量num1、num2、num3,
对它们进行排序(使用 if-else if-else),并且从小到大输出。
*/
import java.util.*;
public class code3{
public static void main(String[]args){
Scanner scanner =new Scanner (System.in);
System.out.println("由键盘输入三个整数分别存入变量num1、num2、num3");
int a=0,b=0,c=0;
boolean tt=true;
L:while(tt){
try{
tt=false;
a=scanner.nextInt();
switch (a)
{
case 1:
continue L;
}
b=scanner.nextInt();
c=scanner.nextInt();
break;
}catch(Exception e){
System.out.println("输入错误!\n由键盘输入三个整数分别存入变量num1、num2、num3");
//scanner.close();
scanner =new Scanner (System.in);
tt=true;
continue;
}
}
if(a>b){
if(c>a){
System.out.println(c+">"+a+">"+b);
}else if(c<b){
System.out.println(a+">"+b+">"+c);
}else{
System.out.println(a+">"+c+">"+b);
}
}else{//b>a
if(c>b){
System.out.println(c+">"+b+">"+a);
}else if(c<a){
System.out.println(b+">"+a+">"+c);
}else{
System.out.println(b+">"+c+">"+a);
}
}
}
}
/*
一个数如果恰好等于它的因子之和,这个数就称为"完数"。(因子:除去这个数本身正的约数)
例如6=1+2+3.编程 找出1000以内的所有完数
*/
class code4
{
public static void main(String[] args)
{
int factor=0;
int count=0;
for(int i=0;i<100;i++){
for(int j=1;j<i;j++){
if(i%j==0){
factor+=j;
}
}
if(factor==i){
System.out.println(i);
count++;
}
factor=0;
}
System.out.println("最后的数量为"+count);
}
}
数组
数组是多个相同类型数据的组合,实现对这些数据的统一管理
数组中的元素可以是任何数据类型,包括基本类型和引用类型
数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量
一维数组声明
一维数组的声明方式:
type var[] 或 type[] var;
例如:
int a[];
int[] a1;
double b[];
Mydate[] c; //对象数组
Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法
一维数组初始化
动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
int[] arr = new int[3];
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
MyDate dates[];
dates = new MyDate[3];
dates[0] = new MyDate(22, 7, 1964);
dates[1] = new MyDate(1, 1, 2000);
dates[2] = new MyDate(22, 12, 1964);
静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
int a[] = new int[]{ 3, 9, 8};
int[] a = {3,9,8};
MyDate dates[] = {
new MyDate(22, 7, 1964),
new MyDate(1, 1, 2000),
new MyDate(22, 12, 1964)
}
public class Text2{
public static void main(String[]args){
//int [] arr =new int [3];
int arr [] =new int [3];
arr[0]=3;
arr[1]=9;
arr[2]=8;
for(int a:arr)
System.out.println(a);
person p[]={new person( "王琪" , 87 ),new person( "方法" , 87),new person( "好好",89 )};
for( person a :p ){
System.out.println(a.toString());
}
}
static class person{
String name;
int age;
public person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "name+"+name+"age"+age;
}
}
}
Java内存的结构
栈(stack) 堆 (heap) 方法区 字符串常量池 静态域
int[] scores = new int[3];
scores[0] = 78;
scores[1] = 88;
scores[2] = 98;
String[] names= new String[3];
names[0] = “商文通”;
names[1] =“汤化峰”;
int[] myInt = new int[5];
for(int i = 0;i < myInt.length;i++){
sysout(myInt[i]);
myInt[i] = 2*i+1;
sysout(myInt[i]);
class Text3{
public static void main(String[] args){
System.out.println("Text3");
int [] score = new int [3];
score [0] = 78;
score [1] = 88;
score [2] = 98;
String[] name= new String [3];
name[0] = "王琪";
name[1] = "你好";
int [] myInt=new int [5];
for(int i=0 ;i<myInt.length ; i++){
System.out.print(myInt[i]+" ");
myInt[i] = 2*i+1;
System.out.println(myInt[i]);
}
}
}
创建基本数据类型数组
Java中使用关键字new创建数组对象
创建基本数据类型一维数组对象
class Text4{
public static void main(String[] args)
{
System.out.println("Hello World!");
int [] s;
s = new int [10];
for( int i=0 ;i<10 ;i++ ){
s[i]=2*i+1;
System.out.println(s[i]);
}
}
}
public class Test{
public static void main(String args[]){
int[] s;
s = new int[10];
//int[] s=new int[10];
//基本数据类型数组如果没有赋初值,
//Java自动给他们赋默认值。
for ( int i=0; i<10; i++ ) {
s[i] =2*i+1;
System.out.println(s[i]);
}
}
}
创建对象数组
创建元素为引用类型(对象)的数组
class MyDate{
private int day;
private int month;
private int year;
public MyDate(int d, int m, int y){
day = d; month = m; year = y;
}
public void display(){
System.out.println(year + "-" + month + "-" + day);
}
}
class Text5{
public static void main(String[] args)
{
MyDate [] date1;
date1 = new MyDate [4];
MyDate [] date2;
date2 =new MyDate[4];// {new MyDate(1,2,3),new MyDate(1,2,3),new MyDate(1,2,3)};
//MyDate [] date3;
///date3 = {new MyDate(1,2,3),new MyDate(1,2,3),new MyDate(1,2,3)};
MyDate [] date4={new MyDate(1,2,3),new MyDate(1,2,3),new MyDate(1,2,3)};
}
static class MyDate{
int day;
int month;
int year;
public MyDate(int d,int m,int y){
this.day=d;
this.month=m;
this.year=y;
}
public void display(){
System.out.println(year+"-"+month+"-"+day);
}
}
}
package com.atguigu.java;
/*
* 数组 : 数(即变量)的组合 ,这些变量一定是享有同数据类型的
*/
public class code1 {
public static void main(String[] args) {
int q=12;
boolean b=false;
String str ="MM";
//数据的声明与初始化
//1.1声明
int [] scores;//int 型数组的声明
String [] names;
//1.2初始化
//静态初始化
names = new String []{"1", "2", "3" ,"4" ,"5"};
double [] hight = new double []{1.223,13.213213,13.123123,1322.132123,131.1331};
//动态初始化
scores=new int [5];
//2如何调用数组中的元素,使用下标
//数组的元素下标从0开始,到n-1节结束
scores[0]=90;
scores[1]=80;
//数组的长度还会在建立时就决定(.length属性调用)
System.out.println(names.length);
System.out.println(scores.length);
//如何遍历一个数组
for(int a=0 ;a<names.length ;a++ ){
System.out.println(names[a]);
}
for(int c=0 ;c<scores.length ;c++ ){
System.out.println(scores[c]);
}
//创建不同类型的数组的元素的默认初始化问题;
//创建 byte/short/int/long默认的初始化值为0
short [] sh1=new short[3];
for(short sh:sh1){
System.out.println(sh);
}
char [] ch1 =new char [3];
for(char c:ch1){
System.out.println( c==' ');
}
//float/double 数组默认的类型为0.0
float [] f1 =new float[3];
for(int i=0 ;i<f1.length ;i++ ){
System.out.println(f1[i]);
}
//boolean的默认人初始化为false
boolean [] b1=new boolean[3];
for(boolean bb:b1){
System.out.println(bb);
}
// 创建的是引用数据类型数组;默认的初始化值为null
String [] strs=new String [4];
for(String s:strs){
System.out.println(s);
}
person1 []p1=new person1[]{};
}
}
class person1{
}
数组元素的默认初始化
数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。例如:
public class Test {
public static void main(String argv[]){
int a[]= new int[5];
System.out.println(a[3]); //a[3]的默认值为0
}
}
对于基本数据类型而言,默认初始化值各有不同
对于引用数据类型而言,默认初始化值为null(注意与0不同!)
package com.atguigu.java;
public class code2 {
public static void main(String[] args) {
//数组的引用
String[] s = new String[] {"haha" ,"hehe" , "hihi",};
String [] ss=s;
ss[0]="gg";
System.out.println(ss[0]+" "+s[0]);
//数组一旦初始化,其长度不可以改变
int score1[]=new int []{11,22,33,44};
int score2[]=new int[6];
for(int i=0;i<score1.length;i++){
score2[i]=score1[i];
}score2[4]=12;score2[3]=31;
for(int a :score1)
System.out.println(a);
for(int a :score2)
System.out.println(a);
}
}
数组元素的引用
定义并用运算符new为之分配空间后,才可以引用数组中的每个元素;
数组元素的引用方式:数组名[数组元素下标]
数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i];
数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1;如int a[]=new int[3]; 可引用的数组元素为a[0]、a[1]、a[2]
每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长度(元素个数)
数组一旦初始化,其长度是不可变的
练习1
1.(1)定义类Pritimive,在类中定义一个有3个元素的boolean类型的数组t作为其成员变量。数组元素未赋值。
定义类Array1,在Array1的main()方法中创建Pritimive对象d,输出其成员变量t的三个元素值。
练习目的:检验基本数据类型数组创建时的自动赋值。
(2)给对象d的成员变量t赋值为{true,true,true},并输出t的三个元素值。
/*
*定义类Pritimive,在类中定义一个有3个元素的boolean类型的数组t作为其成员变量。数组元素未赋值。
定义类Array1,在Array1的main()方法中创建Pritimive对象d,输出其成员变量t的三个元素值。
练习目的:检验基本数据类型数组创建时的自动赋值。
*/
package com.atguigu.java;
public class code3 {
public static void main(String[] args) {
Primitive p=new Primitive();
for(int i=0 ;i<p.t.length;i++){
System.out.println(p.t[i]);
}
p.t[0]=true;
p.t[1]=true;
p.t[2]=true;
for(int i=0 ;i<p.t.length;i++){
System.out.println(p.t[i]);
}
}
}
class Primitive{
boolean [] t =new boolean[3];
}
2. 定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定,打印出3年级(state值为3)的学生信息。
提示:生成随机数:Math.random(),返回值类型double;
四舍五入取整:Math.round(double d),返回值类型long。
/*
* 定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。
* 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定,打印出3年级(state值为3)的学生信息。
提示:生成随机数:Math.random(),返回值类型double;
四舍五入取整:Math.round(double d),返回值类型long。
*/
package com.atguigu.java;
//1定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)
class student1{
int numbe;
int state;
int score;
public String toString(){
return ("学号:"+numbe+"年级:"+state+"成绩:"+score);
}
}
public class code7 {
public static void main(String[] args) {
//2.创建20个学生对象,学号为1到20,年级和成绩都由随机数确定
student1 [] st = new student1[20];
for(int i=0;i<st.length;i++){
st[i]=new student1();
st[i].numbe=i+1;
st[i].state=nianji();
st[i].score=chengji();
System.out.println(st[i]);
}
//3.打印出3年级(state值为3)的学生信息
}
public static int nianji(){
return (int)(Math.random()*10)%3;
}
public static int chengji(){
return (int)(Math.random()*100)%100;
}
}
/*
* 学号:1年级:2成绩:59
学号:2年级:0成绩:50
学号:3年级:0成绩:59
学号:4年级:2成绩:89
学号:5年级:1成绩:11
学号:6年级:0成绩:90
学号:7年级:2成绩:20
学号:8年级:1成绩:55
学号:9年级:0成绩:64
学号:10年级:1成绩:76
学号:11年级:0成绩:82
学号:12年级:1成绩:62
学号:13年级:0成绩:13
学号:14年级:0成绩:57
学号:15年级:0成绩:10
学号:16年级:2成绩:45
学号:17年级:1成绩:50
学号:18年级:2成绩:99
学号:19年级:2成绩:16
学号:20年级:0成绩:49
*/
3. 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
成绩>=最高分-10 等级为’A’
成绩>=最高分-20 等级为’B’
成绩>=最高分-30 等级为’C’
其余 等级为’D’
提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
/*
*
*3. 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
成绩>=最高分-10 等级为’A’
成绩>=最高分-20 等级为’B’
成绩>=最高分-30 等级为’C’
其余 等级为’D’
提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
*/
package com.atguigu.java;
import java.util.Scanner;
public class code5 {
static int max;
public static void main(String[] args) {
Scanner s= new Scanner(System.in);
//1根据提示创建一个Scanner类对象,输入学生个数
System.out.println("please input the number of students:");
int num=s.nextInt();
//2根据写入的学生信息,建立相当长度的int数据
int student[]=new int [num];
//3通过循环从键盘输入学生成绩
System.out.println("input the "+num+" goards");
for(int i=0;i<num;i++){
student[i]=s.nextInt();
}
//4遍历数组元素 同事获得最大值
max=student[0];
for(int a:student){
if(a>max){
max=a;
}
}
//获得学生等级
System.out.println("最高分:"+max+" ");
System.out.println("A:>="+(max-10)+"B:>="+(max-20)+"C:>="+(max-30)+"D:");
for(int i=0;i<num;i++){
System.out.println("student"+"["+i+"]="+fun(student[i]));
}
}
public static char fun(int a){
if(a>=max-10){
return 'A';
}else if(a>=max-20){
return 'B';
}else if(a>=max-30){
return 'C';
}else{
return 'D';
}
}
}
多维数组
二维数组[][]:数组中的数组
格式1(动态初始化):int[][] arr = new int[3][2];
定义了名称为arr的二维数组
二维数组中有3个一维数组
每一个一维数组中有2个元素
一维数组的名称分别为arr[0], arr[1], arr[2]
给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;
格式2(动态初始化):int[][] arr = new int[3][];
二维数组中有3个一维数组。
每个一维数组都是默认初始化值null (注意:区别于格式1)
可以对这个三个一维数组分别进行初始化
arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
注:
int[][]arr = new int[][3]; //非法
格式3(静态初始化):int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
定义一个名称为arr的二维数组,二维数组中有三个一维数组
每一个一维数组中具体元素也都已初始化
第一个一维数组 arr[0] = {3,8,2};
第二个一维数组 arr[1] = {2,7};
第三个一维数组 arr[2] = {9,0,1,6};
第三个一维数组的长度表示方式:arr[2].length;
注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。
Java中多维数组不必都是规则矩阵形式
package com.atguigu.java;
public class code6 {
public static void main(String[] args) {
//\/int [] arr =new int[];
//1.二维数组的声明与初始化
//1.1动态初始化
int [][] arr1 = new int [4][3];
int [][] arr2 = new int [4][];
//2如何引用二维数组中的元素
arr1 [0][0] = 10;
arr2 [3][2] = 20;
arr2 [0] = new int [3];
//arr2 [1][17]=10; //??????
arr2 [1] = new int [4];
arr2 [1] = new int [5];
arr2 [2] = new int [7];
//1.1静态初始化
int [][] arr3 = new int [][]{{1,2,3,4,5},{3,4,5,6},{4,5,6}};
}
}
练习2:获取arr数组中所有元素的和。使用for的嵌套循环即可。
声明:int[] x,y[]; 以下选项允许通过编译的是:
a ) x[0] = y; no
b) y[0] = x; yes
c) y[0][0] = x;no
d) x[0][0] = y;no
e) y[0][0] = x[0];yes
f) x = y; no
public class code9 {
//二维数组的定义和初始化
//二维数组的动态定义
public static void main(String[] args) {
int [] x = null,y[]=null;
//x[0]=y;
y[0]=x;
//y[0][0]x;
//x[0][0]=y;
y[0][0]=x[0];
}
}
一维数组:int[] x 或者int x[]
二维数组:int[][] y 或者 int[] y[] 或者 int y[][]
使用二维数组打印一个 10 行杨辉三角.
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
....
package com.atguigu.java;
public class code8 {
public static void main(String[] args) {
new YangHui().fun();
}
}
class YangHui{
public void fun(){
int [][] yanghui = new int [10][];
for(int i=0 ;i<yanghui.length ;i++ ){
yanghui[i]=new int [i+1];
yanghui[i][0]=yanghui[i][i]=1;
for(int j=1 ;j<i ;j++){
yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j];
}
}
//遍历
for( int i=0;i<yanghui.length ;i++ ){
for(int j=0 ;j<yanghui[i].length ;j++ ){
System.out.print(yanghui[i][j]+" ");
}
System.out.println();
}
}
}
/*
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
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
*/
【提示】
1. 第一行有 1 个元素, 第 n 行有 n 个元素
2. 每一行的第一个元素和最后一个元素都是 1
3. 从第三行开始, 对于非第一个元素和最后一个元素的元素.
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
1.求数组元素的最大值、最小值、平均数、总和等
2.数组的复制、反转
3.数组元素的排序
定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。
使用简单数组
(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数组的复制
数组排序
插入排序
直接插入排序、折半插入排序、Shell排序
交换排序
冒泡排序、快速排序(或分区交换排序)
选择排序
简单选择排序、堆排序
归并排序
基数排序
排序方法的选择
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
冒泡排序
排序思想:
相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作
数组排序
java.util.Arrays类的sort()方法提供了数组元素排序功能:
import java.util.*;
public class Sort {
public static void main(String[] args) {
int [] number = {5,900,1,5,77,30,64,700};
Arrays.sort(number);
for(int i = 0; i < number.length; i++)
System.out.println(number[i]);
}
}
操作数组的工具类:Arrays
java.util.Arrays类包含了用来操作数组(比如排序和搜索)的各种方法。Arrays拥有一组static方法。
equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
fill():将值填入array中。
sort():用来对array进行排序。
binarySearch():在排好序的array中寻找元素。
另:System.arraycopy():array的复制。
数组操作常见问题
数组脚标越界异常(ArrayIndexOutOfBoundsException)
int[] arr = new int[2];
System.out.println(arr[2]);
访问到了数组中的不存在的脚标时发生。
空指针异常(NullPointerException)
int[] arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。