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