java基础内容

 

基础语法

注释

 //单行注释  双斜杠开头
 //输出一个helloworld
 System.out.println("Hello world");
 //多行注释:可以注释一段文字
 /*我是多行注释
 666
  */

标识符

标识符注意点

  1. 所有标识符都应该以字母和美元符($)或者下划线开头

  2. 首字母之后可以是字母,字符,下划线,美元符任意组合

  3. 不能使用关键字命名

  4. 标识符是大小写敏感的

  5. 可以中文命名,但不推荐很low

数据类型

强类型语言

要求变量的使用要严格符合规定,所有的变量都必须先定义后使用

 

java的数据类型分为两大类

基本类型

整数类型
  1. byte

  2. short

  3. int

  4. long

浮点型类型
  1. float

  2. double

字符型类型

char

Boolean类型

True False

引用类型

除了基本数据类型以外的类型,都是引用数据类型

  1. 接口

  2. 数组

image-20210908223049201

 //八大数据类型
 
         //整数
         int num=20; //最常用
         byte num1=20;
         short num2=30;
         long num3=30L;//Long类型要在数字后面加个L
 
         //小数
         float num4=50.1F;//float类型要在数字后面加个F
         double num5=3.145664964;
 
         //字符
         char name='a';
         //字符串String 不是关键字,是类
         //String name="海森";
 
         //布尔类型 是非
         boolean flag=true;
         //boolean flag=false;

 

         //整数扩展:  进制 二进制0b  十进制  八进制0  十六进制0x
 
         int i=10;
         int i1=0b1;
         int i2=010; //八进制0
         int i3=0x10;//十六进制0x 0~9 A~F 16
 
         System.out.println(i);
         System.out.println(i1);
         System.out.println(i2);
         System.out.println(i3);
 
         //浮点数扩展? 银行业务怎么表示 ?
         //BigDecimal 数字工具类
         //float 有限 离散 舍入误差 接近但不等于
         //double
         //最好不要使用浮点数比较
 
         float f=0.1f;//0.1
         double d=1.0/10;//0.1
 
         System.out.println(f==d); //false
 
         float f1=231313131313131f;
         double d1=f1+1;
         System.out.println(f1==d1); //true
 
 
         //字符扩展
         char c1='a';
         char c2='中';
 
         System.out.println(c1);
         System.out.println((int)c1);//强制转换 //97
         System.out.println(c1);
         System.out.println((int)c1);//强制转换 //20013
 
         //所有的字符本质还是数字
         //编码 Unicode 表:(97=a 65=A)
 
 
         //转义字符
         // \t制表符
         // \n 换行

类型转换

注意点

  1. 不能对布尔值进行转换

  2. 不能把对象类型转换为不相干的类型

  3. 在把高容量转换到低容量的时候,强制转换

  4. 转换的时候可能存在内存溢出,或者精度问题

         int i=128;
         byte b=(byte)i; //内存溢出
 
         //强制转换 (类型)变量名 高--低
         System.out.println(i);//128
         System.out.println(b);//-128
 
         //自动转换 低--高
         int i1=128;
         double b1=i1; //内存溢出
         System.out.println(i1);//128
         System.out.println(b1);//128.0
 
         /*
         注意点:
         1.不能对布尔在进行转换
         2.不能把对象类型转换为不相干的类型
         3. 在把高容量转换到低容量的时候,强制转换
         4. 转换的时候可能存在内存溢出,或者精度问题
          */
 
         System.out.println("============");
         System.out.println((int)23.7);//23
         System.out.println((int)-45.89f);//-45
 
         System.out.println("============");
         char c='a';
         int d=c+1;
         System.out.println(d);//98
         System.out.println((char)d);//b
 
         System.out.println("============");
         //操作比较大的数时候,注意溢出问题
         //jdk7 新特性可以在数字之间加上下划线
         int momey =10_0000_0000;
         int years=20;
 
         int total=momey*years;
        // System.out.println(total);//-1474836480,计算溢出了
         long total1=momey*years;
        // System.out.println(total1);//-1474836480 //默认是int 转换前就已经出现问题了
         long total2=momey*((long)years);
         System.out.println(total2); //20000000000 先把一个数转换为long

