1、java基礎覆蓋——知識庫搭建-1
一、Java語言的描述
1、1、發展:
Sun公司:Oka(基於C和C++)——Java(太平洋盛產咖啡的島嶼名)(1995)
2009.04 Sun公司被Oracle收購
1、2、特點:
1、2、1 面向物件:
封裝(用抽象的資料型別將資料與基於資料的操作封裝在一起)
繼承(一個物件通過繼承直接使用另一個物件的屬性和方法)
多型(1、覆蓋:子類重寫父類方法 2、過載:在一個類中定義多個不同的方法實現多型)
1、2、2 平臺無關:
概念:java語言編寫應用程式不用修改就可以在不同的軟硬體平臺上執行。
分類:
原始碼級:應用程式不用修改只需要重新編譯就可以在不同平臺上執行(像這個C++)。
目的碼級:Java靠JVM在目標大媽級實現平臺無關。
1、2、3 安全性:
位元組碼進入直譯器必須經過位元組碼校驗器檢查。
Java直譯器決定程式中類的佈局。
類裝載器負責將來自網路的類裝載到單獨的記憶體區域。
客戶端可以限制從網路上裝載的類只能訪問某些檔案系統。
1、2、4 支援網路程式設計:
1、2、5 支援多執行緒:
概念:執行緒小於程序的併發單位(C++沒有內建的多執行緒只能呼叫操作系的多執行緒功能)
Java支援多執行緒的兩個方面:
Java環境本身就是多執行緒(若干個系統執行緒執行的時候、回收無用單元、系統維護)
Java內建類多執行緒機制(也就是我們平常所說的多執行緒)
1、2、6 編譯與解釋並存:
大部分的語言都是編譯(C++)或解釋型(Basic)的語言,但Java是編譯與解釋並存。
概念:
Java源程式:.java檔案
源程式命名:1、.java字尾 2、有public修飾類,類名與檔名相同 3、沒有public修飾,類名與檔名可不同
位元組碼:在JVM中的指令組,即.class檔案,使用位元組碼的好處是跨平臺。
Java程式碼執行過程:
.java—編譯器—>.class—直譯器—>二進位制碼
1、3、 Java技術三方面:
JavaSE:Java標準版(即我們所說的Java語言部分、是JavaEE的基礎)
JavaME:Java精簡版
JavaEE:Java企業版
1、4、Java程式的種類:
Application(應用程式):
標誌(public static void mian(String args[]))
含main方法的是主類
主類不要求必須是public的
直接執行
Applet(小程式):
標誌(繼承JApplet或Applet的子類)即主類
主類要必須是public
嵌入HTML頁面、在瀏覽器執行
二、Java語言的開發環境
2、1、開發工具JDK:
概念:Java SE Development Kits,由Java API(核心,作用:提供標準類庫)、Java執行環境、測試工具的Java實用程式組成
檔案結構:
2、2、環境變數:
Path:設定作業系統去尋找可執行檔案(.exe、.com、.bat)路徑順序、最先找到為準。
ClassPath:設定JVM搜尋類路徑的順序,即指定直譯器到哪裡去找.class及相關程式。
2、3、執行Java應用源程式:
編譯: javac test.java
執行:java test
2、4、執行Java小程式的兩種方法:
直接執行相應的.html檔案。
利用小程式檢視器AppletViewer執行Java小程式。
三、Java語言基礎
3、1資料型別(2類)
基本資料型別:byte short int long float double char boolean
package demo3_1;
public class Main {
private static char chartest;
public static void main(String[] args) {
// 資料型別 位元組數 包裝類 預設值 取值範圍
boolean boolean_=true; // 1 false true/false
byte byte_=3; // 1 Byte 0 -128~127
short short_=3; // 2 Short 0 -32768~32767
int int_=3; // 4 Integer 0 -2147483648~2147483647
long long_=2147483648l; // 8 Long 0L -9223372036854775808~9223372036854775807
float float_=34.0f; // 4 Float 0.0F 負數:-3.4E+38~-1.4E-45 正數:1.4E-45~3.4E+38
double double_=23.0; // 8 Double 0.0D 負數:-1.7E+308~-4.9E-324 正數:4.9E-324~1.7E+308
char char_='9'; // 2 'u\0000' 'u\0000'~'u\ffff'
int inta=(int)'a';//97
int intA=(int)'A';//65
char chara=(char)97;//a
char charA=(char)65;//A
char char0=(char)20320;//你
// boolean boolean=1; int不能轉化為boolean
// short short__;
// short__+=short_; 區域性變數聲明後不賦賦值會出現編譯錯誤 (堆記憶體與棧記憶體)
// long long_=2147483648; long型別的變數賦值時不加L或l,超出int型別資料範圍時報錯,沒有超出是不報錯
// float float_=34.0; float型別變數賦值時不加f或F,直接報錯,不加的話預設是double型別的資料型別
// Unicode字元編碼 65536個字元 'u\0000'~'u\ffff'
}
}
引用資料型別:類 物件 String Date
3、2關鍵字及識別符號:
關鍵字50個:
byte short int long float double char boolean true false null void
if else return for do while case switch default continue break
try catch finally throw throws
import package
extends implements
final static
this super
new class interface
private public protected abstract
native assert transient enum synchronized volatile instanceof
標誌符(類名、變數名、方法名、陣列名、檔名):
非關關鍵字
由 字母、數字、_、$ 構成
不能以數字開頭
3、3常量(不能被修改的固定值)
整型常量 final int A=03,B=0x12,E=0X12,C=23,D=23l;
浮點型常量 final float A=2.8e-2f,B=345E7F; final double A=2.8e-2,B=345E9D;
布林型常量 final boolean A=true;
字元型常量 'a' '9' '\b' '\n' '\r' '\t' '\\' '\'' '\"' '\uxxxx'(轉義符)
字串型常量 final String A="dafdasfdsa\u1234"(可包含轉義符)
3、4變數
概念:通過變數操縱記憶體中的資料,變數“先宣告、後使用”
四要素:名字(識別符號)、型別(決定值的範圍、可進行的操作、佔用記憶體的大小)、值、作用域
int a=12,b=03,c=0x3e,d;
3、5資料型別的轉換
自動型別轉換(2個條件:型別相容、轉換前比轉換後的範圍大)
(char、byte、short)---->int---->float---->double
byte---->short(byte+short---->int)
char與byte short之間不能夠進行自動型別轉換
boolean型別不能做型別轉換
型別轉換不影響原先變數的定義
強制型別轉換(需求是:大轉小)
(float)a/b a/(float)b (float)a/(float)b
字串與其他型別的轉換
字串---->數值型別:Boolean.paseBoolean(String s) 其他同理
數值型別---->字串:String str=""+2345;
3、6鍵盤輸入資料
package demo3_6;
import java.util.Scanner;
public class Stream_in_out {
public static void main(String args[]) {
Scanner scanner=new Scanner(System.in);
boolean boo=scanner.nextBoolean();
System.out.println(boo);
byte bytevalue=scanner.nextByte();
System.out.println(bytevalue);
short shortvalue=scanner.nextShort();
System.out.println(shortvalue);
int intvalue=scanner.nextInt();
System.out.println(intvalue);
long longvalue=scanner.nextLong();
System.out.println(longvalue);
float floatvalue=scanner.nextFloat();
System.out.println(floatvalue);
double doublevalue=scanner.nextDouble();
System.out.println(doublevalue);
String str1=scanner.nextLine();//接受回車鍵前的所有字元
System.out.println("str1:"+str1);
String str2=scanner.next();//略去有效字元前的空格、回車、tab鍵,到空格、回車、tab鍵結束。
System.out.println("str2:"+str2);
char charvalue=scanner.next().charAt(0);//輸入單個字元
System.out.println("char:"+charvalue);
}
}
3、7運算子及表示式
算術運算子:+、-、*、/、%、++、--
關係運算符:>、>=、<、<=、==、!=
邏輯運算子:&、|、!、^、&&、||
位運算子: &、|、^、~、>>、<<、>>>
賦值運算子:=、+=、-=、*=、/=、%=、|=、&=、^=、>>=、<<=、>>>=
條件表示式:(表示式1)?(表示式2):(表示式3)
優先順序:
. [] ()
++ -- ! ~ + - instanceof
new
* / %
+ -
<< >> >>>
< > <= >=
== !=
&
^
!
&&
||
?:
= += -= *= /= %= <<= >>= >>>= &= ^= |=
四、流程控制
4、1、順序結構
4、2、分支結構
4、2、1 if else
4、2、2 switch
4、3、迴圈結構
4、3、1while
4、3、2do-while
4、3、3for
4、3、4break continue
package demo4_2;
//三個數中的最大數,最小數
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a,b,c,min,max;
Scanner scanner=new Scanner(System.in);
a=scanner.nextInt();
b=scanner.nextInt();
c=scanner.nextInt();
if(a>b) {
max=a;
min=b;
}else {
max=b;
min=a;
}
max=c>max?c:max;
min=c<min?c:min;
System.out.println("max:"+max);
System.out.println("min:"+min);
}
}
package demo4_2;
//if else 巢狀迴圈
import java.util.Scanner;
public class Main1 {
public static void main(String[] args) {
int score;
char grade;
Scanner scanner=new Scanner(System.in);
score=scanner.nextInt();
if(score>=90) {
grade='A';
}else if(score>=80) {
grade='B';
}else if(score>=80) {
grade='C';
}else if(score>=70) {
grade='D';
}else if(score>=60) {
grade='E';
}else {
grade='F';
}
System.out.println(grade);
}
}
package demo4_2;
//switch case結構
import java.util.Scanner;
public class Main2 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
int b=scanner.nextInt();
char c=scanner.next().charAt(0);
int result;
switch (c) {//僅字元/整數型別
case '+':
result=a+b;
System.out.println(result);
break;
case '-':
result=a-b;
System.out.println(result);
break;
case '*':
result=a*b;
System.out.println(result);
break;
case '/':
result=a/b;
System.out.println(result);
break;
default:
System.out.println("輸入字元有誤");
break;
}
}
}
package demo4_2;
//switch case
import java.util.Calendar;
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
Calendar calendar=Calendar.getInstance();
int year=calendar.get(calendar.YEAR);
System.out.println(year);
int month=scanner.nextInt();
int day;
switch (month) {
case 2:
if(0==year%4&&0!=year%100||0==year%400) {
day=29;
}else {
day=28;
}
System.out.println(day);
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 12:
day=31;
System.out.println(day);
break;
default:
day=30;
System.out.println(day);
break;
}
}
}
package demo4_2;
//迴圈結構
import java.util.Scanner;
public class Mian7 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//1、
int n;
do {
n=scanner.nextInt();
}while(n<=0);
//2、
int i=1,sum=0;
while(i<=n) {
sum+=i++;
}
System.out.println(sum);
//3、
int numsum=0;
for(int j=0;j<=10;j++) {
numsum+=j;
}
System.out.println(numsum);
}
}
package demo4_2;
//水仙花數:
public class Test3 {
public static void main(String args[]) {
for(int i=1;i<10;i++) {
for(int j=0;j<10;j++) {
for(int k=0;k<10;k++) {
int num=i*100+j*10+k;
int num2=i*i*i+j*j*j+k*k*k;
if(num==num2) {
System.out.println(num);
}
}
}
}
for(int i=100;i<=999;i++) {
int a=i/100;
int b=(i-a*100)/10;
int c=i-a*100-b*10;
if(i==(a*a*a+b*b*b+c*c*c)) {
System.out.print(i+" ");
}
}
}
}
五、陣列及字串
5、0陣列基本知識
5、0、1記憶體分類:
堆記憶體:new字元建立的物件(java中陣列屬於物件)。
棧記憶體:基本型別變數、物件的引用變數(int a[]=new int[10] 即這裡的a變數,也即物件在記憶體中的首地址)。
int a[]=null;將引用變數賦予null值,表示該引用變數不指向任何的物件。
陣列:
陣列中的所有資料型別相同。
資料型別可以是基本資料型別、也可以是物件。
5、1、一維陣列
5、1、1宣告及初始化
package demo5_1;
//一維陣列
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 動態分配記憶體
int array[];//宣告陣列,並不分配記憶體,並且也不允許分配記憶體,此時陣列還不可用
// int array[10];錯誤
array=new int[10];//分配記憶體,陣列可用,並且每個元素都有一個預設值,整數:0、浮點數:0.0、字元:"\0"、boolean:false、引用型別的變數:null
array[0]=12;
for(int i=0;i<array.length;i++) {
System.out.print(array[i]+" ");
}
int array1[]= {12,3,23,4,5,67,78,23,56};//宣告陣列,並不分配記憶體,並且也不允許分配記憶體,此時陣列還不可用
// int array1[9]= {12,3,23,4,5,67,78,23,56};//錯誤
Arrays.sort(array1);//排序函式
System.out.println();
for(int i=0;i<array1.length;i++) {
System.out.print(array1[i]+" ");
}
int a=Arrays.binarySearch(array1, 56);//二分查詢函式
System.out.println("a:"+a);
int array2[]=Arrays.copyOf(array1, 3);//拷貝部分元素到另一個數組中
for(int i=0;i<array2.length;i++) {
System.out.print(array2[i]+" ");
}
System.out.println(Arrays.equals(array1, array2));
}
}
5、1、2
5、1、3
5、2、二維陣列
5、2、1宣告及初始化
package demo5_1;
//二維陣列:
public class Main1 {
public static void main(String[] args) {
int array[][]=new int[2][];//對
int array1[][]=new int[2][3];//對
int array2[][];
array2=new int[2][];//對
int array3[][]= {{1,2,3,4},{2,3,4}};//對
// int array3[2][4]= {{1,2,3,4},{2,3,4}};//錯
for(int i=0;i<array3.length;i++) {
for(int j=0;j<array3[i].length;j++) {
System.out.print(array3[i][j]+" ");
}
System.out.println();
}
// int array2[2][]=new int[][];//錯
// int array3[][3]=new int[][];//錯
// int array4[][]=new int[][3];//錯
}
}
5、2、2
5、2、3
5、3字串
5、3、1宣告及初始化
package demo5_1;
//字串:
public class Main2 {
public static void main(String[] args) {
String string=new String("string");
String str1="string";
String str4="string";
String str2="str";
String str3="ing";
str3=str2+str3;
System.out.println(str1.equals(str4));
System.out.println(str1.equals(string));
System.out.println(str1.equals(str3));
System.out.println(str1==string);
System.out.println(str1==str4);
System.out.println(str1==str3);
}
}
5、3、2關鍵函式的原始碼:
5、3、3 String---->char str[]:
5、3、4char str[]---->String
5、3、5常用方法:
length()、equals()、substring(int beginIndex)、substring(int beginIndex,int endIndex)、charAt(int Index)、indexOf(String str)
replace(char oldChar,char newChar)、trim()、toLowerCase()、toUpperCase()
5、3、6 String、StringBuffer、StringBuilder的區別
1、速度:
String:字串常量,對String的任何改變都會生成新的String物件。StringBuffer、StringBuilder字串變數,對其的任何改變都不會產生新的物件。
2、安全:
StringBuffer方法被synchronized關鍵子修飾,執行緒安全,StringBuilder方法沒有這個修飾,多執行緒併發時不能保證安全,但StringBuilder速度最快,所以單執行緒時,優先使用StringBuilder。
3、如何選擇:
少量操作字串時:String
單執行緒大量操作字串:StringBuilder
多執行緒大量操作字串:StringBuffer
5.4練習