java學習筆記--java基礎

java學習筆記

第一部分. java基礎

1.1 輸入輸出

Scanner in=new Scanner(System.in);
int a = in.nextInt(); 
System.out.print("a的值爲:"+a);
//System.out.println(); 會換行

用戶交互Scanner

  • 基本語法

    Scanner in = new Scanner(System.in);
    
  • 通過Scanner類的next()與nextLine()方法獲取輸入的字符串,在讀取前我們一般需要使用hasNext()與hasNextLine()判斷是否還有輸入的數據。

package com.htk.base;

import java.util.Scanner;

public class Demo01 {
    public static void main(String[] args) {
        //創建一個掃描器對象,用於接收鍵盤數據
        Scanner scanner = new Scanner(System.in);

        System.out.println("使用next方式接收:");

        //判斷用戶有沒有輸入字符串
        if(scanner.hasNext()){
            String str = scanner.next();
            System.out.println("輸出內容爲"+str);
        }
        //判斷用戶有沒有輸入字符串
        if(scanner.hasNextLine()){
            String str = scanner.nextLine();
            System.out.println("輸出內容爲"+str);
        }
        //凡是IO流的類如果不關閉就會一直佔用資源,要養成良好的習慣用完就關
        scanner.close();
    }
}
  • next():
  1. 一定要讀取到有效字符後纔可以結束輸入
  2. 對輸入有效字符之前遇到空白,next()方法會自動去除(遇到空格就停止輸出)
  3. 只有輸入有效字符後纔將其後面的空格作爲分隔符或者結束符
  4. next()不能得到帶有空格的字符串
  • nextLine():
  1. 以Enter爲結束符,返回回車之前的所有字符,可以獲取空白

用戶交互Scanner進階

package com.htk.base;

import java.util.Scanner;

public class Demo01 {
    public static void main(String[] args) {
        //創建一個掃描器對象,用於接收鍵盤數據
        Scanner scanner = new Scanner(System.in);
        int i = 0;
        float f = 0.1f;
        System.out.println("請輸入整數:");

        //判斷用戶有沒有輸入整型
        if(scanner.hasNextInt()){
             i= scanner.nextInt();
            System.out.println("輸出內容爲" + i);
        }else{
            System.out.println("輸入的不是整數數據");
        }
        
        System.out.println("請輸入浮點數:");
        //判斷用戶有沒有輸入實數
        if(scanner.hasNextFloat()){
            f= scanner.nextFloat();
            System.out.println("輸出內容爲" + f);
        }else{
            System.out.println("輸入的不是整數數據");
        }
        
        //凡是IO流的類如果不關閉就會一直佔用資源,要養成良好的習慣用完就關
        scanner.close();
    }
}

練習

題目要求:輸入多個數字,並求其綜合與平均數,每輸入一個數字用回車確認,通過輸入非數字來結束輸入並執行結果

package com.htk.base;

import java.util.Scanner;

public class Demo01 {
    public static void main(String[] args) {
        //創建一個掃描器對象,用於接收鍵盤數據
        Scanner scanner = new Scanner(System.in);
        //和
        int sum = 0;
        //計數
        int count =0;
        //平均數
        float ave = 0.0f;
        System.out.println("請輸入若干整數:");

        //判斷用戶有沒有輸入整型
        while (scanner.hasNextInt()) {
            int i = scanner.nextInt();
            sum = sum + i;
            count++;
        }
        ave = sum / count;
        System.out.println("總和爲"+sum);
        System.out.println("平均數爲"+ave);
        //凡是IO流的類如果不關閉就會一直佔用資源,要養成良好的習慣用完就關
        scanner.close();
    }
}

1.2 基本數據類型

基本數據類型

  • java是強類型語言,所有變量都需要嚴格定義數據類型。

  • 位(bit) 1 0 1 0的就是一位

  • 字節(Byte)8位一字節 1B=8b

  • 字符:指計算機中使用的字母,數字,字和符號。

基本數據類型 範圍 佔用字節
byte -128 — 127 1字節
short -32768 — 32767 2字節
int -2147483648 — 22147483647 4字節
long -9223372036854775808 — 9223372036854775807 後面需跟L識別 8字節
float 4字節
double 8字節
char 2字節
boolean 只有ture和false兩個值 1字節
  • 另一種數據類型叫做,引用數據類型:類,接口,數組都是這種類型

整數擴展

  • 進製表示 八進制 0 十六進制0x
//定義long變量
long a=100000000000L;

int i=10;
int j=010;
int k=0x10;
System.out.print(i); //輸出10
System.out.print(j); //輸出8
System.out.print(k); //輸出16

浮點擴展

  • 最好完全避免浮點數表示
  • BigDecimal 數學工具類,表示銀行業務。

