Java基础_数组


一、数组

同一种类型数据的集合,也就是一个容器。

声明:

1.元素类型[]数组名 = new元素类型[元素个数]

例:int[] arr = new int[5];

2.元素类型数组名[]  = new元素类型[元素个数]

例:int arr[] = new int[5];

3.元素类型[]数组名 = new元素类型[]{元素1,元素2,元素3......}

例:int[] arr =new int[]{1,2,3,4};

         int[] arr={1,2,3,4}

注:

JAVA中推荐用:类型[]数组名;

一个数组是一个对象

声明一个数组没有创建一个对象

声明时不用指定长度

 

创建基本数据类型数组:int[] i = new int[2];

创建引用数据类型数组:Student[] s = new Student[100];

数组创建后其中的元素有初始值

                            类型                    黙认值

                            byte                           0

                            short                          0

                            int                              0

                            long                           0l

                            float                          0.0f

                            double                       0.0d

                            char                          \u0000

                            boolean                     false

                            reference types           null

                   注:

                            创建时一定要指定长度

                            int[] i2=new int[];      //error

 

Java程序在运行时,需要在内存中分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

 

栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。

堆内存:

1.       数组和对象,通过new建立的实例都是存放在堆内存中。

2.       每一个实体都有默认初始化值。

3.       实体中的变量都有默认初始化值。

4.       实体不在被使用,会在不确定的时间内被垃圾回收器回收。

栈内存:自动释放。堆内存:垃圾回收机制。

Java的垃圾回收:

         由一个后台线程gc进行垃圾回收

         虚拟机判定内存不够的时候会中断代码的运行,这时候gc才进行垃圾回收

         缺点:不能够精确的去回收内存

         java.lang.System.gc();     建议回收内存,但系统不一定回应,他会先去看内存是否够用,够用则不予理睬,不够用才会去进行垃圾回收

         内存中什么算是垃圾:不在被引用的对象(局部变量,没有指针指向的)

 

二、数组的遍历

示例:

遍历数组

/*
遍历数组
*/
class Test
{
	public static void main(String[] args)
	{
		int[] arr={1,2,3,4,5,6,7};
		printArray(arr);//调用自定义函数
	}
	public static void printArray(int[] arr)//自定义遍历一维数组函数
	{
		for(int x=0;x<arr.length;x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.print(arr[x]);
		}
	}
}


 

三、获取数组中最大值和最小值

/*
获取一维数组中的最大值和最小值
*/
class ArrayTest 
{
	

	public static int getMax(int[] arr)//获取最大值函数
	{
		int max=0;
		for(int x=1;x<arr.length;x++)
		{
			if(arr[x]>arr[max])
				max=x;//存储最大值数组元素的脚标
		}
		return arr[max];
	}
	public static int getMin(int[] arr)//获取最小值函数
	{
		int min=0;
		for(int x=1;x<arr.length;x++)
		{
			if(arr[x]<arr[min])
				min=x; //存储最值数组元素的脚标
		}
		return arr[min];
	}
	
	public static void main(String[] args) 
	{
		int[] arr={1,3,2,5,5};
		System.out.println("max="+getMax(arr)+"\n"+"min="+getMin(arr));
	}
}


 

四、数组元素排序(选择排序)

/*
需求:选择排序
思路:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的
数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
*/
class ArrayTest2 
{
	public static void selectSort(int[] arr) //选择排序
	{
		for(int x=0;x<arr.length-1;x++)
		{
			for(int y=x+1;y<arr.length;y++)
			{	
				if(arr[x]>arr[y])//默认从小到大排序,需要从大到小排序,将“>”改为“<”
				{
					int temp=arr[x];
					arr[x]=arr[y];
					arr[y]=temp;
					
				}

			}
		 }
	}

	public static void printArray(int[] arr)//自定义遍历一维数组函数
	{
		for(int x=0;x<arr.length;x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.print(arr[x]);
		}
	}


	public static void main(String[] args) 
	{
		int[] arr={1,3,4,6,2,7,5};
		System.out.print("排序前:");//排序前
		printArray(arr);//调用打印函数

		System.out.print("\n排序后:");//排序后
		selectSort(arr);//调用排序函数
		printArray(arr);//排序后
	}
}


五、数组元素排序(冒泡排序)

/*
需求:冒泡排序
思路:
冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个
数比后一个数大(则升序,小则降序)则交换两数
*/
class ArrayTest2 
{
	
	public static void bubbleSort(int[] arr)//冒泡排序
	{
		for(int x=0;x<arr.length-1;x++)//控制冒泡次数
		{
			for(int y=0;y<arr.length-1-x;y++)//控制比较次数
			{
				if(arr[y]>arr[y+1])
				{
					int temp=arr[y];
					arr[y]=arr[y+1];
					arr[y+1]=temp;

				}
			}
		}
	}

