Java的基礎程序設計結構(Java學習-1)

  • 2019 年 11 月 5 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/weixin_43126117/article/details/90710314

一年前學習Java的總結

注釋

注釋就是方便自己或者別人閱讀代碼,絕大多數的程序語言都有注釋這個功能,大部分的注釋命令都是相同的或者想通的,

下面給出Java的注釋結構

三類注釋  //單行注釋  /*多行注釋*/  /**文本注釋*/

注意:/*多行或者文本注釋*/不能嵌套。後面的*/或匹配前面的。

文本注釋可以用來自動生成程序文檔。

數據類型

Java是一種強類型語言,也就是說每一個變量聲明都需要一種數據類型,作為一款可移植性,跨平台可用的語言,當然不像C、C++這種換平台,64位OS->32位OS,數據類型空間就發生改變,JVM的好處唄。

  • 數據類型劃分兩種

基本數據類型:

數值型 整型:byte short int long 默認值:0; 浮點型:float double 默認值0.0 字符型:chat 』u0000' 『 布爾型:Boolean false

引用數據類型: 數組 類 接口 默認值:根據存放內容,初始化不同值,對象(null),基本數據類型(默認值)。

  • 整型

聲明一個數據類型 一個數據溢出(最小值?)的問題 int maxValue = Integer.MAX_VALUE +1 一個變量命名要求 首字母小寫 下個單詞大寫) 操作前預估數據大小 怎麼解決溢出問題:換個數據類 long解決interest的數據溢出問題,(有一個大數值的概念) 在使用方法處理時,要注意 所有的程序執行順序都是 由等號的右邊到左邊,計算還會溢出, 溢出的問題

一 將int 的數據變量賦值給long

long result = maxValue;  long result = maxValue +1; //出錯 這裡涉及到一個自動轉換的問題, 等號右邊到左邊;

二 直接將某一int型變量變為long型

 long result = (long)maxValue +1;//強制轉換

數據類型也可以以小變大!!(強制完成- 肯定會丟內容,少用 少用) 任何整數其默認數據類型,所以 long i= 2147483648; 編譯是錯誤的 int型儲存不了那麼的數字範圍 所以在int型 強制轉換前就出錯了。

數值類型之間的合法轉化(實線合法)

類比。 long i = 2147483648L (L/l)

重要說明

關於數據類型的默認值, 這個默認值在方法(主方法)中聲明無效 int num; 直接輸出 System.out.print(num) 出錯

class Untitled {  	public static void main(String[] args) {  		int i ;  		System.out.println(i);          }  }  Untitled.java:4: error: variable i might not have been initialized  		System.out.println(i);  		                   ^  1 error

byte數據保存範圍問題 十進制為( -128–127. ),1位元組

byte i = 10 ;// 輸出也是 10 ,為什麼沒錯,  10 int型 可以強制轉換成 byte 可以保存下。  byte i = 128;   //從 int轉換到 byte 可能有損失。  byte i = (byte)128   //溢出 !  byte i = (int j = 10);  //出錯!!運行:等號右邊到左邊,小的自動轉大的  byte i = (byte) (int j = 10);
  • 浮點型

描述小數的數據,默認是double。 如果要用float,要強制轉換,在數字後加一個F/f。、

    float f = 1.1 ; //錯誤,從double轉換float可能有損失。      float f = 1.1F;      float f = (float)1.1;

(Java 的一個but , 輸出的數有一推零。) 精度問題(int型 除 int型 等 int型 , 10/4 =2 ,錯誤。 )

  • 字符型

會使用字符型的概念,但是很少使用char, 單引號 chat c ='A'; 麻煩的地方在 int型的轉換等比較難, Unicode編碼,十六進制編碼。包含ASCII。 常用範圍 大寫字母A-Z;65—90 小寫字母a-z;97 -122(相差32個) chat c ='A'; int num = c + 32; //等於int 型 ,大的範圍類型加小範圍類型,等於大的數據類型 字符數字(『0』-『9』),48-57. 另外一個神奇的用法, 變量命 類名 直接用中文都可以。命名標識符