注意:比較兩個浮點數

float f1=0.1f;
double f2=1.0/10;
System.out.print(f1==f2); //結果是false,是有誤差的接近但不等於,最好完全避免浮點數表示
Math.abs(f1-f2)<1e-6; //浮點數計算有誤差

字符擴展

  • 字符類型可以強制轉換爲int型,所有的字符本質還是數字(unicode 編碼表 2字節 0-65536)
  • 轉義字符

類型轉換

  • 轉換優先級

    byte,short,char—>int—>long—>float—>double

  • 高到低轉換時,要避免內存溢出精讀問題

  • 不能對布爾值進行轉換

  • 不能把對象類型轉換爲不相干的類型

補充: JDK7新特新,數字之間可以用下滑線分割,下劃線不會輸出

變量,常量,作用域

變量

  • 不建議在一行定義多個變量
  • 每一個變量寫完都要以逗號結尾
  • 變量的命名規則(程序的可讀性很重要):
    • 見名知意
    • 類成員變量:首字母小寫取餘單詞首字母大寫 lastName
    • 局部變量:首字母小寫和駝峯原則
    • 常量:均大寫和下劃線 PI MAX_VALUE
    • 類名:首字母大寫和駝峯原則 Man,GoodMan
    • 方法名:首字母小寫和駝峯原則 run(),runRun()

變量作用域

  • 類變量
  • 實例變量
  • 局部變量
public class Demo{
    //類變量 static 從屬於這個類,一起出現一起消失
    static double salary = 25000;
    //屬性:變量
    
    //實例變量:從屬於對象;若沒有初始化,輸出默認值默認值爲0
    //布爾值:默認值是false
    //除了基本類型,其餘的默認值都是null
    String name;
    int age;
    //main方法
    public static void main(String[] args){
        
        //局部變量:必須聲明和初始值
        int i=10;
        System.out.print(i);  //輸出10
        
        //變量類型 變量名字 = new Demo();
        Demo demo = new Demo();
        System.out.print(demo.age); //輸出0,沒有初始化,輸出默認值默認值爲0.
        
        //類變量 static 從屬於這個類,一起出現一起消失
        System.out.print(salary)
    }
    
    //其他方法
    public void add(){
        
	}
}

常量

  • 初始化後,不能改變值!
  • 常量名一般使用大寫字符
  • 在變量的數據類型前加final
public class Demo{
    
   //修飾符,不存在先後判斷 
   static final double PI = 3.14159;
   
	 public static void main(String[] args){
         System.out.print(PI)
	 }
}

運算符

基本運算符(operater)

  • 算術運算符

    • +,-,*,/,%,++,--
      
    • 整型運算如果有long則返回long,有double則返回double,其餘都是返回int型

    • 自增自減,++a,先++後輸出;a++先輸出後++

    • Math 數學工具類 double pow = Math.pow(3,2)

  • 賦值運算符

    • =
      
  • 關係運算符

    • >,<,>=,<=,!=,==
      
  • 邏輯運算符

    • &&,||,!
      
    • 短路原則:

    • 當使用&&時,與運算若前一項爲F,則不去進行後一項的判斷。

    • 當使用||時,或運算時當前一項是T,的\則不去計算後一項

  • 位運算符

    • &,|,^,~,<<,>>,>>>
      
    • public class Demo{
          
         //修飾符,不存在先後判斷 
         static final double PI = 3.14159;
         
      	 public static void main(String[] args){
               /*
               	A	= 0011 1100
               	B	= 0000 1101
               	
               	A&B	= 0000 1100
               	A|B	= 0011 1101
               	A^B	= 0011 0001
               	~B	= 1111 0010
               
               面試題:2*8這麼運算最快?
               	2 = 0000 0010 
               	8 = 0000 1000 
               	我的思考是 左移一位吧,8是2的3次,再乘2就是2的4次,相當於左移一位
               	System.out.print(8<<1)
               */
      	 }
      }
      
  • 條件運算符

    • // ?:
      //x?y:z
      //若x==ture,則結果爲y,否則結果爲z
      
  • 擴展賦值運算符

    • +=,-=,*=,/=,%=
      
    • 字符串連接符 +,String

    public class Demo{
        
       //修飾符,不存在先後判斷 
       static final double PI = 3.14159;
       
    	 public static void main(String[] args){
             	int a=2;
    			int b=3;
    			System.out.print("String"+a+b) //後面會變成字符串鏈接,不會計算
    			System.out.print(a+b+"String") //先運算後鏈接字符串
    	 }
    }
    

補充:包機制

  • 包的本質就是文件夾(package)

  • 包語句的語法格式爲:

    • package pkg1[.pkg2[.pkg3]];
      
  • 一般將公司域名倒置作爲包名 com.baidu.www

  • 導入包 import java.util.*