变量

变量可以变化的量,其要素包括变量名,变量类型,变量作用域。

注意事项

  1. 每个变量都要有类型,可以是基本数据类型,或者引用类型

  2. 变量名是合法的标识符

  3. 变量声明后面必须有分号结尾

变量又包括,类变量,实例变量,局部变量

     //类变量 会从属于这个类,会随着这个类同时出现同时消失
     static double salary=100;
 
     //实例变量:从属于对象;如果不进行初始化,这个类型的默认值是0 0.0
     //布尔值是false
     //除了基本类型其余的默认值都是null
     String name;
     int age;
 
     //main方法
     public static void main(String[] args) {
 
         //局部变量 必须声明和给初始值
         int i=10;
         System.out.println(i);
 
         Demo04 demo04 = new Demo04();
         System.out.println(demo04.age);
         System.out.println(demo04.name);
 
 
         System.out.println(salary);
    }

常量

初始化后不能改变的值,不会变动的值

final关键字

     //修饰符不存在前后顺序
     static final double PI=3.14;
     public static void main(String[] args) {
         System.out.println(PI);
    }

运算符

 //二元运算符
         // Ctrl +d :复制当前行到下一行
         int a=10;
         int b=20;
         int c=25;
         int d=25;
 
         System.out.println(a+b);
         System.out.println(a-b);
         System.out.println(a*b);
         System.out.println(a/(double)b);
 
         long l=123123123456123l;
         int i=123;
         short s=10;
         byte b1=8;
 
         System.out.println(l+i+s+b1); //Long
         System.out.println(i+s+b1);//Int
         System.out.println(s+b1);//Int
 
         //结论如果运算里面有long那么结果就是lang类型,其他的也同理
 
 
         //关系运算符的返回结果:正确 和错误 true false
         int a=10;
         int b=20;
         int c=21;
 
         System.out.println(a>b);
         System.out.println(a<b);
         System.out.println(a==b);
         System.out.println(a!=b);
 
         System.out.println(c%a);

关系运算符的返回结果:正确 和错误 true false

  // ++ -- 一元运算符
 
         int a=3;
         int b=a++; //执行完这行代码,先给b赋值,再自增
         int c=++a; //执行完这行代码,先自增,再给c赋值
 
         System.out.println(a);
         System.out.println(b);
         System.out.println(c);
 
         //幂运算 很多运算会使用一些工具类来操作
         double pow = Math.pow(2, 3);
         System.out.println(pow);

++ -- 一元运算符

  // 与或非运算
 
         boolean a=true;
         boolean b=false;
 
         System.out.println("a && b:"+(a&&b));//逻辑与运算,两个变量为真,结果才为true
         System.out.println("a || b:"+(a||b));//逻辑或运算,一个变量为真,结果才为true
         System.out.println("!(a&&b):"+!(a&&b));//如果是真,则变为假,如果是假则为真
 
         //短路运算
         int c=4;
         boolean d=(c<4)&&(c++<4);
         System.out.println(c);
         System.out.println(d);

与或非运算

         int a=20;
         int b=10;
 
         //字符串连接符 + ,string
         System.out.println(" "+a+b);
         System.out.println(a+b+" ");

字符串连接符

         //三元运算符
         //x?y:z   如果x==true 则结果为y 否则为z
         int score=50;
 
         String type=score<60 ? "不及格":"及格";
         System.out.println(type);

三元运算符

包机制

image-20210909193103718

javadoc

 package base;
 
 /**
  * @author haisen
  * @version 1.0
  * @since 1.8
  */
 public class Doc {
     String name;
 
     /**
      * @author haisen
      * @param name
      * @return
      * @throws Exception
      */
     public String test(String name) throws Exception{
         return name;
    }
 }
 

 

Scanner用户交互

next():

  1. 一定要读取到有效字符后才可以结束输入

  2. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉

  3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符

  4. next()不能得到带有空格的字符串

