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():
- 一定要讀取到有效字符後纔可以結束輸入
- 對輸入有效字符之前遇到空白,next()方法會自動去除(遇到空格就停止輸出)
- 只有輸入有效字符後纔將其後面的空格作爲分隔符或者結束符
- next()不能得到帶有空格的字符串
- nextLine():
- 以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);
}
}
遞歸
- 遞歸就是自己調用自己。
- 遞歸函數一定要有遞歸出口,是有限次的。