補充:JavaDoc

  • javadoc命令使用來生成自己API文檔的

  • 參數信息

    • /**
      *@author htk
      *@version 1.0
      *@since 1.8
      */
      public class Doc{
        	String name;
         
      	 public static void main(String[] args){
               	
      	 }
          // 輸入/**會出現參數信息
          public String test(String name){
      		return name;
          }
      }
      

1.3 順序結構

if - elses,switch-case需要注意的問題

//1.在if或else後面總是用{}
//2.級聯if - else if - else
//3.if語句常見錯誤
	//1.忘記大括號
	//2.if後面有分號
	//3.錯誤使用==和=
//4.switch-case
/*
jdk7開始,switch支持字符串String類型
補充: java --- class(字節碼文件) --- 反編譯(IDEA) 每一個字符串都有一個hashcode,有個hash值
case 必須是常量或者字符串常量
*/

1.4 循環結構

//求和,求階乘,求平均數
for(i=0;i<n;i=i+1)
{
	sum=sum+i;
	fact=fact*i;
}
ave=sum/n;
//枚舉
for(one=0;i<amount;one++)
{
	for(five=0;five<amount/5;five++)
    {
    	for(ten=0;ten<amount/10;ten++)
        {
           for(twenty=0;twenty<amount/20;twenty++)
            {
                if(one+five*5+tne*10+twenty*20==amount)
                    System.out.print(one+"張1元"+five+"張5元"+tne+"張10元"+twenty+"張20元");
			} 
        }  
    }    
}          

while循環

  • 大部分情況會用一個表達式讓循環停止,少部分情況需要一直執行,比如服務器請求響應。

do-while循環

  • 一定會執行一次do裏的內容。

for循環

  • 練習1:用for循環輸出1-1000之間能被5整除的數,並且每行輸出3個
package com.htk.base;

import java.util.Scanner;

public class Demo01 {
    public static void main(String[] args) {

        for(int i=1;i<=1000;i++)
        {
          if (i%5==0){
              System.out.print(i+"\t");
          }

          if(i%(5*3)==0){
              System.out.println();
          }
        }
        System.out.println();
    }
}
  • 練習2:打印九九乘法表
package com.htk.base;

import java.util.Scanner;

public class Demo01 {
    public static void main(String[] args) {
        //上三角形式,小的數在前面
        for(int i=1;i<=9;i++)
        {
            for(int j=1;j<=i;j++)
            {
                System.out.print(j+"*"+i+"="+(i*j)+"\t\t\t");
            }
            System.out.println();
        }
        System.out.println();
        //下三角形式,小的數在前面
        for(int i=1;i<=9;i++)
        {
            for(int j=1;j<=10-i;j++)
            {
                System.out.print(i+"*"+j+"="+(i*j)+"\t\t\t");
            }
            System.out.println();
        }
    }
}

增強型for循環

  • jdk5引入,主要用於遍歷數組和集合。
 for(int k:data){
 	System.out.println(k);
 }

break和continue

  • break:直接中指循環
  • continue:中指某一次循環

1.5 數組

數組是一種容器,特殊容器

  • 其中所有元素都具有相同類型一旦創建無法改變。
  • 數組大小也可以用另一種形式用number.length來確定。
  • for-each循環
package javaclass;

import java.util.Scanner;

public class practice {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int i,x;
		int sum=0;
		int[] number = new int[100]; //創建數組,數組是一種容器
        //int n=in.nextInt();//輸入200
        //double[] number = new double[n]; //n可以使變量,編譯器檢查不出下標越界運行時會拋出異常
        //數組大小也可以用另一種形式用number.length來確定。令代碼具有可擴展性的代碼。
        //int[] b=a;數組變量是管理者指針。兩個管理者管理同一個地方。
        
        /*
        for(int k:data) //把data數組裏每一個元素作爲k,令其爲循環的條件,適合遍歷但缺少下標
        {
        	if(k==x)
        	{
        		found=ture;
			}
        }
        */
        
        //二維數組 int[][] number =new int[3][5];
        //int[][] number2 ={{1,2},{3,4,5}};
        
		x=in.nextInt();
		for(i=0;x!=-1;i++)
		{
			number[i]=x;
			sum=sum+number[i];
			x=in.nextInt();
		}
		double ave;
		ave=1.0*sum/i;
		System.out.print(sum+","+ave);
		in.close();		
	}
}

數組定義,三種初始化及內存分析

package com.htk.base;

public class Demo3 {
    public static void main(String[] args) {
        //分開寫定義數組
        int[] num;
        num = new int[10];
        //合併寫定義數組
        int[] num2 = new int[10];
    }
}