nextLine():

  1. 以Enter为结束符,也就是nextLine()方法返回的是输入回车之前的所有字符

  2. 可以获得空格

 

     public static void main(String[] args) {
         //创建一个扫描器对象,用于接收键盘的数据
         Scanner scanner = new Scanner(System.in);
 
         System.out.println("使用next方式接收");
 
         if (scanner.hasNext()){
             System.out.println("next方式接收");
             String str=scanner.next();
             System.out.println("输出的内容是"+str);
        }
 
         //凡是io流的类如果不关闭会一直占用资源,要养成良好的习惯
         scanner.close();
    }
     public static void main(String[] args) {
         //从键盘中获取数据
         Scanner scanner = new Scanner(System.in);
 
         //判断用户还有没有输入
         if (scanner.hasNextLine()){
             String str=scanner.nextLine();
             System.out.println("你输入的数据是"+str);
        }
         scanner.close();
    }
     public static void main(String[] args) {
         //我们可以输入多个数据,平求其总数和平均值,每输入一个数字回车确认,通过输入非数字来结束并输出结果
 
         Scanner scanner=new Scanner(System.in);
 
         //和
         double sum=0;
         //计算了多少个数字
         int m=0;
 
         //通过循环判断是否还有输入,并在里面对每一次数据进行求和统计
         while(scanner.hasNextDouble()){
             double x=scanner.nextDouble();
             m=m+1;
             sum=sum+x;
             System.out.println("你输入了第"+m+"个数据,当前结果是:"+sum);
        }
 
         System.out.println("一个有"+m+"数据 数据和是"+sum);
         System.out.println(+m+"个数据 平均值是"+sum/m);
         scanner.close();
    }

if选择结构

1. if语句至多有一个else语句,else语句必须在所有的else if 语句之后

2. if语句有若干个else if 语句,他们必须在 else语句之前

3.一旦其中一个else if 语句检测为true,其他的else if 以及 else 语句将跳过执行

     public static void main(String[] args) {
         Scanner scanner=new Scanner(System.in);
 
         System.out.println("请输入成绩");
 
         int score = scanner.nextInt();
 
         if (score==100){
             System.out.println("成绩满分");
        }else if (score<100 && score>=90){
             System.out.println("A级");
        }else if (score<100 && score>=90){
             System.out.println("B级");
        }else if (score<90 && score>=80){
             System.out.println("C级");
        }else if (score<80 && score>=70){
             System.out.println("D级");
        }else if (score<70 && score>=60){
             System.out.println("E级");
        }else if (score<60 && score>=0){
             System.out.println("不及格");
        }else {
             System.out.println("成绩不合法");
        }
 
         scanner.close();
    }

 

switch选择

  public static void main(String[] args) {
         Scanner scanner =new Scanner(System.in);
         //case 穿透 switch 匹配一个具体的值
         char c='A';
         switch(c){
             case 'A':
                 System.out.println("A级");
                 break;
             case 'B':
                 System.out.println("B级");
                 break;
             case 'C':
                 System.out.println("C级");
                 break;
             default:
                 System.out.println("未知等级");
        }
 
         scanner.close();
    }
 public static void main(String[] args) {
         //jdk新特性,表达式结果可以是字符串!!!
         //字符的本质还是数字
 
         String name="海森";
 
         switch(name){
             case "海森":
                 System.out.println("名字是海森");
                 break;
             case "大海":
                 System.out.println("名字是大海");
                 break;
             default:
                 System.out.println("名字不对口");
        }
    }

While循环

     public static void main(String[] args) {
         int i=0;
         int sum=0;
 
         while(i<=100){
             sum=sum+i;
             i++;
        }
         System.out.println(sum);
    }

while和do while的区别

  1. while先判断后执行。do while 是先执行后判断

  2. do while总是保证循环体会被执行至少一次,这是他们只要的区别

for循环

for循环说明:最先执行初始化步骤,可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。然后,检测布尔表达式的值,如果为true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。再次检测布尔表达式,循环执行上面的过程。

 //计算1到100的奇数和和偶数和
