計算機基礎(chǔ)
二進制
? 計算機中的數(shù)據(jù)不同于人們生活中的數(shù)據(jù)断序,人們生活采用十進制數(shù)流纹,而計算機中全部采用二進制數(shù)表示,它只包含
0违诗、1兩個數(shù)漱凝,逢二進一,1+1=10诸迟。每一個0或者每一個1茸炒,叫做一個bit(比特)。二進制數(shù)系統(tǒng)中阵苇,每個0或1就是一個位壁公,叫做bit(比特)。
進制轉(zhuǎn)換
十進制轉(zhuǎn)二進制
使用除以2獲取余數(shù)的方式
轉(zhuǎn)成Java代碼
public static String covertBin(int num) {
String binStr = "";
// 輾轉(zhuǎn)相除 余數(shù)倒序拼接 直到商為1時跳出循環(huán)
while (num != 1) {
binStr = num % 2 + binStr;
num /= 2;
}
return "1" + binStr;
}
二進制數(shù)據(jù)轉(zhuǎn)成十進制數(shù)據(jù)
使用8421編碼的方式 例如
二進制數(shù)據(jù)1001011轉(zhuǎn)成十進制
1 0 0 1 0 1 1
64 32 16 8 4 2 1
把有1的位上的十進制數(shù)求和
64+8+2+1=75
其實也就是1*64+1*8+1*2+1*1=75
字節(jié)
計算機中最小儲存單元绅项,打開計算機文件屬性即可看到是多少字節(jié)紊册。8個bit(二進制位) 0000-0000表示為1個字節(jié),寫成1 byte或者1 B趁怔。
也就是一個大B等于8個小b:
8 bit = 1 B
1024 B =1 KB
1024 KB =1 MB
1024 MB =1 GB
1024 GB = 1 TB
其實大家常見的例如100Mbps寬帶湿硝,換算成大B除以8薪前,那其實也就12.5MB/s了
JAVA環(huán)境
JRE 和 JDK
JRE (Java Runtime Environment) :是Java程序的運行時環(huán)境润努,包含JVM 和運行時所需要的 核心類庫 。
JDK (Java Development Kit):是Java程序開發(fā)工具包示括,包含 JRE 和開發(fā)人員使用的工具铺浇。
我們想要運行一個已有的Java程序,那么只需安裝 JRE 即可垛膝。
我們想要開發(fā)一個全新的Java程序鳍侣,那么必須安裝 JDK 。
總結(jié):也就是說jdk中包含jre與開發(fā)工具包kit吼拥。然后jre中又包含jvm倚聚。
配置環(huán)境變量
- 計算機鼠標右鍵,選擇 屬性
- 選擇 高級系統(tǒng)設(shè)置
- 高級 選項卡,點擊 環(huán)境變量
- 點擊 新建 凿可,創(chuàng)建新的環(huán)境變量
- 變量名輸入 JAVA_HOME 惑折,變量值輸入JDK9的安裝目錄 c:\Java9\jdk-9.0.1(這里只是舉例 請?zhí)顚懻鎸嵚窂剑?/li>
- 選中 Path 環(huán)境變量, 雙擊 或者 點擊編輯
- 在變量值的最前面枯跑,鍵入 %JAVA_HOME%\bin; 分號必須要寫惨驶,必須是英文格式
- 環(huán)境變量配置完成,重新開啟DOS命令行敛助,在任意目錄下輸入 javac或java -version 命令粗卜,運行成功
基礎(chǔ)知識
第一個Java程序
public class HelloWorld {
public static void main(String[] args) {
System.out.println("極四維博客");
}
}
記事本編輯如上,輸入命令
javac HelloWorld.java //編譯
java HelloWorld //運行
編譯就是將Java代碼轉(zhuǎn)換成計算機能懂的文件纳击,當用javac編譯后你會發(fā)現(xiàn)實際生成了一個HelloWorld.class的文件续扔。代碼錯誤可能會導致編譯失敗攻臀。
Main方法寫法固定格式不變,JVM在運行的時候测砂,都會從main方法這里開始執(zhí)行茵烈。
運行將jvm運行編譯好的程序
關(guān)鍵字keywords
HelloWorld案例中,出現(xiàn)的關(guān)鍵字有 public 砌些、 class 呜投、 static 、 void 等存璃,這些單詞已經(jīng)被Java定義好仑荐,全部都是小寫字母,變量進來別與關(guān)鍵字同名纵东。
標識符
是指在程序中粘招,我們自己定義內(nèi)容。比如類的名字偎球、方法的名字和變量的名字等等洒扎,都是標識符。
HelloWorld案例中衰絮,出現(xiàn)的標識符有類名字 HelloWorld 袍冷。
命名規(guī)則: 硬性要求
標識符可以包含 英文字母26個(區(qū)分大小寫) 、 0-9數(shù)字 猫牡、 $(美元符號) 和 _(下劃線) 胡诗。標識符不能以數(shù)字開頭。標識符不能是關(guān)鍵字淌友。
命名規(guī)范: 軟性建議
類名規(guī)范:首字母大寫煌恢,后面每個單詞首字母大寫(大駝峰式),例如HelloWorld震庭。
方法名規(guī)范: 首字母小寫瑰抵,后面每個單詞首字母大寫(小駝峰式),例如helloWorld器联。
變量名規(guī)范:全部小寫二汛。
雖然不遵守上述規(guī)范可以編譯程序,但這些也都形成一種規(guī)范了主籍,更詳細請參見阿里巴巴Java開發(fā)規(guī)范
注釋
單行注釋以 //開頭 換行結(jié)束
多行注釋以 /* 開頭 以 */ 結(jié)束
數(shù)據(jù)類型
基本數(shù)據(jù)類型:包括 整數(shù) 习贫、 浮點數(shù) 、 字符 千元、 布爾 苫昌。
引用數(shù)據(jù)類型:包括 類 、 數(shù)組 幸海、 接口 祟身。
類型 | 字節(jié)長度 | 取值范圍 |
---|---|---|
int | 4字節(jié) | -2 147 483 648 ~ 2 147 483 647(即-231 ~ 231-1) |
short | 2字節(jié) | -32 768 ~ 32 767 |
long | 8字節(jié) | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807(即-263 ~ 263-1) |
byte | 1字節(jié) | -128 ~ 127 |
float | 4字節(jié) | 大約±3.402 823 47E+38F(6~7位有效數(shù)字) |
double | 8字節(jié) | 大約±1.797 693 134 862 315 70E+308(15位有效數(shù)字) |
四類八種基本數(shù)據(jù)類型:
整數(shù)類型 byte short int(默認) long
浮點型 float double(默認)
字符型 char
布爾型 boolean
變量賦值奥务,例如:
int a=1;
//變量不賦值無法使用
int b;
System.out.println(b); //由于沒賦值會報錯
int c;
c=2
System.out.println(c); //賦值后正常
類型轉(zhuǎn)換
byte a = 2;
int b = a + 3; //范圍小與范圍大的運算自動轉(zhuǎn)換成范圍大的
byte c = (byte) (a + 3);//如果繼續(xù)使用范圍小的用括號填類型 強制轉(zhuǎn)換
//強制轉(zhuǎn)換可能會造成精度丟失 例如pi 3.1415926...轉(zhuǎn)換成整型
int d = (int) Math.PI; //結(jié)果為3
特例,范圍相同運算也自動轉(zhuǎn)換為范圍大的
byte b1 = 1;
byte b2 = 2;
byte b3 = 1 + 2;
System.out.println(b3); //3 由于1袜硫、2常量值確定 因此編譯通過
//byte b4=b1 + b2;//編譯報錯 b1氯葬、b2為變量 值不確定,返回類型實際為int
int b4 = b1 + b2;//int正常編譯
byte b5 = (byte) (b1 + b2);//加強轉(zhuǎn)正常
System.out.println(b4);
字符char運算
char c = 'd';
//char運算先根據(jù)ascii碼表轉(zhuǎn)換成數(shù)值再運算
System.out.println(c + 0); //100+0=100
運算符
算數(shù)運算符
System.out.println(1 + 2 - 3 * 4 / 5);//1
// 加減乘除 除時由于時默認是int類型婉陷,因此沒保留整數(shù)部分
System.out.println(5 % 2);//1 取模 即取兩數(shù)的余數(shù)
賦值運算符
int a=1; //= 最簡單賦值運算符
a+=2;//其實就是a=a+2的簡寫 其他 -=帚称、*=等同理
System.out.println(a);//3
類型強轉(zhuǎn)現(xiàn)象
short s = 1;
s+=1; //變量s類型不變 實際執(zhí)行強轉(zhuǎn) s=(short)(s+1);
System.out.println(s);
比較運算符
//>、<秽澳、 >=闯睹、 <=、 !=担神、 ==等楼吃,返回true與false
System.out.println(1==2); //false
System.out.println(1<=2); //true
邏輯運算符
System.out.println(1<2&&1==1); //true &&且 兩邊都滿足
System.out.println(1<2&&1==2); //false
System.out.println(1<2||1==2); //true ||或者 其中一個滿足即可
System.out.println(1>2||1==2); //false
System.out.println(!true);//false 取反
System.out.println(1==1||1/0==1); //true 左邊滿足即右邊不會運算
System.out.println(1==1|1/0==1); //報錯 左邊滿足 右邊繼續(xù)運算
// 因此建議用雙與、雙或妄讯,它們具有短路的特點孩锡,即一方滿足另一個將不再運算
三元運算符
int i = (1==2 ? 100 : 200);
System.out.println(i);//200
方法入門
基本格式
修飾符 返回值類型 方法名 (參數(shù)列表){
代碼...
return ;
}
示例
/*
* 修飾符例如public、private亥贸、protected等代表訪問權(quán)限
* static加上表靜態(tài)方法 不加為非靜態(tài) 例如main方法就是靜態(tài)方法
* 靜態(tài)方法中調(diào)用的方法也是靜態(tài)的,靜態(tài)方法先被加載且只會被加載一次
* void為返回類型為空 即無返回值
* String[] args即為參數(shù)躬窜,參數(shù)列表可有可無 有時可以傳遞參數(shù)
* 注意 輸出語句調(diào)用的方法需有返回值 不能調(diào)用void方法
* */
public static void main(String[] args) {
System.out.println(call(10086));
}
/**
*這里返回值為String表示有返回值
* int no為方法參數(shù)
* return后為返回值
*/
public static String call(int no) {
return "撥號:" + no;
}
方法重載
指在同一個類中,允許存在一個以上的同名方法砌函,只要它們的參數(shù)列表不同即可斩披,與修飾符和返
回值類型無關(guān)溜族。不論修飾詞讹俊、返回類型咋樣,方法名相同且參數(shù)列表不同即可煌抒。
public static void main(String[] args) {
println(123);//123
println("Hello");//Hello
println("得分:", 100);//得分:100
System.out.println(println("得分:", 100L));//得分:100
}
public static void println(int a) {
System.out.println(a);
}
private static void println(String a) {
System.out.println(a);
}
public static void println(String a, int b) {
System.out.println(a + b);
}
static String println(String a, long b) {
return a + b;
}
方法重寫
子類中出現(xiàn)和父類中一模一樣的方法(包括返回值類型,方法名,參數(shù)列表)
例如:對接口方法進行重寫
class Test {
public static void main(String[] args) {
new Like() {
@Override
public void eat() {
System.out.println("吃肉肉");
}
}.eat();
}
}
interface Like{
void eat();
}
不固定參數(shù)方法
類型... 表多個該類型參數(shù)仍劈,此時的foods其實就是個數(shù)組,可以通過循環(huán)取出它的值
public static void main(String[] args) {
//我喜歡吃:包子 燒賣 糯米雞
eat("包子","燒賣","糯米雞");
eat(); //不固定參數(shù)方法 調(diào)用時可以為空
}
public static void eat(String... foods){
System.out.print("我喜歡吃:");
for (String food : foods) {
System.out.print(food+" ");
}
}
JShell
jdk9后新特征寡壮,cmd命令行中輸入jshell直接進入命令行寫java代碼贩疙,適合新手學習
- /help intro查詢幫助
- /exit退出
流程控制語句
簡而言之:程序執(zhí)行順序影響執(zhí)行結(jié)果,通過控制執(zhí)行順序來控制執(zhí)行結(jié)果况既。
順序結(jié)構(gòu)
//順序執(zhí)行这溅,根據(jù)編寫的順序,從上到下運行
System.out.println(1);
System.out.println(2);
System.out.println(3);
//依次輸出1棒仍、2悲靴、3
判斷語句
int num = 90;
if (num > 0 && num < 60) {
System.out.println("不及格");
} else if (num >= 60 && num < 80) {
System.out.println("良好");
} else {
System.out.println("優(yōu)秀");
}
選擇語句
String type = "1";
//選擇式
switch (type){
case "1":
System.out.println("打開");
//這里剛好type為1,由于switch穿透性
//break不寫的話 其下面條件里的語句無論符不符合都會被執(zhí)行
break;
case "0":
System.out.println("關(guān)閉");
break;
default:
System.out.println("其他狀態(tài)");
}
循環(huán)語句
for
// 循環(huán)十次 簡析:i從0開始莫其,循環(huán)到大于等于10結(jié)束癞尚,每次循環(huán)i+1耸三,稱為步進
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
// 步進值為i = i + 2,這樣每次循環(huán)+2浇揩,循環(huán)次數(shù)由于步進的變化也成了5次
for (int i = 0; i < 10; i = i + 2) {
System.out.println(i);
}
增強for循環(huán)
int[] num={1,2,3,4,5};
for (int i : num) { //循環(huán)的對象可以是數(shù)組仪壮、集合等
System.out.println(i); //輸出數(shù)組中值
}
jdk8新增forEach .forEach適合遍歷list與map,對于數(shù)組無法遍歷
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.forEach(s->System.out.println(s));
while
int i=0;
while (i<10){ //i<10時執(zhí)行
i++; //由于i每次+1 因此會執(zhí)行10次
System.out.println(i);
}
do...while
int i=0;
do{
i++;
System.out.println(i);
} while (i<10);
如上代碼也執(zhí)行10次胳徽,大致與while執(zhí)行一致积锅,但兩個真一樣么?不是养盗,當while中條件不符合時乏沸,while一次不會執(zhí)行,do...while仍然會執(zhí)行一次爪瓜!
int i=0;
do{
i++;
System.out.println(i);
}while (i>10);
如上代碼蹬跃,雖然i不符合條件,但還是執(zhí)行了一次铆铆,由于條件在執(zhí)行代碼后蝶缀,因此,這種情況也很容易被理解薄货∥潭迹總結(jié):while...do會先執(zhí)行,再判斷谅猾,如果符合再繼續(xù)執(zhí)行柄慰,如此往復。而while是先判斷税娜,判斷不符合就直接不執(zhí)行
跳出語句
continue; //跳出本次循環(huán)
break;//跳出循環(huán)
return;//這算不上跳出循環(huán)語句坐搔,因為在方法里加它會直接跳出方法。
死循環(huán)
沒結(jié)束條件的循環(huán)敬矩,例如
while(true){
System.out.println(System.currentTimeMillis());
}
for死循環(huán)
for (;;){
System.out.println(System.currentTimeMillis());
}
嵌套循環(huán)
例如輸出一個由*組成的5行10列的矩形
for (int i = 0; i < 5; i++) {
for (int i1 = 0; i1 < 10; i1++) {
System.out.print("*");
}
System.out.println();
}
數(shù)組
格式
int[] arr = new int[3]; //固定長度數(shù)組
int[] arr1 = new int[]{1,2,3,4,5}; //固定內(nèi)容數(shù)組
int[] arr2 = {1,2,3,4,5}; //同上 固定內(nèi)容
arr[0]=100;//數(shù)組根據(jù)索引賦值
System.out.println(arr2.length);//輸出數(shù)組的長度
System.out.println(arr2[0]);//1 取值索引為0的
for (int i : arr2) {
// for循環(huán)遍歷數(shù)組
System.out.println(i);
}
for (int i = 0; i < arr1.length; i++) {
// 根據(jù)索引遍歷數(shù)組
System.out.println(arr1[i]);
}
這里注意數(shù)組跟集合的索引(下標)都是從0開始的哦概行!
數(shù)組作為參數(shù)、返回值
其實main方法就是以數(shù)組為參數(shù)弧岳。當然寫這類方法凳忙,例如
public void eat(String[] animals){
//...代碼
}
當然前面所介紹的 不固定參數(shù)方法其實用的也是數(shù)組,方法參數(shù)中foods雖然不是數(shù)組形式但當數(shù)組來調(diào)用的
public static void main(String[] args) {
//我喜歡吃:包子 燒賣 糯米雞
eat("包子","燒賣","糯米雞");
eat(); //不固定參數(shù)方法 調(diào)用時可以為空
}
public static void eat(String... foods){
System.out.print("我喜歡吃:");
//這里foods其實就是數(shù)組
for (String food : foods) {
System.out.print(food+" ");
}
}
數(shù)組操作案例
獲取最大值
以下變量max相當于一個擂臺的頒獎臺禽炬,誰大就往上放涧卵,然后它再繼續(xù)跟其它數(shù)比較
int[] arr = {1, 2, 3, 4, 5};
//定義變量,保存數(shù)組中0索引的元素
int max = arr[0];
//遍歷數(shù)組腹尖,取出每個元素
for (int i = 0; i < arr.length; i++) {
//遍歷到的元素和變量max比較
//如果數(shù)組元素大于max
if (arr[i] > max) {
//max記錄住大值
max = arr[i];
}
}
System.out.println("數(shù)組最大值是: " + max);
數(shù)組反轉(zhuǎn)
建個臨時變量柳恐,小的復制給temp,然后大的復制給小的,temp再賦值給大的(其實也就是小的賦值給大的)
int[] arr = { 1, 2, 3, 4, 5 };
/*
循環(huán)中定義變量min=0最小索引
max=arr.length‐1最大索引
min++,max‐‐
*/
for (int min = 0, max = arr.length - 1; min <= max; min++, max--) {
//利用第三方變量完成數(shù)組中的元素交換
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
// 反轉(zhuǎn)后胎撤,遍歷數(shù)組
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}