	public static void printArray(int[] arr)//自定义遍历一维数组函数
	{
		for(int x=0;x<arr.length;x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.print(arr[x]);
		}
	}


	public static void main(String[] args) 
	{
		int[] arr={1,3,4,6,2,7,5};
		System.out.print("排序前:");//排序前
		printArray(arr);//调用打印函数

		System.out.print("\n排序后:");//排序后
		
		bubbleSort(arr);//调用冒泡排序函数
		printArray(arr);//排序后
	}
}


六、数组元素排序(位置置换功能抽取)

发现无论什么排序。都需要对满足条件的元素进行位置置换,所以可以把这部分代码提取出来,单独封装成一个函数。

/*
需求:冒泡排序
思路:
冒泡排序是经过n-1趟子排序完成的,第i趟子排序从第1个数至第n-i个数,若第i个
数比后一个数大(则升序,小则降序)则交换两数
*/
class ArrayTest2 
{
	public static void bubbleSort(int[] arr)//冒泡排序
	{
		for(int x=0;x<arr.length-1;x++)//控制冒泡次数
		{
			for(int y=0;y<arr.length-1-x;y++)//控制比较次数
			{
				if(arr[y]>arr[y+1])
				{
					swap(arr,y,y+1);
				}
			}
		}
	}

	public static void swap(int[] arr,int a,int b)//交换
	{
		int temp=arr[a];
		arr[a]=arr[b];
		arr[b]=temp;

	}

	public static void printArray(int[] arr)//自定义遍历一维数组函数
	{
		for(int x=0;x<arr.length;x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.print(arr[x]);
		}
	}


	public static void main(String[] args) 
	{
		int[] arr={1,3,4,6,2,7,5};
		System.out.print("排序前:");//排序前
		printArray(arr);//调用打印函数

		System.out.print("\n排序后:");//排序后
		bubbleSort(arr);//调用冒泡排序函数
		printArray(arr);//排序后
	}
}


 

技巧:引入import java.util.*;通过Arrays.sort();也可以进行数组排序。

 

七、折半查找

/*
数组元素的查找操作

*/
class ArrayTest3 
{
	public static void main(String[] args) 
	{
		int[] arr={2,3,4,6,8,64,78};
		//int index=getIndex(arr,2);//遍历查找

		//int index=halfSearch(arr,8);//折半查找方法1

		int index=halfSearch_2(arr,8);//折半查找方法2
		
		
		System.out.println("index="+index);
	}

	//折半查找,前提是数组元素是有序的。
	public static int halfSearch(int[] arr,int key)//方法1
	{
		int min,max,mid;
		min=0;
		max=arr.length-1;
		mid=(max+min)/2;

		while(arr[mid]!=key)
		{
			if(key>arr[mid])
			{	
				min=mid+1;
			}
			else if(key<arr[mid])
				{
					max=mid-1;
				}

			if(min>max)
				return -1;

			mid=(max+min)/2;
		}
		return mid;
	}

	
	public static int halfSearch_2(int[] arr,int key)//方法2
	{
		int min=0,max=arr.length-1,mid;
		while(min<=max)
		{
			mid=(max+min)/2;

			if(key>arr[mid])
			{
				min=mid+1;
			}
			else if(key<arr[mid])
			{
				max=mid-1;
			}
			else
				return mid;
		}
		return -1;
	}
	
	//定义功能,获取key第一次出现在数组中的位置。如果返回是-1,那么代表该key在数组中不存在。
	public static int getIndex(int[] arr,int key)
	{
		for(int x=0;x<arr.length;x++)
		{
			if(arr[x]==key)
				return x;
		}
		return -1;
	}
}


//练习:有一个有序的数组,想要将一个元素插入到该数组中,还要保证该数组是有序的。
	public static int getIndex_2(int[] arr,int key)
	{
		int min=0,max=arr.length-1,mid;
		while(min<=max)
		{
			mid=(max+min)/2;

			if(key>arr[mid])
			{
				min=mid+1;
			}
			else if(key<arr[mid])
			{
				max=mid-1;
			}
			else
				return mid;
		}
		return min;//返回要插入的具体位置

	}


八、十进制->二进制和十进制->十六进制

/*
十进制->二进制和十进制->十六进制
*/
class ArrayTest4 
{
	public static void main(String[] args) 
	{
		toBin(60);//十进制->二进制
		toHex(60);//十进制->十六进制
	}