public static void main(String[] args) {
int oddsum=0;
int evensum=0;

for (int i = 0; i <= 100; i++) {
if ((i%2)!=0){
oddsum+=i;
}else{
evensum+=i;
}
}
System.out.println("奇数和"+oddsum);
System.out.println("偶数和"+evensum);
}
    public static void main(String[] args) {
//for循环输出1-1000之间能被5整除的数,并且每行输出三个

for (int i = 1; i <= 1000; i++) {
if ((i%5)==0){
System.out.print(i+"\t");
}
if (i%(3*5)==0){
System.out.println();
}
}
}
public static void main(String[] args) {
//打印九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j=1;j<=i;j++){
System.out.print(i+"乘于"+j+"等于"+i*j+"\t");
}
System.out.println();
}
}

break在任何循环语句的主体部分,均可用break控制循环的过程,break用于强行退出循环,不执行循环中剩余的语句。(break也在switch中使用)

     public static void main(String[] args) {
         for (int i = 0; i < 100; i++) {
             if (i==30){
                 break;
            }
 
             System.out.println(i);
        }
    }

 

continue语句用在循环体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

     public static void main(String[] args) {
         for (int i = 0; i < 100; i++) {
             if (i%10==0){
                 continue;
            }
             System.out.print(i);
        }
    }
         //打印三角形
 
         for (int i = 1; i <= 5; i++) {
             for (int j=5;j>=i;j--){
                 System.out.print("!");
            }
             for (int j=1;j<=i;j++){
                 System.out.print("*");
            }
             for (int j=1;j<i;j++){
                 System.out.print("*");
            }
             System.out.println();
        }
    }

方法

     public static void main(String[] args) {
         int max = max(10, 10);
 
         System.out.println(max);
    }
 
     //比大小
     public static int max(int num1,int num2){
         int result=0;
         if (num1==num2){
             System.out.println("num1=num2");
             return 0;
        }
         if (num1>num2){
             result=num1;
        }else {
             result=num2;
        }
         return result;
    }

方法的重载就是在一个类中,有相同的函数名称,但形参不同的函数

方法重载的规则

  1. 方法名称必须相同

  2. 参数列表必须不同(个数不同,或类型不同,参数排列顺序不同)

  3. 方法返回值可以相同也可以不相同

可变参数

  1. 从1.5开始,java支持传递同类型的可变参数给一个方法

  2. 在方法声明中,在指定参数类型后加一个省略号(...)

  3. 一个方法只能指定一个可变参数,它必须是方法的最后一个参数。任何的普通参数必须在它之前声明

     public static void main(String[] args) {
         Demo04 demo04 = new Demo04();
         demo04.test(10,20,30,40);
    }
 
     public  void test(int... nums){
         System.out.println(nums[0]);
         System.out.println(nums[1]);
         System.out.println(nums[2]);
         System.out.println(nums[3]);
    }

递归

递归头:什么时候不调用自身方法。如果没有头,将陷入死循环

递归体:什么时候需要调用自身方法

 

计算机

 import java.util.Scanner;
 
 public class JiSuanQi {
     static double num1;
     static double num2;
     static String c;
     static Scanner scanner;
     public static void main(String[] args) {
         //Scanner scanner = new Scanner(System.in);
             while(true){
                 scanner = new Scanner(System.in);
                 System.out.println("请输入第一个数:");
                 if (scanner.hasNextDouble()){
                     num1=scanner.nextDouble();
                     break;
                }else{
                     System.out.println("你输入不是数字");
                     continue;
                }
            }
             
             System.out.println("请输入要进行操作的符号:");
             c=scanner.next();
 
             while(true){
                 System.out.println("请输入第二个数:");
                 scanner = new Scanner(System.in);
                 if (scanner.hasNextDouble()){
                     num2=scanner.nextDouble();
                     break;
                }else{
                     System.out.println("你输入不是数字");
                     continue;
                }
            }
             switch(c){
                 case "+":
                     double add = add(num1, num2);
                     System.out.println("结果是"+add);
                     break;
                 case "-":
                     double reduce = reduce(num1, num2);
                     System.out.println("结果是"+reduce);
                     break;
                 case "*":
                     double ride = ride(num1, num2);
                     System.out.println("结果是"+ride);
                     break;
                 case "/":
                     double except = except(num1, num2);
                     System.out.println("结果是"+except);
                     break;
                 default:
                     System.out.println("非法符号");
                     break;
            }
             scanner.close();
    }
     
     public static double add(double num1,double num2){
         return num1+num2;
    }
 
     public static double reduce(double num1,double num2){
         return num1-num2;
    }
 
     public static double ride(double num1,double num2){
         return num1*num2;
    }
 
     public static double except(double num1,double num2){
         return num1/num2;
    }
 }
 

