黑馬程序員-javaSE學習之內存詳解與數組

------- android培訓java培訓、期待與您交流! ----------

一、 內存詳解

內存的劃分:

①寄存器

②本地方法區

③方法區

④棧內存:存儲的都是局部變量。而且變量的作用域一旦結束,該變量就自動釋放。

注意:棧中一般存放基本數據類型的內容以及數組和對象的地址

⑤堆內存:存儲的是數組和對象(其實數組就是對象)。凡是new建立的都在堆中。堆中一般存放數組和對象的內容

特點:

            1.每一個實體(數組和對象)都有首地址值。

            2.對內存中每一個變量都有默認初始值。根據類型的不同而不同。整數0,小數0.0或者0.0f,boolean是false,char是‘\u0000’。\u代表但是是unicode碼四個0代表兩個字節。對於棧內存以及堆內存的原理剖析圖如下所示:。

3.垃圾回收機制


 數組存儲原理圖以及棧內存與堆內存詳解

當對於將數組a[3]的首地址賦值爲null,此時a[3]中就沒有了內容。對於堆中存留下來的已經不再使用的地址爲0x123的內存的內容,我們稱之爲垃圾,java中有固定的垃圾回收機制,能夠將堆內存中的垃圾清理掉。


二、數組

2.1 數組的定義

格式1:
     元素類型[] 數組名 = new 元素類型[元素個數或數組長度];
             示例:int[] arr = new int[5];
格式2:
     元素類型[] 數組名 = new 元素類型[]{元素,元素,……};
             示例:int[] arr = new int[]{3,5,1,7};
                      int[] arr = {3,5,1,7};

2.2 數組常見操作

數組中的常見操作包括遍歷,最值,排序(選擇和冒泡),折半查找。現有如下案例:

           ①找出一個任意二維數組的最大值,最小值

           ②將一個二維數組的每一行前後倒置

           ③用冒泡排序、選擇排序、插入排序等排序方法來將一個一維數組排序。

 ①:找出一個任意二維數組的最大值,最小值,代碼如下所示:

public class Array{
    public static void main(String[] args){
         int[][] a=new int[3][4];
         for(int i=0;i<3;i++){
             for(int j=0;j<4;j++){
             a[i][j]=(int)(Math.random()*10);//Math.random()是獲取在0和1之間的任意的
//一個類似0.1的小數,當乘以10後,就能夠獲取從0到9的數字。
}         
}
             System.out.println("這個二維數組是:");   
             for(int i=0;i<3;i++){
             for(int j=0;j<4;j++){
             System.out.print(a[i][j]+" ");
}         
             System.out.println();
}                    
             int max,min,t;
             max=a[0][0];min=a[0][0];
             for(int i=0;i<3;i++){
             
             for(int j=0;j<4;j++){
             if(max<a[i][j]){
             t=max;
             max=a[i][j];
             a[i][j]=max;
}
             if(min>a[i][j]){
             t=min;
             min=a[i][j];
             a[i][j]=min;
}
              
}         
}
             System.out.println("最大的數是"+max);
             System.out.println("最小的數是"+min);
}
}

②將一個二維數組的每一行前後倒置,代碼如下:

public class Array2{
    public static void main(String[] args){
         int[][] a=new int[3][4];
         for(int i=0;i<3;i++){
             for(int j=0;j<4;j++){
             a[i][j]=(int)(Math.random()*10);
}         
}
             System.out.println("這個二維數組是:");   
             for(int i=0;i<3;i++){
             for(int j=0;j<4;j++){
             System.out.print(a[i][j]+" ");
}         
             System.out.println();
}                    
             System.out.println("這個前後倒置後的二維數組是:");
             for(int i=0;i<3;i++){
             for(int j=3;j>=0;j--){
             System.out.print(a[i][j]+" ");         
}  
             System.out.println();       
}
}
}

③用冒泡排序、選擇排序、插入排序等排序方法來將一個一維數組排序。

public 	class Sort{

    public static void main(String[] args){
    int []a=new int[]{12,3,54,23,12,8,24};
    int []b=new int[]{12,3,54,23,12,8,24}; 
    System.out.println("沒有經過排序前的數組是:");
    for(int i=0;i<a.length;i++){
    System.out.print(a[i]+" ");
}
    System.out.println();
    System.out.println("經過選擇排序後的數組是:");
    SelectSort(a);
    for(int i=0;i<a.length;i++){
    System.out.print(a[i]+" ");
}
    System.out.println();
    System.out.println("經過冒泡排序後的數組是:");
    BubbleSort(b);
    for(int i=0;i<a.length;i++){
    System.out.print(a[i]+" ");
}
}
    //選擇排序法
    public static void SelectSort(int []a){
    int temp;
    int []b=a;
    for(int i=0;i<b.length;i++){
    int min=b[i];
        for(int j=i+1;j<b.length;j++){
        if(min>b[j]){
        temp=min;
        min=b[j];
        b[j]=temp;
}
   b[i]=min;
}
}
    
}
   //冒泡排序
   public static void BubbleSort(int []a){
   int temp;
    int []b=a;
    for(int i=0;i<b.length;i++){
        for(int j=0;j<b.length-i-1;j++){//假設有7個數,則比較的次數應該是7-1=6次。
        if(b[j]>b[j+1]){
        temp=b[j+1];
        b[j+1]=b[j];
        b[j]=temp;
}
}
}
}
}

④折半查找:給定一個有序的數組,輸入一個數,查找該數組中有沒有這個數。

import java.util.*;
public class HalfLook{
   public static void main(String[] args){
       int []a=new int[]{2,6,9,12,17,24};
       Scanner sc=new Scanner(System.in);
       int x=sc.nextInt();
       System.out.println("您輸入的數是:"+x);
       Look(x,a);
       HalfLook(x,a);

}
   //簡單的查找:將輸入的一個數插入到一個有序數組中。
   public static void Look(int x,int []a){
   int []b=a;
   int temp=0;
   int y=x;
   for(int i=0;i<b.length-1;i++){
      if(y==b[i]){
      temp=1;
      System.out.print(y+"這個數存在!");
}
}
    if(temp==0){
    System.out.print(y+"這個數不存在!");
}
}
   public static void HalfLook(int x,int []a){
   int []b=a;
   int y=x;
   int min=0;
   int max=b.length-1;
   int mid=(max+min)/2;
   while(b[mid]!=y && max!=min){
   if(y>b[mid]){
   min=mid+1;
}  if(y<b[mid]){
   max=mid-1;
}
   mid=(max+min)/2;
}
   if(b[mid]==y){
   System.out.println(y+"這個數存在數組中!:");
}  else{
   System.out.println(y+"這個數不存在數組中!:");
}
}
}










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章