	public static void toBin(int num)//十进制->二进制函数
	{
		StringBuffer sb=new StringBuffer();
		while(num>0)
		{
			sb.append(num%2);
			num=num/2;
		}
		System.out.println(sb.reverse());
	}

	public static void toHex(int num)//十进制->十六进制函数
	{
		StringBuffer sb=new StringBuffer();

		for(int x=0;x<8;x++)
		{
			int temp=num&15;
			if(temp>9)
			{
				sb.append((char)(temp-10+'A'));
			}
			else
			{
				sb.append(temp);
			}
			num=num>>>4;
		}
		System.out.println(sb.reverse());
	}

}


 

九、查表法进行十进制->十六进制和十进制->二进制

/*
查表法进行十进制->十六进制和十进制->二进制
*/
class ArrayTest5 
{
	public static void main(String[] args) 
	{
		toHex(60);
		toBin(60);
	}
	/*
		0 1 2 3 4 5 6 7 8 9 A  B  C  D  E  F  (十六进制中的元素)
		0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

		查表法:将所有的元素临时存储起来,建立对应关系。
		每一次&15后的值作为索引去查建立好的表,就可以找到对应的元素。

		可以通过数组的形式去定义。
	*/
	public static void toHex(int num)//查表法16进制
	{
		char[] chs={'0','1','2','3','4',
			        '5','6','7','8','9',
			        'A','B','C','D','E','F'
		           };//定义二进制表
		char[] arr=new char[8];//定义一个临时存储容器,元素默认值'\u0000'。
		int pos=arr.length;

		while(num!=0)
		{
			int temp=num&15;
			arr[--pos]=chs[temp];
			num=num>>>4;
		}
		for(int x=pos;x<arr.length;x++)
		{
			System.out.print(arr[x]);
		}
		System.out.println();//换行
	}

	public static void toBin(int num)//查表法2进制
	{
		char[] chs={'0','1'};//定义二进制表
        char[] arr=new char[32];//定义一个临时存储容器
		int pos=arr.length;

		while(num!=0)
		{
			int temp=num&1;
			arr[--pos]=chs[temp];
			num=num>>>1;
		}

		for(int x=pos;x<arr.length;x++)
		{
			System.out.print(arr[x]);
		}
		System.out.println();//换行
	}
}


 

十、进制转换优化

/*
进制转换优化
*/
class ArrayTest6 
{
	public static void main(String[] args) 
	{
		toBin(-3);
		toOctal(30);
		toHex(-20);
	}
	
	public static void toBin(int num)//十进制->二进制
	{
		trans(num,1,1);
	}
	
	public static void toOctal(int num)//十进制->八进制
	{
		trans(num,7,3);
	}

	public static void toHex(int num)//十进制->十六进制
	{
		trans(num,15,4);
	}

	public static void trans(int num,int base,int offset)
	{
		if(num==0)
		{
			System.out.println(0);
			return;
		}

		char[] chs={'0','1','2','3','4',
			        '5','6','7','8','9',
			        'A','B','C','D','E','F'
		           };
		char[] arr=new char[32];//默认值'\u0000'
		int pos=arr.length;

		while(num!=0)
		{
			int temp=num&base;
			arr[--pos]=chs[temp];
			num=num>>>offset;
		}
		for(int x=pos;x<arr.length;x++)
		{
			System.out.print(arr[x]);
		}
		System.out.println();//换行
	}
}


十一、         二维数组

 (其实是一个一维数组,它的每一个元素又是一个一维数组)

                   int[][] i1 = new int[2][3];

                   int[][] i4 = {{1,1,1},{2,2,2},{3,3,3}};

                   int[][] i3 = new int[][3];               //不允许高维没分配空间而先给低维分配空间

                   int[][] i2 = new int[2][];

                   i2[0] = new int[2];

                   i2[1] = new int[3];    

 

 

注意:

int[] x,int x[];//一维

int[][]y;int y[][]; int[] y[];//二维

 

int[] x,y[];//x一维,y二维

也就是:

int[] x;

int[] y[];

 

1.x[0]=y;//error

2.y[0]=x;//yes

3.y[0][0]=x;//error

4.x[0][0]=y;//error

5.y[0][0]=x[0];//yes

6.x=y;//error

 

练习:

/*
二维数组遍历

*/
class ArrayTest7
{
	public static void main(String[] args) 
	{
		int a[][]=new int[][]{{1},{1,2},{1,2,3},{1,2,3,4}};//定义二维数组
		for(int i=0;i<a.length;i++)
		{	for(int j=0;j<a[i].length;j++)
			{
				System.out.print(a[i][j]);
			}
			System.out.println();//换行
		}
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值