数组的定义

  1. 数组是相同类型数据的有序集合

  2. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成

  3. 其中每一个数据称作一个数组元素,每个数组元素可以通过下标类访问他们

  4. 数组是引用类型

数组在内存的关系

image-20210910193922495

 

数组的四个基本特点

  1. 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

  2. 其元素必须是相同类型,不允许出现混合类型

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

  4. 数组变量属引用类型,数组也可以看成是对象,数组中每个元素相当于该对象的成员变量。数组本身就是对象,java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

  public static void main(String[] args) {
         int[] nums;//定义
 
         nums=new int[10];//这里面可以存放10个int类型的数字
 
         //给数组元素赋值
         nums[0]=1;
         nums[1]=2;
         nums[2]=3;
         nums[3]=4;
         nums[4]=5;
         nums[5]=6;
         nums[6]=7;
         nums[7]=8;
         nums[8]=9;
         nums[9]=10;
 
         //计算所有元素的和
         int sum=0;
         //获取数组长度
         for (int i = 0; i < nums.length; i++) {
             sum=sum+nums[i];
        }
         System.out.println("和是"+sum);
    }

数组初始化

   public static void main(String[] args) {
         //静态初始化 创建+赋值
         int[] a={1,2,3,4,5,6};
         System.out.println(a[0]);
 
         //动态初始化 包含默认初始化
         int[] b=new int[10];
         b[0]=10;
 
         System.out.println(b[0]);
         System.out.println(b[1]);
    }

数组的使用

    public static void main(String[] args) {
         int[] arrays={1,2,3,4,5};
 
         //打印数组全部元素
         for (int i = 0; i < arrays.length; i++) {
             System.out.println(arrays[i]);
        }
         System.out.println("============");
 
         //计算所以元素的和
         int sum=0;
         for (int i = 0; i < arrays.length; i++) {
             sum+=arrays[i];
        }
         System.out.println("sum="+sum);
 
         //计算最大值
         int max=arrays[0];
         for (int i = 1; i <arrays.length ; i++) {
             if (arrays[i]>max){
                 max=arrays[i];
            }
 
        }
         System.out.println("最大值是"+max);
    }
    public static void main(String[] args) {
         int[] arrays={1,2,3,4,5};
 
 //       for (int array : arrays) {
 //           System.out.println(array);
 //       }
         int[] reverse = reverse(arrays);
         PrintArray(reverse);
    }
 
     //数组作为参数
     public static void PrintArray(int[] arrays){
         for (int i = 0; i < arrays.length; i++) {
             System.out.print(" "+arrays[i]);
        }
    }
 
     //数组作为返回值
     public static int[] reverse(int[] arrays){
         int[] result=new int[arrays.length];
         //反转的操作
         for (int i = 0 ,j=result.length-1; i < arrays.length; i++,j--) {
             result[j]=arrays[i];
        }
         return result;
    }

二维数组

     public static void main(String[] args) {
         //定义一个二维数组
         int[][] arrays={{1,2},{2,3},{3,4},{5,6}};
         /*
         1,2 arrays[0]
         2,3 arrays[1]
         3,4 arrays[2]
         5,6 arrays[3]
          */
         for (int i = 0; i < arrays.length; i++) {
             for (int j=0;j<arrays[i].length;j++){
                 System.out.println(arrays[i][j]);
            }
        }
    }