內存分析

java內存

    • 存放new的對象和數組
    • 可以被所有的線程共享,不會存放別的對象引用
    • 存放基本變量類型(會包含這個基本變量類型的值)
    • 引用對象的變量()
  • 方法區

    • 可以被所有線程共享
    • 包含了所有的class和static變量
      在這裏插入圖片描述
  • ArrayIndexOutOfBoundsException:數組下標異常

三種初始化

package com.htk.base;

public class Demo3 {
    public static void main(String[] args) {
        //靜態初始化
        int[] a={1,2,3};
        //動態初始化
        int[] b=new int[10]//數組默認初始化,默認值爲0
        System.out.println(b[2]);  //輸出爲0
    }
}

Arrays類

  • package com.htk.base;
    
    import java.util.Arrays;
    
    public class Demo3 {
        public static void main(String[] args) {
            //靜態初始化
            int[] a={1,4,3,8,7,9,6,2};
            System.out.println(Arrays.toString(a));
            Arrays.sort(a);
            System.out.println(Arrays.toString(a))
        }
    }
    
    

稀疏數組

  • 數組中大部分爲0或同一個值時,可以使用稀疏數組賴堡村改數組

  • 處理方法

    • 記錄數組有幾行幾列,有多少個不同值
    • 把具有不同值的元素和行列及值記錄在一個小規模矩陣中,從而縮小程序規模
  • 練習:編寫五子棋棋盤存盤和續盤

1.6 字符串

包裹類型:每個基礎類型都有個對應的包裹類型

Boolean,Character,Integer,Double ,使用包裹類型可以調用一些方法獲取信息

String

  • String是一個類

  • String s = new String("a string");
    System.out.print(s.equals("a string"));   //比較字符串用equals而不是==
    
  • String操作

1.7 方法(函數)

  • 方法是解決一類問題得步驟的有序組合
  • 方法包含於類或是對象中
  • 設計方法的原則方法本意就是功能塊,實現某個功能的語句塊的集合。我們設計方法時,最好保持方法的原子性,就是一個方法只完成一個功能,這有利於後期擴展。

方法的定義和調用

方法的定義

修飾符 返回值類型 方法名(參數類型 參數名){
	……
	方法體
	……
	//return 返回值;
}
  • 修飾符:是可選的,高速編譯器如何調用該方法,定義了該方法的訪問類型
package com.htk.base;

public class Demo02 {
    public static void main(String[] args) {
        int max=max(10,10);
        System.out.println(max);
    }

    public static int max(int a,int b){
        if(a>b)
            return a;
        else
            return b;
    }
}

方法調用

  • 調用方法:對象名.方法名(實參列表)

  • 當方法返回一個值的時候,方法調用通常被當做一個值。

    • int max=max(20,100);
      
  • 若方法返回值是void,方法調用一定是一條語句。

    • System.out.println("OK");
      
  • java都是值傳遞,不是引用傳遞

方法的重載

  • 重載就是在一個類中,有相同的函數名稱,但形參不同的函數
  • 重載的規則:
    • 方法名稱必須相同
    • 參數列表必須不同(如個數不同,類型不同,排列不同等)
    • 方法的返回類型可以相同也可以不相同
    • 僅僅返回類型不同不足以成爲方法重載
package com.htk.base;

public class Demo02 {
    public static void main(String[] args) {
        int max=max(10,10); //方法調用
        double large=max(20.4,25.9);
        System.out.println(max);
    }
    //方法定義
    public static int max(int a,int b){
        if(a>b)
            return a;
        else
            return b;
    }
    //方法重載
    public static double max(double a,double b){
        if(a>b)
            return a;
        else
            return b;
    }
}

命令行傳遞參數

  • mian方法也可以傳遞參數

可變參數

  • jdk5後java支持傳遞同類型的可變參數給一個方法
  • 在方法聲明中,在指定參數類型後加一個省略號(…)
  • 一個方法只能制定一個可變參數,他必須是方法的最後一個參數。任何普通的參數必須在他之前聲明。
  • 和數組有點相似。類似於定義了一個長度位置數組參數
package com.htk.base;

public class Demo02 {
    public static void main(String[] args) {
        printMax(2,8,9,7,55,6,7,132,4,5);
        printMax(new int[] {1,2,3,4,5});
    }
    //方法定義
    public static void printMax(int...number){
        if(number.length==0){
            System.out.println("No argument passed");
            return;
        }

        int max=number[0];
        for(int i=0;i<number.length;i++)
            if(max<number[i])
                max=number[i];

        System.out.println(max);
    }
}

遞歸

  • 遞歸就是自己調用自己。
  • 遞歸函數一定要有遞歸出口,是有限次的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章