java的个人记录--第一部分

230 阅读10分钟

个人的学习记录

第一日 简单的DOS命令

主界面按windows+R进入运行界面,输入cmd进入命令提提示符

  • cd=choose directory=进入某个文件夹
  • md=make directory=创建新文件夹
  • del 删除文件-----------通配符*用例:del *.txt(删除所有txt结尾的文件)
  • rd=remove =删除目录(只能删除空目录)

学习进度:P25

第二日 java环境搭建

了解了JDK配置 、了解了环境变量的配置

在cmd中,先用javac+文件名.java编译,再输入java+文件名.java 运行

注释:多行注释快捷键:shift+ctrl+/


class  HelloJava{
                     /*main方法:程序的入口*/
    public static void main(String[] args){
                    /*println=printline*/
        System.out.println("Hellojava")
    }
    
  
}

java特有的文档注释: 可以被javadoc所解析

/**
啊啊啊啊文档注释内容
*/

API:

一些基本编程接口,类库

一个java源文件中,可有很多class,但是只能有一个public class,而且只能加到和文件名同名的类上

输出语句:

System.out.print();输出数据
System.out.println();输出数据,然后换行,如果无数据,那就直接换行

标识符:自己给变量起的名字,Java中区分大小写严格,所以Static可作为标识符,static不可以

变量:

class 
   //变量的定义
   int myAge=12//变量的使用
   System.out.print(myAge);
   
   int number;
   nubmer=12;

注意区分全局变量和局部变量

\n:换行符
\t:制表符

ASCII码值:

a:97 A:65