Arrays类

  public static void main(String[] args) {
         int[] a={1,2,6,4,2,999,2556,10};
 
         //打印数组元素Arrays.toString(a)
        // System.out.println(Arrays.toString(a));
 
         Arrays.sort(a);//数组进行排序:升序
        // PrintArray(a);
 
         Arrays.fill(a,2,4,0);//左闭右开
         System.out.println(Arrays.toString(a));
    }
 
     public static void PrintArray(int[] a){
         for (int i = 0; i < a.length; i++) {
             if (i==0){
                 System.out.print("{");
            }
             if ((i==a.length-1)){
                 System.out.print(a[i]+"]");
            }else{
                 System.out.print(a[i]+", ");
            }
        }
    }

冒泡排序

  1. 比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置

  2. 每一次比较,都会产生一个最大,或者最小的数

  3. 下一轮则可以少一次排序

  4. 依次循环,直到结束

     //冒泡排序
     /*
     1. 比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
 2. 每一次比较,都会产生一个最大,或者最小的数
 3. 下一轮则可以少一次排序
 4. 依次循环,直到结束
      */
     public static void main(String[] args) {
         int[] arrays={1,8,2,3,5,9,10,55,16,74};
         int[] sort = sort(arrays);
         System.out.println(Arrays.toString(sort));
    }
 
     public static int[] sort(int[] arrays){
         //临时变量
         int temp=0;
         //for外层循环,判断我们要走多少次
         for (int i = 0; i < arrays.length-1; i++) {
 
             boolean flag=false;//通过flag标识减少没有意义的比较
 
             //内层循环,比较判断两个数,如果是第一个数,比第二数小,则交换位置
             for (int j = 0; j < arrays.length-1-i; j++) {
                 if (arrays[j+1]>arrays[j]){
                     temp=arrays[j];
                     arrays[j]=arrays[j+1];
                     arrays[j+1]=temp;
                     flag=true;
                }
                 if (flag==false){
                     break;
                }
            }
        }
         return arrays;
    }

稀疏数组

     public static void main(String[] args) {
         //1. 创建二维数组 11*11 0没有棋子 1白棋 2黑棋
         int[][] array1=new int[11][11];
 
         array1[1][2]=1;
         array1[2][3]=2;
         //输出原始数组
         System.out.println("输出原始数组");
         for (int[] ints : array1) {
             for (int anInt : ints) {
                 System.out.print(anInt+"\t");
            }
             System.out.println();
        }
 
         System.out.println("===============");
         //转换为稀疏数组
         //获取有效值的个数
         int sum=0;
         for (int i = 0; i < 11; i++) {
             for (int j = 0; j < 11; j++) {
                 if (array1[i][j]!=0){
                     sum++;
                }
            }
        }
         System.out.println("有效值个数"+sum);
 
         //2.创建一个稀疏数组的数组
         int[][] array2=new int[sum+1][3];
         array2[0][0]=11;
         array2[0][1]=11;
         array2[0][2]=sum;
 
         //遍历二维数组将非零的值,存放到稀疏数组里
         int count=0;
         for (int i = 0; i < array1.length; i++) {
             for (int j = 0; j < array1[i].length; j++) {
                 if (array1[i][j]!=0){
                     count++;
                     array2[count][0]=i;
                     array2[count][1]=j;
                     array2[count][2]=array1[i][j];
                }
            }
        }
 
         //输出稀疏数组
 
         System.out.println("输出稀疏数组");
         for (int i = 0; i < array2.length; i++) {
             System.out.println(array2[i][0]+"\t"+
                     array2[i][1]+"\t"+
                     array2[i][2]+"\t");
        }
 
         System.out.println("===============");
         System.out.println("还原");
 
         //1.读取稀疏数组
         int[][] array3=new int[array2[0][0]][array2[0][1]];
 
         //2.给其中元素还原
         for (int i = 1; i < array2.length; i++) {
         array3[array2[i][0]][array2[i][1]]=array2[i][2];
        }
 
         //3.打印还原
         System.out.println("还原的数组");
         for (int[] ints : array3) {
             for (int anInt : ints) {
                 System.out.print(anInt+"\t");
            }
             System.out.println();
        }
    }

 

posted @ 2021-09-11 14:22  我吃不胖吗  阅读(63)  评论(0)    收藏  举报