------- 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 數組的定義
示例: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+"這個數不存在數組中!:");
}
}
}