char只可以描述單一字符, 多個字符用String,String不是基本數據類型是一種引用數據類型 『』+『』 兩個字符串相加, int+double+String 結果(String)為字符串相加連接,不能用減。解決方法:(int+double)+String 還存在一種轉義字符! 可以對字符串進行一些操作。

這裡也涉及到一個Unicode和char的問題,要從編碼機制開始說,就不談了。

  • 布爾型

一般指邏輯結果,其他語言沒有布爾型,其他語言用0 1表示 .

變量

剛說的,Java是一種強類型語言,也就是說每一個變量聲明都需要一種數據類型

命名規範,大小寫敏感,不能用Java關鍵字。

public calss Constants{          int i ;          int i = 1;//變量聲明      public static void main(String [] arg){          int i ;//局部變量聲明,上面說了,這個無效          int i = 1;//局部變量聲明          final double i = 2.3;//加了final關鍵字就是常量了,不能改變值        }          public static final double i = 2.3;//類常量,別的類可直接訪問。    }

運算符

程序的計算 別寫特別的複雜運算。可使用Math類下的方法,關於這些算法,其實都是用C寫的,有興趣可以看算法網站

  • 基本四則運算

自增運算:++變量(先加再運算)。 變量++(先運算再相加)。 自減運算。

  • 三目運算

賦值運算,根據條件運算。 int result = x > y ? x : y; 不熟悉,也可以寫if判斷。代碼行數太多了。

  • 關係運算符

>,<,<=,==,!=.返回結果都是布爾型。字符和數字判斷 『a』 == 97 ;

  • 邏輯運算

與, 或 ,非(!) 。 返回布爾型 & , && (單& 全部都都返回了,不管後面是怎麼樣, 雙&&,(短路與),判斷一個就行了) | , | | (單 | 全部都返回了, 雙||判斷前面就ok了。)

  • 位運算(了解)

按照二進制 十六進制 等進行 數據移位處理。 位運算實現的關鍵問題再與要進行十進制與二進制的轉換,轉換原則是 數據除 2 取余,一直除到 0 為止,說有的餘數按照倒序排列。

  • 運算符優先級,運算可以直接加括號。()

運算符優先級

  • 常見運算符使用例子
int x ;  x += 4;    x = x + 4;  x +=3.5;    x = (int) x + 3.5;  x++;        x = x + 1;//先賦值再運算  ++x;        x = x + 1;//先運算再賦值  if(x != 0 && x++>y ) //前面要是false了,後面是不會運行的。    enum Size{s,m,l,x};//枚舉  Size s = Size.s;

字符串

Java是沒有字符串類型的,它只是Unicode字符序列,其實就是一個字符數組(char [ ]),String是一個Java一個預定義類,也稱為不可變字符串。

String e = ""; //一個空字符串    if(e != null&& e.length != 0);//判斷字符串,因為String還有一個特殊的值null;
  • 子串
String e = "hello";  String sube = e.substring(0,2);//hel  //源碼   public String substring(int beginIndex) {          if (beginIndex < 0) {              throw new StringIndexOutOfBoundsException(beginIndex);          }          int subLen = value.length - beginIndex;          if (subLen < 0) {              throw new StringIndexOutOfBoundsException(subLen);          }          return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);      }
  • 拼接

java語言允許使用加號連接兩個字符串,需要注意的是這是生成一個新對象,jvm的垃圾回收會解決舊對象的回收問題。

  • 檢查字符串是否相等

==和.equal

在引用數據類型中==比較的是:在內存中的地址是否相等。

在基本數據類型中==比較的是:值是否相等。

.equal的問題,由於String對象是利用字符常量形成的數組,並且內部有一個字符串共享的存儲池的概念;

String a = "hello";//在字符串共享池中存入。  String b = "hello";//先在共享池中查找到相同對象,引用相同內存地址,共享池就是一個對象數組    a==b;//是相等的,內存地址相等;

so,一般比較字符串大小使用.equal。

if(e.equal(hello));    if(e.compareTo("hello"));//類似上面的    //.equal源碼java.lang.String類   /** The value is used for character storage. */      private final char value[];      public boolean equals(Object anObject) {          if (this == anObject) {              return true;          }          if (anObject instanceof String) {              String anotherString = (String)anObject;              int n = value.length;              if (n == anotherString.value.length) {                  char v1[] = value;                  char v2[] = anotherString.value;                  int i = 0;                  while (n-- != 0) {                      if (v1[i] != v2[i])                          return false;                      i++;                  }                  return true;              }          }          return false;      }
  • 字符串原理

字符串由char值序列組成的,char類型是一個採用UTF-16編碼表示unicode碼點的代碼單元。(有一些字符需要兩個代碼單元)

String e = "hello";  String num = e.length();//獲取代碼單元(在內存中的大小) 5  String num = e.codePointCount(0,e.length());//獲取碼點(實際看到的數量) 5    /** The value is used for character storage. */      private final char value[];
  • 一些字符串注意點

我們盡量減少使用char類型,因為這個太底層了,太多技術細節了,

String類是一個非線程安全的,並且一部小心就生成了很多String對象,浪費空間和時間,雖然jvm有自動垃圾回收,但是也是系統的一個負擔。

so,使用StringBuilder類,或者StringBuffer類(線程安全)。

控制流程

  • 順序結構

分支結構,邏輯判斷,滿足某些條件才執行

if 分支結構  		if(布爾表達式){  		    滿足條件時執行代碼;  		}else if( 布爾表達式){  		    條件滿足時的執行代碼;  		}。。。【else】{  		    所有條件都不滿足時執行的代碼;  		}    switch分支結構  		switch(數字|枚舉|字符|字符串){  		    case 內容1 :{  		        瞞住的條件執行  		    【break】~停止的  		    }  		    default{  		        都不滿足執行  		    }  		}
  • 循環結構
while循環  	while(布爾表達式)(  	  循環語句;  	 修改循環結束田間判斷;  	}  另 do  -- while(始終執行一次)    基本不使用    for循環  	FOR(循環初始條件;循環結束判斷;修改循環條件{  	    循環代碼  	}

對於不知道循環次數的用while, 知道次數的使用for循環。 循環控制 continue: 跳過當前的循環,循環體後面的不執行。回到循環語句開頭 brake:結束整個循環體 循環嵌套,用的不多。

數組

數組是一種引用數據類型,用來存儲同一類值的集合,通過一個整型下標可以訪問數組中的每一個值。

  • 數組初始化
int a[];  int [] a ;//聲明整型數組a,只是聲明了變量。  int [] a = new int[100]//創建數組,下標為0-99。    int [] b = {1,2,3};//簡寫    b = new int[]{3,5,4};//匿名數組
  • 數組拷貝

數組拷貝,只是兩個變量引用同一個數組,也就是同一個堆地址。同一塊堆被不同塊棧指向,堆真實數據 , 棧保存堆的地址。

int [] a = {1,2,3};  int [] b = Arrays.copyOf(a,a.length);    //源碼      public static int[] copyOf(int[] original, int newLength) {          int[] copy = new int[newLength];          System.arraycopy(original, 0, copy, 0,                           Math.min(original.length, newLength));          return copy;      }
  • 數組排序與查找

Java語言是完全面向對象的,相比於「結構化」的語言,注重方向是一樣的,Java,更加註重數據結構,而不是算法。so,這裡就談算法的問題啦,直接使用api。

int [] a = {1,3,2,5};  int [] b = Arrays.sort(a);//優化了的快速排序算法    int c = Arrays.binarySearch(a ,0 ,3 ,2);//二分搜索查找算法
  • 多維數組

Java實際上是沒有「多維數組」的概念的,但是可以用「數組的數組」代替。

int [][] a ;//聲明  int [][] a = new [1][2];//初始化化  int [][] a = {                 {1,2,3},                 {2,3,4}                };//簡寫  //不規則數組  int [][] b = {                  {1,2,3},                  {1,2,3,4,5}                };  //可以用foreach輸出數組  foreach(int [] row : b){      foreach(int value : row){          System.out.println(value);      }       System.out.println("---");  }

總結

這些是很基礎的東西,絕大多是編程語言都支持,並且相差不會很大,上面說的是遠遠不夠的,這只是自己一年前的總結,這些基礎其實敲多了,就自然的熟悉了。