JAVA學習第四課(數組),java學習數組
數組:
同一類型資料的集合,即一種容器。
定義方式:
int[] atrr = new int[5];//int 型數組 數組名arr ,new動態開闢 int[5],數組大小為5,只能存放5個元素,
下標0-4
數組定義後在記憶體中的基本分布:
記憶體的劃分:
1.寄存器 -> CPU
2.本地方法區,與所在系統相關
3.方法區
4.棧記憶體:
儲存的都是局部變數,且變數所屬的範圍一旦結束,當前變數就會自動釋放,所以
棧記憶體更新速度很快,因為棧內變數的生命週期都很短(結束就釋放)。
例如:局部代碼塊,其限定局部變數的生命週期,在某些大程式裡,main函數不結束
其中的變數就不釋放,所以引用局部代碼塊。
範例程式碼:
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++。
import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;public class Main {public static void main(String[] args){int[] arr = new int[]{1,1,1,1,1,1};System.out.println(arr[1]);arr = null;//當引用型變數沒有任何實體指向時,還引用該實體,就會引發異常System.out.println(arr[2]);}}
數組使用小練習:
import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;public class Main {public static void main(String[] args){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("arr[0] = "+arr[0]);System.out.println("arr[3] = "+arr[3]);System.out.println("b[3] = "+b[3]);System.out.println("b[0] = "+b[0]);b = null;//b無指向System.out.println("arr[0] = "+arr[0]);System.out.println("arr[3] = "+arr[3]);//System.out.println("b[3] = "+b[3]);以視為垃圾//System.out.println("b[0] = "+b[0]);}}
使用數組容易遇見的小問題
import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;public class Main {public static void main(String[] args){int[] arr = new int[5];int [] b = new int[5];System.out.println(arr);//[I@15db9742,15db9742是arr儲存的雜湊值,[->數組,I -> int型//所以,在我們不知道,當前實體是什麼類型的實體時,就可以直接當前該實體的名字}}
數組的另一種定義方式:
格式2:已知數組元素,只是需要一個容器來儲存
public class Main {public static void main(String[] args){int[] arr = new int[5];//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;import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;/* 需求: * 擷取一個整數的X進位的表現形式 * */public class Main {public static void main(String[] args){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");break;case 11:System.out.print("B");break;case 12:System.out.print("C");break;case 13:System.out.print("D");break;case 14:System.out.print("E");break;case 15:System.out.print("F");break;default:break;}else {System.out.print(ary[j]);;}}System.out.println();}public static void print8(int bry[]){int i;for(i = 10;i>=0;i--){if(bry[i]!=0)break;}for(int j = i;j>=0;j--){System.out.print(bry[j]);}System.out.println();} 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進位位}}}
JAVA學習中數組這章該怎學
你現在只能說掌握熟悉一下。想運用自如的話 只能等你以後做些小項目或
寫點小程式用到的時候 才會領悟到的。
你簡單點就把它當成一個可以裝很多值的盒子,而這個盒子裝東西
是有順序的。
所以從盒子裡面拿東西(也就是取值)出來就需按照指定的“索引”來取。
就算現在不懂也沒關係,只要你知道有這個東西就可以了。我原來學的時候也不知道 學完還忘記了。 不過過了一段時間 用到的時候 就領悟了。
java中有數組a{1,2,3,4}與數組b{3,4,5},現在需要對b數組進行更新同步
按你的要求, 最後b中的元素肯定和a中的元素相同, 但是你又不允許直接把a中的元素賦給b中
下面的代碼可以實現, 你自己看吧, 有注釋
import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class Test { /** * @param args */ private List<Integer> asList(int[] i) { List<Integer> list = new ArrayList<Integer>(); for (int t : i) { list.add(t); } return list; } public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); int[] a = { 1, 2, 3, 4}; int[] b = { 3, 4, 5 }; List<Integer> listA = t.asList(a); List<Integer> listB = t.asList(b); for (int i : listA) {//遍曆a, 對於a中每個元素 if(!listB.contains(i)){//如果b中沒有, 添加到b中 listB.add(i); } } for(Iterator<Integer> it = listB.iterator(); it.hasNext();){//遍曆b中的每個元素 int i = it.next(); if(!listA.contains(i)){//如果a中沒有, 從b中刪除 it.remove(); } } System.out.println("a : " + listA); System.out.println("b : " + listB); }}