黑马程序员-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+"这个数不存在数组中!:");
}
}
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值