变量的分类:

  • 基本数据类型

    • 整形:byte(1字节) / short(2字节) / int(4字节) / long(8字节) 默认int

    • 浮点型:float/double(float比double大,所以float定义的时候,数据后要加F,不然会默认为double)

    • 字符型:char(1字符=2字节),定义char通常使用单引号'',内部只能写一个字符,所以通常使用string字符串

    • 布尔形: boolean ( 通常在循环和判断中使用

  • 引用数据类型

    • 类:class
    • 接口:interface
    • 数组:array

    UTF-8:一种Unicode的编码方式

自动类型提升运算法则:

容量小的变量和容量大的变量做运算的时候,结果为大的那个

               byte b1=2;
               int i1=3;
               int i2=b1+i1;
               System.out.println(i2);
               
               
    (byte/short/char)->int->long->float->double
       ↑这三种类型做运算时,结果都为int类型

强制转化运算法则:

class VariableTset{
    public static void main(String[] args){
        double x=12.4;
        //加上(int)强转符
        int y=(int)x;
        System.out.println(y);
    }

}
输出的值是12.强转可能会损失精度

String

属于引用数据类型,翻译为字符串,声明String变量时,使用双引号

String s1="hello World"String s2="a"String s3="  "//编译通过

char c=""; //编译不通过
int number =1001;
String numberStr ="学号:"String info=number + numberStr;
System.out.print(info);

得到:"学号:1001"

练习:进行下列计算

char c= 'a';
int num =10;
String str="hello";
System.out.pringln(c + num + str);  //107hello
System.out.pringln(c + str + num);  //ahello10
System.out.pringln(c + (num + str));  //a10hello
System.out.pringln((c + num) + str);  //107hello
System.out.pringln(str + num + c);  //hello10a

练习:下列代码会生成什么?

System.out.pringln("*   *"); // 结果为* *
System.out.pringln('*' + '\t' + '*');  //结果为93,char型的相加
System.out.pringln('*' + "\t" + '*'); //结果为 * *,char+String
System.out.pringln('*' + '\t' + "*"); //结果为51*
System.out.pringln('*' + ( '\t' + "*") ); //结果为* *

String str1=123;   //编译不通过
String str1=123+""; //编译通过,输出的是字符串形式的123

运算符

- 算术运算符
  • 加(+)减(-)乘(*)除(/)除法注意int型和double型的转换
  • ++/--
 前++,先自增1,再运算          
 后++,先运算,再自增1
 int a=10;
 int b=a++; //a=11,b=10
 int c=++a; //a=11,c=11
 
 但是如果是int a=10;
          a++;  或者 ++a;
          int b=a; //此时b都等于11
          
          前后--同理
 ```
 
 
-   %:取模,即为取余数 7%5 =2   187%10=7;187%100=87; 187%100/10=8


## 第二日进度:P75
- 赋值运算符 =
int i=10,y=13;
-------------------------------------

int num1=10;
num1+=2; //意思是num1=num1+2;
System.out.print(num1);  //结果是12
---------------------------------------------

int num2 = 12;
num2 %= 5;//num2 = num2 % 5;
System.out.println(num2);

-----------------------------------------------
short s1 = 10;
s1 = s1 + 2;  //编译失败,因为改变数据类型了
s1 += 2;     //编译成功 结论:这种写法不会改变变量本身的数据类型
System.out.println(s1);

① 开发中,如果希望变量实现+2的操作,有几种方法?(前提:int num = 10;)

方式一:num = num + 2; 方式二:num += 2; (推荐)

② 开发中,如果希望变量实现+1的操作,有几种方法?(前提:int num = 10;)

方式一:num = num + 1; 方式二:num += 1; 方式三:num++; (推荐)

例题:

int n=10;
n+=(n++)+(++n);
System.out.println(n);

----------------------------------------
解: n+=(n++)+(++n);可看做n=n+(n++)+(++n)
     第一个n=10
     第二个(n++),先赋值10,再++,所以虽然值变成了11,但是输出还是10
     第三个(++n),因为前一个是11,再++,是12
     所以是10+10+12=32
答: n=32
- 比较运算符== 、 != 、 < 、> 、 <= 、 >=

比较运算符结果都是bool类型,注意==不能写成= 例:

int i=10,j=20;
System.out.print(i==j); //输出false
System.out.print(i=j);  //输出20

==比较的是内存地址,是不是同一个对象
- 逻辑运算符

与:&& 指两个都需要满足

区分& 与 &&

//相同点1:& 与 && 的运算结果相同

//相同点2:当符号左边是true时,二者都会执行符号右边的运算

//不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。

//开发中,推荐使用&&

boolean b1 = true;
b1 = false;
int num1 = 10;
if(b1 & (num1++ > 0)){
    System.out.println("我现在在北京");
}else{
    System.out.println("我现在在南京");
}
System.out.println("num1 = " + num1);
输出的是南京和11
--------------------------------------------

boolean b2 = true;
b2 = false;
int num2 = 10;
if(b2 && (num2++ > 0)){
    System.out.println("我现在在北京");
}else{
    System.out.println("我现在在南京");
}
System.out.println("num2 = " + num2);
输出的是南京和10,因为南京已经是false了,所有不进行后面的num2++计算

或:|| 两者只要有一个是true,那即是true

boolean b3 = false;
b3 = true;
int num3 = 10;
if(b3 | (num3++ > 0)){
    System.out.println("我现在在北京");
}else{
    System.out.println("我现在在南京");
}
System.out.println("num3 = " + num3);
输出是北京和11

-------------------------------------------
boolean b4 = false;
b4 = true;
int num4 = 10;
if(b4 || (num4++ > 0)){
    System.out.println("我现在在北京");
}else{
    System.out.println("我现在在南京");
}
System.out.println("num4 = " + num4);
同理,输出是北京和10

- 位运算符(较少)

在二进制层面进行计算 例:

8<<1   意思是二进制上,8向左移一位,后面补0,被移除的高位丢弃
    0000 1000  变为
    0001 0000
所以8<<1=16
- 三元运算符

结构:(条件表达式)?表达式1:表达式2

说明:条件表达式的结果为bool类型,根据条件表达式的真或假,决定执行1还是2,true为1,false为2

例:

比较大小
int m=12,n=5;
int max= (m>n)?  m : n ;
System.out.println(max); //输出为12

--------------------------------------
String maxstr=(m>n) ? "m大""n大"

关于流程控制

if-else结构

Scanner:从键盘获取变量

具体步骤:

1导包 import java.util.Scanner;基本写在最上面

2实例化

Scanner scan= new Scanner(System.in);

3调用Scanner类的相关方法,获取指定类型的变量

    int num=scan.nextInt(); 

总结:

如何从键盘获取不同类型的变量
import java.util.Scanner;

class ScannerTset{
    public static void mian (String[] args){
        Scanner scan =new Scanner(System.in);
        
        System.out.println("请输入你的编号");
        int num= scan.nextInt(); //获取int类型,想要获取别的类型,要另外添加.
        System.out.println(num);
        
        System.out.println("请输入你的姓名");
        String name=scan.next(); //获取Str类型数据
        System.out.println(name);
        
         System.out.println("请输入你的体重");
         double weight = scan.nextDouble(); //获取double类型数据
         System.out.println(weight);
         
                  
         System.out.println("你是否单身?")
         boolean choose= scan.nextBoolean(); //bool类型
         System.out.println(choose);                     
    } 
}
然后在键盘输入对应类型数据,就可输出此数据

小练习: 爸爸准备按照小明的期末成绩给与小明奖励,满分给宝马,(80,99]给iPhone,[60,80]给本子,不及格什么都不给,要求从键盘输入数据,请设计代码。

import java.util.Scanner;
class Tset{
    public static void mian (String[] args){
        Scanner scan = new Scanner(System.in);
        
        System.out.println("请输入学生的考试成绩0~100"); 
        int score =scan.nextInt();
        if (score==100){
             System.out.println("宝马");
        }
         else if(score > 80 && score<= 99){
             System.out.println("iphone");
        }
         else if(score >= 60 && score<= 80){
             System.out.println("本子");
        }
        else
             System.out.println("什么都没有");
        }
        
    }

随机数获取:

int vlaue=Math.random() //范围是[0,1)
Math.random()*100       //范围是[0,100)
Math.random()*90+10 //范围[0,90)再+10--->[10,100)

公式:[a,b]: (int)( Math.random() *(b-a+1)  +a )

switch-case结构

根据switch表达式中的值,依次匹配各个case中的常量,匹配成功后进入该case,再调用case中的执行语句,调用完后,必须用break跳出,不然会一直向下执行其他case语句
 
 表达式中只有六种类型:byte、short、char、int、枚举、String
 
switch(表达式){
    case 常量1:
        语句1breakcase 常量2:
        语句2breakcase 常量N:
        语句N;
        breakdefault:
         语句;
         break;
}

String类型:

image.png

例题:从键盘输入2019年的月份和日期,自动得出这一天是2019年的第几天

if-else写法:
import java.util.Scanner;
  class Switch{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入2019年月份");
        int month = scan.nextInt();
        System.out.println("请输入2019年日期");
        int day = scan.nextInt();
        
        //定义一个变量来保存总天数
        int sumdays=0;
        if(month==1){
            sumday=day;
        }
        else if(month==2){
            sumday=31+day;
        }
        else if(month==3){
            sumday=31+28+day;
        }
         else if(month==4){
            sumday=31+28+30+day;
        }
        ......
        System.out.printin(sumday);
    }
  }
  比较冗余
switch-case写法:
    import java.util.Scanner;
      class Switch{
        public static void main(String[] args){
            Scanner scan = new Scanner(System.in);
            System.out.println("请输入2019年月份");
            int month = scan.nextInt();
            System.out.println("请输入2019年日期");
            int day = scan.nextInt();

            //定义一个变量来保存总天数
            int sumday=0;
            
            switch(month){
                case 1:
                    sumday=day;
                    break;
                case 2:
                    sumday=31+day;
                    break;
                    .....
                 }
            System.out.println(sumday);
     }
 }
 也有冗余
最佳写法:
import java.util.Scanner;
      class Switch{
        public static void main(String[] args){
            Scanner scan = new Scanner(System.in);
            System.out.println("请输入2019年月份");
            int month = scan.nextInt();
            System.out.println("请输入2019年日期");
            int day = scan.nextInt();

            //定义一个变量来保存总天数
            int sumdays=0;
            
            switch(month){
                case 12:
                     sumday +=30;
                case 11:
                     sumday +=31;
                case 10:
                     sumday +=30;
                     ......
                case 3:
                     sumday +=28;
                case 2:
                     sumday +=31;
                case 1:
                     sumday +=day;
            }
            
            System.out.println(sumday);
       }
    } 
    解析:不写break,让case自动向下叠加,如果是2月,那就是1月份的天数31天加上2月的day,同理3月就是day(自己月份的天数)+28(二月份)+31(一月份)

循环结构 for/while/do-while

循环四要素:初始化条件、循坏条件、循环体、迭代条件

for循环

for(初始化条件;循环条件;迭代条件){
    循环体;
}

例:
for(int i=0;i<10;i++){
     System.out.println(i);
}  

分析:先定义一个int类型的i作为初始值,为0,然后判断是否<10,满足后输出,输出后进行i++,此为一个循环。
++后为1,然后1再次判断<10,是就输出1,这个时候输出为01..以此类推...
注意当到10的时候,因为10并不大于10,所以10不算在内

最终结果:0 1 2 3 4 5 6 7 8 9

练习:

 int num=1;
        for(System.out.println('a');num<=3; System.out.println('c'),num++){
            System.out.println('b');  //abcbcbc
            
    结果:abcbcbc,初始化为a,当num<3时,输出b,然后输出c的同时num++,循环3

练习:输出1~10之间所有偶数的和,并且写出所有偶数的个数和

int sum=0; //总和
int count=0; //个数和
        for(int i=1;i<=10;i++){
            if(i%2==0){
                System.out.println(i);
                sum+=i;
                count++;
            }
        }
        System.out.println("总和为:"+sum);
         System.out.println("个数为:"+count);//注意输出要写在循环的外面
         
         
输出为:
2
4
6
8
10
总和为:30
个数为:5         

练习:输出1~150,在3的倍数后面加上“3的倍数”,5倍数的后面加上“5的倍数”,7的倍数后面加上“7的倍数”

  for(int i=1;i<=150;i++){
            System.out.print(i+"");//关键在于不要用println,最后再换行
                if(i%3==0){
                    System.out.print("  3的倍数"); 
                }       //不要加else
                if(i%5==0){
                    System.out.print("  5的倍数");
                }
                if(i%7==0){
                    System.out.print("  7的倍数");
                }
            System.out.println();
            }
            
  结果:
1
2
3  3的倍数
4
5  5的倍数
6  3的倍数
7  7的倍数
8
9  3的倍数
10  5的倍数
11
12  3的倍数
13
14  7的倍数
15  3的倍数  5的倍数
16
17
18  3的倍数
19
20  5的倍数
21  3的倍数  7的倍数  
....

break在for循环中的作用:

练习:输入两个正整数,求这两个数的最大公约数和最小公倍数

 public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);//实例化
        System.out.println("输入第一个数");
        int m=scan.nextInt();
        System.out.println("输入第二个数");
        int n=scan.nextInt();


        int min=(m<n)? m:n; //获取两个数中的较小的那个
        int max=(m>n)? m:n; //获取两个数中的较大的那个

        System.out.println("公约数为");

        for(int i=min;i>=1;i--) {

            if (n % i == 0 && m % i == 0) {
                System.out.println(i);
            }
        }              //这个循环求的是所有的公约数

        for(int i=min;i<=n*m;i--) {

            if (n % i == 0 && m % i == 0) {
                System.out.println("最大公约数为"+i);
                break;
            }
        }            //加上break,只输出第一个找到的,就是最大公约数

        for(int i=max;i>=1;i++) {

            if (i % n == 0 && i % m == 0) {
                System.out.println("最小公倍数为"+i);
                break;
            }
        }           //这里必须加break,不然会一直算下去


    }



输入1220
结果:

输入第一个数
20
输入第二个数
12
公约数为
4
2
1
最大公约数为4
最小公倍数为60

例题:经典水仙花数:水仙花数是指一个三位数,各个位数上的立方和相加等于本身,如153=1×1×1+5×5×5+3×3×3,请输出所有水仙花数。

 System.out.println("水仙花数");

        for(int i=99;i<1000;i++){
            int a,b,c=0;
            a=i/100;      //取百位
            b=(i/10)%10;  //取十位
            c=i%10;       //取个位
            if(i==(a*a*a)+(b*b*b)+(c*c*c)){
                System.out.println(i);
            }
        }
        
结果:
水仙花数
153
370
371
407

while循环 注意:for循环和while循环可相互转化

while的循环结构:

初始化条件
while(循环条件bool类型){
    循环体;
    迭代条件;
}


例子:遍历10内的所有偶数
        int i=1;
        while (i<=10){
            if(i%2==0){
                System.out.println(i);
            }
            i++;  //注意这个迭代条件的位置,不然可能会死循环
        }
        
        
结果:
2
4
6
8
10
逻辑:先1进去,当满足<=10的时候,进行语句的执行,输出数,然后迭代一下,++,
成为2,再次判断<=10....

while循环基本等同于for循环,唯一不同的可能就是条件域的区别

do-while循环

初始化条件
do{
    循环体;
    迭代条件
}
  while(循环条件);
  
  例:遍历10以内偶数
  int a=1;
      do {
          if(a%2==0){
              System.out.println(a);
          }
          a++;
      }while (a<=10);
  
 说明: 至少会执行一次循环

无限循环综合例题(while(ture)):从键盘输入个数不确定的整数,并判断正数和负数的个数,当输入为0时结束程序

 Scanner scan=new Scanner(System.in);//实例化
        System.out.println("请输入数据");

        int zhengshu=0;//定义正负数个数类型
        int fushu=0;
        //写true表示不限制次数,如果是for,就是for(;;)
        while (true) {
            int number=scan.nextInt();      //先获取输入的值

            if(number>0){ zhengshu++;}      //判断正数,正数++

            else if(number<0){ fushu++; }   //判断负数,负数++

            else {break;}    //不是正负,就break,跳出循环
        }
        System.out.println("正数个数"+zhengshu);
        System.out.println("负数个数"+fushu);

结果:
请输入数据
5
1
7
-8
0
正数个数3
负数个数1

嵌套循环(三层以内)

定义:将一个循环结构A声明在另一个循环结构B的循环体中,就是嵌套循环

for (int i = 1; i <= 6; i++) {       //这一行是****的循环,循环6次,换行
            for(int j=1;j<=4;j++) {  //这一行是*的循环,循环4次,因为没有换行,所以是****
               System.out.print('*');  //注意是print
           }
           System.out.println();
       }
       
 结果:
****
****
****
****
****
****

分析:从内部循环先开始看,先循环*的四次变成****,在循环6次得到结果
进阶:写出这种图形: ****                                 
                    ***                                
                    **
                    *  
                    
              for (int i = 1; i <= 4; i++) {
            for(int j=4;j>=i;j--) {
               System.out.print('*');
           }
           System.out.println();
       }    
       解析:第一次j=4循环,从4个*开始,此时的i是1,j>=i循环4次,输入****,此时i开始循环,第一行输出完成
             第二轮j=4开始,此时第二轮i=2,只循环3次,输出3个*** 这是第二行
             以此类推
             
             
             
  --------------------------------------------                  
    同理写出 *
             **
             ***
             ****
             
        for (int i = 1; i <= 4; i++) {
            for(int j=1;j<=i;j++) {
               System.out.print('*');
           }
           System.out.println();
       }
       
  解析:j从1开始,第一行i=1,所以只有一个*
        第二行i=2,j能取到12,所以循环了2次,输出2个*
        以此类推
例:
        for (int i = 1; i <= 6; i++) {
            for(int k=7;k>=i;k--){
                System.out.print("-");
            }                                       //这个是前面的“-”数
            for(int j=1;j<=i;j++) {
               System.out.print(" *");
           }                                        //这个是空格+*
           System.out.println();
       }
        

        for (int i = 1; i <= 7; i++) {
            for(int k=1;k<=i;k++) {
                System.out.print("-");
            }                                      //同上,注意不要和上半部分最后一行重叠
            for(int j=7;j>=i;j--) {
                System.out.print(" *");
            }
            System.out.println();
        }
        解析:一个循环里面嵌套两个for循环,一起输出
        结果:
                    ------- *
                    ------ * *
                    ----- * * *
                    ---- * * * *
                    --- * * * * *
                    -- * * * * * *
                    - * * * * * * *
                    -- * * * * * *
                    --- * * * * *
                    ---- * * * *
                    ----- * * *
                    ------ * *
                    ------- *
例:
         for(int i=1;i<=9;i++){
           for(int j=1;j<=i;j++){
               System.out.print(j+"×"+i+"="+i*j+"\t");
           }
           System.out.println();
       }
  
  解析:典中典之乘法表,结合代码更容易理解i与j的关系
  结果:
1×1=1	
1×2=2	2×2=4	
1×3=3	2×3=6	3×3=9	
1×4=4	2×4=8	3×4=12	4×4=16	
1×5=5	2×5=10	3×5=15	4×5=20	5×5=25	
1×6=6	2×6=12	3×6=18	4×6=24	5×6=30	6×6=36	
1×7=7	2×7=14	3×7=21	4×7=28	5×7=35	6×7=42	7×7=49	
1×8=8	2×8=16	3×8=24	4×8=32	5×8=40	6×8=48	7×8=56	8×8=64	
1×9=9	2×9=18	3×9=27	4×9=36	5×9=45	6×9=54	7×9=63	8×9=72	9×9=81	
例:输出100以内所有的质数
 //质数,就是从2开始,到这个数-1为止,都不能被这个数整除
写法1for(int i=2;i<=100;i++){    //遍历100以内自然数
            boolean isFlag=true;    //标志i是否被j除尽,除尽就修改变成false
            for(int j=2;j<=i-1;j++){   //遍历一遍i-1的数,被i去除
                if(i%j==0){              //i被j除尽,说明这个数不是质数
                    isFlag =false;
                }
            }
            if(isFlag==true){             //输出除不尽的,就是质数
                System.out.println(i);
            }
        }
        
        
优化写法2for(int i=2;i<=100;i++){    //遍历100以内自然数
            boolean isFlag=true;    //标志i是否被j除尽,除尽就修改其值
            for(int j=2;j<=Math.sqrt(i);j++){   //被i去除  优化1,变成根号i
                if(i%j==0){              //i被j除尽,说明这个数不是质数
                    isFlag =false;
                    break;     //优化2 只对本身非质数的自然数是有效的
                }
            }
            if(isFlag==true){             //输出除不尽的
                System.out.println(i);
            }
        }

速度更快

break 和continue关键字的使用

break: 使用在switch-case和循环结构中;作用:结束当前循环

continue:使用在循环结构中 作用:结束当次循环

对比:
 for(int i=1;i<=10;i++){
           if(i%4==0){
               break;
               /*System.out.println(“啊啊啊”);  这个地方的语句无法输出,无论是break还是continue,后面都不能跟输出语句,会报错*/
           }
           System.out.println(i);
       }
       
 结果:1 2 34之后就跳出循环
 ----------------------------------------------------
 
  for(int i=1;i<=10;i++){
           if(i%4==0){
               continue;
           }
           System.out.println(i);
       }
 结果: 1 2 3 5 6 7 9 1048的时候,结束当次循环,开始下一次

break和continue默认跳出包裹此关键字的最近一层循环

找完数:

一个数等于它的因子之和,这个数就是完数,比如6=1+2+3,求1000以内的所有完数

 int sum=0;
        for(int i=1;i<=1000;i++){
            for(int j=1;j<=i-1;j++){
                if(i%j==0){
                    sum+=j;
                }
            }
            if(i==sum){
                System.out.println(i);
            }
            sum=0; //sum要清零
        }