數組:
同一類型資料的集合,即一種容器。
定義方式:
int[] atrr = new int[5];//int 型數組 數組名arr ,new動态開辟 int[5],數組大小為5,隻能存放5個元素,
下标0-4
數組定義後在記憶體中的基本分布:
記憶體的劃分:
1.寄存器 -> CPU
2.本地方法區,與所在系統相關
3.方法區
4.棧記憶體:
存儲的都是局部變量,且變量所屬的作用域一旦結束,目前變量就會自動釋放,是以
棧記憶體更新速度很快,因為棧内變量的生命周期都很短(結束就釋放)。
例如:局部代碼塊,其限定局部變量的生命周期,在某些大程式裡,main函數不結束
其中的變量就不釋放,是以引用局部代碼塊。
示例代碼:
[html]
view plain
copy
import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;
public class Main
{
public static void main(String[] args)
{
int[] arr = new int[6];
System.out.println(arr[1]);
{//局部代碼塊,在{}中age有效,{}執行玩age自動釋放
int age = 3;
System.out.println(age);
}
System.out.println();
}
}
5.堆記憶體:、
堆中存儲的是對象(數組),凡是new建立的都在堆中,堆不會随時釋放,堆中存儲實體,實體中裝載資料,資料中一個損壞,其他的資料依然可以用。而棧一個資料損壞,其他的都不使用
特點:
1.堆中每一個實體都有首位址值。
2.堆記憶體中每一個局部變量都有預設的初始化值,根據類型的不同,初始化值也不同,例如:int型是0,float 是0.0f\0.0,boolean 是false,char 比較特殊 '\u0000',\u 轉義,unicode
3.釋放方式:垃圾回收機制
如圖: x = y;
null:
當不想使用arr實體時,arr是數組,若想讓arr不做任何實體指向,arr = null,但是堆不會釋放arr的位址,
将其視作垃圾。堆裡面的垃圾是在不定時自動回收垃圾,故java在記憶體管理方面優于C++。
int[] arr = new int[]{1,1,1,1,1,1};
arr = null;//當引用型變量沒有任何實體指向時,還引用該實體,就會引發異常
System.out.println(arr[2]);
數組使用小練習:
int[] arr = new int[5];
int [] b = new int[5];
arr[0] = 5;
b[0] = 6;
b[3] = 15;
System.out.println("arr[0] = "+arr[0]);
System.out.println("arr[3] = "+arr[3]);
arr = b;//更改arr的指向
System.out.println("b[3] = "+b[3]);
System.out.println("b[0] = "+b[0]);
b = null;//b無指向
//System.out.println("b[3] = "+b[3]);以視為垃圾
//System.out.println("b[0] = "+b[0]);
使用數組容易遇見的小問題
System.out.println(arr);//[I@15db9742,15db9742是arr存儲的哈希值,[->數組,I -> int型
//是以,在我們不知道,目前實體是什麼類型的實體時,就可以直接目前該實體的名字
數組的另一種定義方式:
格式2:已知數組元素,隻是需要一個容器來存儲
// int[] b = new int[]{1,2,3,4,5};同下
int b[] = {1,2,1,3,4,7,8,9,4,1,2,5,6,7,4,5,1,2,3,6};//同上
int len = b.length;
for(int i = 0;i<len;i++)
{
System.out.println("b["+i+"]= "+b[i]);
數組練習:
進制轉換
import java.awt.print.Printable;
import java.util.Arrays;
import java.util.Scanner;
import javax.swing.text.DefaultEditorKit.InsertBreakAction;
/* 需求:
* 擷取一個整數的X進制的表現形式
* */
Scanner cin = new Scanner(System.in);
int num = cin.nextInt();
int ary[] = new int[8];
getx(num,ary,15,4);//16進制
System.out.println("16進制表現形式如下:");
print(ary);
int bry[] = new int[12];
int num1 = cin.nextInt();
getx(num1,bry,7,3);//8進制
System.out.println("8進制表現形式如下:");
print8(bry);
System.out.println("6的2進制表現形式如下:");
System.out.println(Integer.toBinaryString(6));
System.out.println("-6的2進制表現形式如下:");
System.out.println(Integer.toBinaryString(-6));
cin.close();
public static void print(int[] ary)
int i;
for(i = 7;i>=0;i--)
if(ary[i]!=0)
break;
for(int j = i;j>=0;j--)
if(ary[j]>9)
switch (ary[j])
{
case 10:System.out.print("A");
case 11:System.out.print("B");
break;
case 12:System.out.print("C");
case 13:System.out.print("D");
case 14:System.out.print("E");
case 15:System.out.print("F");
default:
}
else {
System.out.print(ary[j]);;
public static void print8(int bry[])
for(i = 10;i>=0;i--)
if(bry[i]!=0)
System.out.print(bry[j]);
public static void getx(int num,int ary[],int mod,int wz)
int l = 0;
for(int i = 0;i<8;i++)
int t = num & mod;//16進制的最大值
ary[l++] = t;
num = num >>> wz;//4個二進制位表示一個16進制位
進制轉換示意圖
二維數組:
定義一維數組:
int a[] = new int[5];
是以定義二維數組 同一維數組
定義方式1:
int arr[][] = new int[3][2];//數組初始null,元素的初始值都是0
這個二維數組,這個二維數組中有3個一維數組,每個一維數組有2個元素
定義方式2:
int arr[][] = new int[4][];
arr[0] = new int[5];
arr[1] = new int[3];
arr[2] = new int[8];
arr[2] = new int[1];
這個二維數組,有4個一維數組,數組[0] 中有5個元素,數組[1] 中有3個元素.....
列印二維數組中的下标為1的一維數組的下标為1的元素:System.out.print(arr[1][1]);
System.out.print(arr);//[[I@15db9742:@左邊是數組的類型,右邊是實體在記憶體中存儲的哈希值
int len = arr.length;一維數組的個數
int len1 = arr[0].length;一維數組元素的個數
int arr[][] = {{1,1},{1,2,3},{6,5,4,7,8,2}};
for(int i = 0;i<arr.length;i++)
for(int j = 0;j<arr[i].length;j++)
System.out.print(arr[i][j]+" ");
System.out.println();
二維數組的使用場景:
隻有一點,視情況而定,有明顯的層次感資料問題,比如銷售員不同月份的銷售額