Java基础三个排序详解_继承粗解语法关键字分析
集合存放數(shù)據(jù)的容器,存放的數(shù)據(jù)可以是基本類型也可以是引用類型,數(shù)據(jù)類型必須一致,存放數(shù)據(jù)的空間是連續(xù)的即地址連續(xù),長度固定
聲明數(shù)組變量
首先必須聲明數(shù)組變量,才能在程序中使用數(shù)組。下面是聲明數(shù)組變量的語法:
注意: 建議使用 dataType[] arrayRefVar 的聲明風(fēng)格聲明數(shù)組變量。
dataType arrayRefVar[] 風(fēng)格是來自 C/C++ 語言 ,在Java中采用是為了讓 C/C++ 程序員能夠快速理解java語言。
創(chuàng)建數(shù)組
Java語言使用new操作符來創(chuàng)建數(shù)組,語法如下:
arrayRefVar = new dataType[arraySize];
上面的語法語句做了兩件事:
一、使用 dataType[arraySize] 創(chuàng)建了一個(gè)數(shù)組。
二、把新創(chuàng)建的數(shù)組的引用賦值給變量 arrayRefVar。
數(shù)組變量的聲明,和創(chuàng)建數(shù)組可以用一條語句完成,如下所示:
dataType[] arrayRefVar = new dataType[arraySize];
另外,你還可以使用如下的方式創(chuàng)建數(shù)組。
dataType[] arrayRefVar = {value0, value1, …, valuek};
數(shù)組的元素是通過索引訪問的。數(shù)組索引從 0 開始,所以索引值從 0 到 arrayRefVar.length-1。
例一:
public class ArrayDf{public static void main(String[] args){String[] stringArray; //主方法棧幀中創(chuàng)建一個(gè)String[]類型變量,存放一個(gè)String[]類型的變量,里面包含若干元素,引用類型//String[]是一種類型,不能有下標(biāo)//數(shù)組變量存儲的位置看定義的位置,比如static——靜態(tài)數(shù)據(jù)區(qū)stringArray = new String[10]; //創(chuàng)建對象在堆區(qū),開辟10個(gè)String[]類型的空間相當(dāng)于創(chuàng)建了10個(gè)連續(xù)的變量,初值一樣stringArray[1]="two"; //把two賦給stringArray[]所指數(shù)組對象的第二個(gè)元素 //數(shù)組名對應(yīng)數(shù)組元素空間地址,數(shù)組對象每一個(gè)元素的空間 //元素名和變量名類似,尋址方式不同,導(dǎo)致叫法不同 //變量——直接尋址 //元素——間接尋址 //元素名:元素空間首地址+下標(biāo) //有確切的初值null //一個(gè)new String一次創(chuàng)建兩個(gè)對象,分別儲存在堆中和方法區(qū)的常量池 //元素個(gè)數(shù)已經(jīng)定義,是final不可分割,不可改變的System.out.println("元素默認(rèn)初始化值是:"+stringArray[2]); //輸出String[]類型System.out.println("元素默認(rèn)初始化值是:"+stringArray);} }例二:
public class StaticInitArray{public static void main(String[] args){int[]a = {1,3,5,7,9,11};//這種初始化只能在聲明時(shí)使用 主方法棧幀中開辟空間,創(chuàng)建變量a,int[]類型,不會默認(rèn)初始化 在類中定義的實(shí)例變量(堆)和靜態(tài)全局變量(方法區(qū)靜態(tài)數(shù)據(jù)區(qū))會默認(rèn)初始化,在棧楨中不會默認(rèn)初始化//int[] a;//a= {1,3,5,7,9,11}; 錯誤這屬于賦值不是初始化//初始化有默認(rèn)初始化,顯式初始化 //顯示初始化是在定義變量的時(shí)候//賦值可以多次,初始化只能有一次int[]k=new int[0];//System.out.println(k[0]);//int[]m=new int[-10];int[]num;num=new int[]{1, 2, 3, 4, 5};既可以初始化,也可以賦值,比較靈活int[]b = new int[3]; //指定元素個(gè)數(shù)3,默認(rèn)為0b=num;b原來所指的數(shù)組對象地址丟失,游離,內(nèi)存泄露 //b,num都是首元素地址a,b,num類型相同,可以相互賦值b[2]=100;for (int i = 0;i<b.length;i++){System.out.println(num[i]);} System.out.println("--------------------");for (int i:b){ //拿出數(shù)組元素賦給iSystem.out.println(i);}集合可以存放不同類型對象的地址,數(shù)組也可以,但必須是object[]類型} }多維數(shù)組
多維數(shù)組可以看成是數(shù)組的數(shù)組,比如二維數(shù)組就是一個(gè)特殊的一維數(shù)組,其每一個(gè)元素都是一個(gè)一維數(shù)組,例如:
多維數(shù)組的動態(tài)初始化(以二維數(shù)組為例)
1. 直接為每一維分配空間,格式如下:
type 可以為基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型,arraylength1 和 arraylength2 必須為正整數(shù),arraylength1 為行數(shù),arraylength2 為列數(shù)。
例如:
解析:
二維數(shù)組 a 可以看成一個(gè)兩行三列的數(shù)組。
2. 從最高維開始,分別為每一維分配空間,例如:
解析:
s[0]=new String[2] 和 s[1]=new String[3] 是為最高維分配引用空間,也就是為最高維限制其能保存數(shù)據(jù)的最長的長度,然后再為其每個(gè)數(shù)組元素單獨(dú)分配空間 s0=new String(“Good”) 等操作。
多維數(shù)組的引用(以二維數(shù)組為例)
對二維數(shù)組中的每個(gè)元素,引用方式為 arrayName[index1][index2],例如:
Arrays 類
java.util.Arrays 類能方便地操作數(shù)組,它提供的所有方法都是靜態(tài)的。
具有以下功能:
? 給數(shù)組賦值:通過 fill 方法。
? 對數(shù)組排序:通過 sort 方法,按升序。
? 比較數(shù)組:通過 equals 方法比較數(shù)組中元素值是否相等。
? 查找數(shù)組元素:通過 binarySearch 方法能對排序好的數(shù)組進(jìn)行二分查找法操作。
具體說明請查看下表:
序號 方法和說明
用二分查找算法在給定數(shù)組中搜索給定值的對象(Byte,Int,double等)。數(shù)組在調(diào)用前必須排序好的。如果查找值包含在數(shù)組中,則返回搜索鍵的索引;否則返回 (-(插入點(diǎn)) - 1)。
2 public static boolean equals(long[] a, long[] a2)如果兩個(gè)指定的 long 型數(shù)組彼此相等,則返回 true。如果兩個(gè)數(shù)組包含相同數(shù)量的元素,并且兩個(gè)數(shù)組中的所有相應(yīng)元素對都是相等的,則認(rèn)為這兩個(gè)數(shù)組是相等的。換句話說,如果兩個(gè)數(shù)組以相同順序包含相同的元素,則兩個(gè)數(shù)組是相等的。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte,short,Int等)。
3 public static void fill(int[] a, int val)將指定的 int 值分配給指定 int 型數(shù)組指定范圍中的每個(gè)元素。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte,short,Int等)。
4 public static void sort(Object[] a)對指定對象數(shù)組根據(jù)其元素的自然順序進(jìn)行升序排列。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte,short,Int等)。
length屬性,length()方法和size()的方法的區(qū)別
1.length屬性是針對Java中的數(shù)組來說的,要求數(shù)組的長度可以用其length屬性;
2.length()方法是針對字符串來說的,要求一個(gè)字符串的長度就要用到它的length()方法;
3.java中的size()方法是針對泛型集合說的,如果想看這個(gè)泛型有多少個(gè)元素,就調(diào)用此方法來查看!
冒泡法排序的基本思想:
從前向后(或從后向前)依次比較相鄰兩個(gè)元素的大小,如果逆序(與題意要求的順序相反)就進(jìn)行交換,使最小(最大)的元素上浮(下沉)到本次排序的最前面(最后面),從而完成一趟(pass)排序。下一趟排序時(shí),已經(jīng)有序的元素不再參與。這樣的話,n個(gè)元素需要進(jìn)行n-1趟排序
冒泡排序的關(guān)鍵點(diǎn):
(1)采用雙層循環(huán):時(shí)間復(fù)雜度為O(n的平方)
外層循環(huán)表示的是排序的趟數(shù),n個(gè)數(shù)字需要n-1趟,因此,外層循環(huán)的次數(shù)是n-1次;
內(nèi)層循環(huán)表示的是每一趟排序的數(shù)字。根據(jù)冒泡排序的思想,第i趟排序后,就會有i個(gè)數(shù)屬于有序的元素,它們不參與第i+1趟的排序。因此,用一個(gè)循環(huán)來控制,只是不同的方式的寫法不一樣,望學(xué)者理解掌握。
(2)相鄰兩個(gè)數(shù)只要屬于逆序,就實(shí)行交換。正序就不交換,因此,是穩(wěn)定排序;也就是說,即使序列中出現(xiàn)相同的兩個(gè)數(shù)字,它們不會實(shí)施交換,相同數(shù)字的相對順序不會發(fā)生變化!
選擇排序的基本思想:
找到當(dāng)前數(shù)字序列中最大(最小)的數(shù),記錄其所在位置,將其和最前面(最后面)的數(shù)進(jìn)行交換,使最小(最大)的元素上浮(下沉)到本次排序的最前面(最后面),從而完成一趟(pass)排序。下一趟排序時(shí),已經(jīng)有序的元素不再參與。這樣的話,n個(gè)元素需要進(jìn)行n-1趟排序
選擇排序的關(guān)鍵點(diǎn):
(1)采用雙層循環(huán):時(shí)間復(fù)雜度也是O(n的平方)
外層循環(huán)表示的是排序的趟數(shù),n個(gè)數(shù)字需要n-1趟,因此,外層循環(huán)的次數(shù)是n-1次;同時(shí)也代表數(shù)的位置。
內(nèi)層循環(huán)表示的是每一趟排序的數(shù)字。根據(jù)選擇排序的思想,第i趟排序時(shí),最前面的位置就是i,用一個(gè)循環(huán)來不斷更新。
(2)找到最值數(shù)的位置,將該位置的數(shù)和當(dāng)前序列最前面(最后面)位置的數(shù)進(jìn)行交換;。(穩(wěn)定排序)
插入排序的基本思想是:
將數(shù)組的第一個(gè)數(shù)認(rèn)為是有序數(shù)組,從后往前(從前往后)掃描該有序數(shù)組,把數(shù)組中其余n-1個(gè)數(shù),根據(jù)數(shù)值的大小,插入到有序數(shù)組中,直至數(shù)組中的所有數(shù)有序排列為止。這樣的話,n個(gè)元素需要進(jìn)行n-1趟排序
插入排序的關(guān)鍵點(diǎn):
? 采用雙層循環(huán):時(shí)間復(fù)雜度也是O(n的平方)
(1)外層循環(huán)表示的是排序的趟數(shù),n個(gè)數(shù)字需要n-1趟,因此,外層循環(huán) 的次數(shù)是n-1次;同時(shí)也代表數(shù)的位置。
(2)內(nèi)層循環(huán)表示的是每一趟排序的數(shù)字。根據(jù)插入排序的思想,第i趟排 序時(shí),有序數(shù)組中的數(shù)字就有i個(gè),就需要進(jìn)行i次比較,因此循環(huán)i次。注 意采用的是從后往前進(jìn)行比較。
? 從后往前掃描的時(shí)候,如果必須插入的數(shù)大于有序數(shù)組中當(dāng)前位置的數(shù),則有序數(shù)組中的數(shù)和它之后的數(shù)均往后移一個(gè)位置,否則,把插入的數(shù)插入到有序數(shù)組中。(穩(wěn)定排序)
繼承類型
需要注意的是 Java 不支持多繼承,但支持多重繼承。
繼承的特性
Java 的繼承是單繼承,但是可以多重繼承,單繼承就是一個(gè)子類只能繼承一個(gè)父類,多重繼承就是,例如A類繼承B類,B類繼承C類,所以按照關(guān)系就是C類是B類的父類,B類是A類的父類,這是Java繼承區(qū)別于C++繼承的一個(gè)特性。提高了類之間的耦合性(繼承的缺點(diǎn),耦合度高就會造成代碼之間的聯(lián)系越緊密,代碼獨(dú)立性越差)。
繼承關(guān)鍵字
繼承可以使用extends和implements這兩個(gè)關(guān)鍵字來實(shí)現(xiàn)繼承,而且所有的類都是繼承于java.lang.Object,當(dāng)一個(gè)類沒有繼承的兩個(gè)關(guān)鍵字,則默認(rèn)繼承object(這個(gè)類在 java.lang 包中,所以不需要 import)祖先類。
extends關(guān)鍵字
在Java中,類的繼承是單一繼承,也就是說,一個(gè)子類只能擁有一個(gè)父類,所以extends只能繼承一個(gè)類。
implements關(guān)鍵字
使用implements關(guān)鍵字可以變相的使java具有多繼承的特性,使用范圍為類繼承接口的情況,可以同時(shí)繼承多個(gè)接口(接口跟接口之間采用逗號分隔)。
super 與 this 關(guān)鍵字
**super關(guān)鍵字:**我們可以通過super關(guān)鍵字來實(shí)現(xiàn)對父類成員的訪問,用來引用當(dāng)前對象的父類。
**this關(guān)鍵字:**指向自己的引用。
final關(guān)鍵字 final 關(guān)鍵字聲明類可以把類定義為不能繼承的,即最終類;或者用于修飾方法,該方法不能被子類重寫:
聲明類:
final class 類名 {//類體}
聲明方法:
**注:**實(shí)例變量也可以被定義為 final,被定義為 final 的變量不能被修改。被聲明為 final 類的方法自動地聲明為 final,但是實(shí)例變量并不是 final
構(gòu)造器
子類是不繼承父類的構(gòu)造器(構(gòu)造方法或者構(gòu)造函數(shù))的,它只是調(diào)用(隱式或顯式)。如果父類的構(gòu)造器帶有參數(shù),則必須在子類的構(gòu)造器中顯式地通過 super 關(guān)鍵字調(diào)用父類的構(gòu)造器并配以適當(dāng)?shù)膮?shù)列表。
如果父類構(gòu)造器沒有參數(shù),則在子類的構(gòu)造器中不需要使用 super 關(guān)鍵字調(diào)用父類構(gòu)造器,系統(tǒng)會自動調(diào)用父類的無參構(gòu)造器。
代碼分析
只創(chuàng)建了一個(gè)子類對象,父類對象沒有創(chuàng)建
不會創(chuàng)建父類對象,但是會為父類的私有屬性在堆中開辟空間,四個(gè)字節(jié),會默認(rèn)初始化為0
但這個(gè)空間不屬于父類對象,也不屬于子類對象,而是和定義這個(gè)屬性的父類做動態(tài)綁定
構(gòu)造方法執(zhí)行結(jié)束后,對象也就創(chuàng)建結(jié)束了
/**子類新增方法*/public void Bark(){ //方法空間//this.weight=20;this.sex=false;System.out.println("Wang~~Wang~~~"); } }//測試類
public class MyDog{ //加載到方法區(qū)的類代碼區(qū)private static Animal myAnimal; //靜態(tài)綁定,加載Animal字節(jié)碼文件//方法區(qū)的靜態(tài)數(shù)據(jù)區(qū)創(chuàng)建Animal類的靜態(tài)變量,默認(rèn)初始化nullpublic static void main(String args[]){ myAnimal=new Dog(); //對象的上轉(zhuǎn)型 //Dog對象父類Animal類的變量,父類不知道子類有新增的屬性和方法 //有在方法區(qū)的靜態(tài)數(shù)據(jù)區(qū)myAnimal.setWeight(50); ///調(diào)用myAnimal所指對象的setWeight方法,現(xiàn)在子類中尋址沒有,再到綁定的Animal類中綁定的setWeight方法System.out.println("My Dog's Weight is"+myAnimal.getWeight());//myAnimal.weight=100;// myAnimal.Bark();//Dog dog=new Dog();//dog.Bark();} }總結(jié):
創(chuàng)建子類對象時(shí)
1、先為父類中被子類繼承的sex屬性開辟空間,默認(rèn)初始化false
2、再為子類新增的屬性age開辟空間,4個(gè)字節(jié),初始化為0
3、為父類定義的被子類繼承的方法getWeight(),setWeight(int)開辟空間
4、為子類新增的方法Bark()開辟空間
此使就有了一個(gè)dog類型的this指針
? 只要屬性和方法在父類中定義,即使能被子類繼承或者不被繼承,都要和父類做動態(tài)綁定,方法getWeight(),setWeight(int),屬性sex,weight都和父類做了動態(tài)綁定
總結(jié)
以上是生活随笔為你收集整理的Java基础三个排序详解_继承粗解语法关键字分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于单片机的数控直流电流源设计
- 下一篇: java美元兑换,(Java实现) 美元