----------- android 培训 、 java培训 、java学习型技术博客、期待与您交流!------------
一、概念
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
特点:
1.能够装多个元素.
2.元素类型必须是同一类型,可以基本数据类型(四类八种),也可以使引用数据类型(类,接
二、一维数组
数组初始化概述:
Java中的数组必须先初始化,然后才能使用。
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
数组的初始化方式
动态初始化:指定数组的长度,系统数组赋默认值
格式:
数据类型[] 数组名 = new 数据类型[长度];
举例:
int[] arr = new int[3];
解释:
int[]:定义了一个装int类型数据的数组
arr : 数组名
new : 本质在内存中开辟了一片空间.
int[3]: 表示数组的长度,也就是装元素的个数
使用数组中元素
格式:数组名[索引值];
举例:arr[0],表示的数组中第一个元素
索引:在数组中的元素的编号,从0开始,直到数组的长度-1
演示用例:
public static void main(String[] args){
//数组动态初始化
int[] arr = new int[3];
System.out.println(arr); //[I@175078b
System.out.println(arr[0]); //0
System.out.println(arr[1]); //0
System.out.println(arr[2]); //0
System.out.println("------------");
arr[0]=3;
arr[1]=6;
arr[2]=9;
System.out.println(arr[0]); //
System.out.println(arr[1]); //
System.out.println(arr[2]); //
}
其中:new是用来在堆内存中产生一个容器实体。
数组也被称为引用数据类型。在内存中的分配如下图:
数组内存图
数组的静态初始化:指定元素的值,系统会分配长度
格式:
数据类型[] 数组名= new 数据类型[]{元素1,元素2...};
int[] arr = new int[]{1,2,3};
简化格式:
数据类型[] 数组名 = {元素1,元素2...};
int[] arr = {1,2,3};//静态初始化数组
//静态初始化数组
// int[] arr = new int[]{1,2,3};
int[] arr = {1,2,3};
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
注:1、System.out.println(arr);得到的结果是一个哈希值,也叫地址值。
2、数组在堆内存开辟空间后,就有默认的初始化值。如:int默认0;boolean默认false。
内存小知识:
Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存:1、数组和对象,通过new建立的实例都存放在堆内存中。
2、每一个实体都有内存地址值。
3、实体中的变量都有默认初始化值。
4、实体不在被使用,会在不确定的时间内被垃圾回收器回收。
三、数组操作常见问题
1、数组脚标越界异常(ArrayIndexOutOfBoundsException)。例:
int[] arr = new int[2];
System.out.println(arr[3]);
访问到了数组中的不存在的脚标时发生。
2、空指针异常(NullPointerException)。例:
int[]arr = null;
System.out.println(arr[0]);
arr引用没有指向实体,却在操作实体中的元素时。
四、二维数组
其实二维数组其实就是一个元素为一维数组的数组。
格式1
数据类型[][] 变量名 = new 数据类型[m][n];
m表示这个二维数组有多少个一维数组
n表示每一个一维数组的元素个数
举例:
int[][] arr = new int[3][2];
定义了一个二维数组arr
这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
每个一维数组有2个元素,可以通过arr[m][n]来获取
表示获取第m+1个一维数组的第n+1个元素
格式2
数据类型[][] 变量名 = new 数据类型[m][];
m表示这个二维数组有多少个一维数组
这一次没有直接给出一维数组的元素个数,可以动态的给出。
注:此种格式中每个一维数组都是默认初始化值null。
格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
简化版格式:
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
注:一种特殊定义写法:int[]x,y[]; x是一维数组,y是二维数组。
二维数组在内存中的分配情况示例:
五、数组常见操作
遍历数组,在控制台输出数组中的元素
数组长度属性 length
格式 : 数组名.length ,表示的就是数组长度,元素的个数.
两个明确:
返回值类型: void类型
参数列表:
类型:int[]
个数:1
public static void printArray(int[] arr){
for (int x=0; x<arr.length; x++){
System.out.println(arr[x]);
}
数组获取最值(获取数组中的最大值)
两个明确:
返回值类型: int
参数列表:
类型:int[]
个数:1
public static void main(String[] args){
//定义数组
int[] arr = {11,22,88,107,33,44,55};
int max = getMax(arr);
System.out.println("数组中的最大值为:"+ max);
}
public static int getMax(int[] arr){
int max = arr[0]; //定义变量,可以使用第一个元素作为初始值;
for (int x = 1; x< arr.length ; x++){ //遍历数组
if (max < arr[x]){ //比较
max = arr[x]; //给max 赋值
}
}
return max;
}
数组查表法(根据指定索引,查找对应星期)
两个明确:
返回值类型:String
列表:
类型:int,String[](指的就是表)
个数:2
public static void main(String[] args){
String[] week = {"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
String w = getWeek(0,week);
System.out.println("您要查找的星期为:" + w);
}
public static String getWeek(int a, String[] arr){
if (a >0 && a <8){ //处理a,判断
return arr[a-1];
}
return "您输入的数据不合理!";
}
数组元素查找(查找指定元素第一次在数组中出现的索引)
1.遍历数组
2.比较 指定元素 跟 数组元素 比较
如果相等,返回该元素索引, return
如果不等,不管 ,继续遍历
3.返回索引
import java.util.Scanner;
class ArrayDemo{
public static void main(String[] args){
//定义数组
int[] arr = {11,22,33,44,55,11};
int num = getNum(); //调用录入方法,接收数据
int index = getIndex(arr,num); //调用获取方法,并将获取的值赋给定义的变 量
System.out.println("指定元素的索引为:"+ index);
}
public static int getIndex(int[] arr,int num){ //定义获取索引方法
int index = -1;
for (int i = 0;i<arr.length ;i++ ){
if (num==arr[i]){
index = i;
break;
}
}
return index;
}
public static int getNum(){ //定义键盘录入方法
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
return num;
}
}
数组元素反转(就是把元素对调)
public static void main(String[] args){
int[] arr = {11,22,33,44,55,11}; //定义数组
sop(arr); //调用输出方法
reverse(arr); //调用反转方法
}
public static void reverse(int[] arr){ //定义反转方法
int max = arr.length-1; //定义尾指针
int min = 0; //定义头指针
int temp; //定义变量
while (max > min){ //判断,头指针小于于尾指针说明尚未反转完
temp = arr[min] ;
arr[min] = arr [max];
arr[max] = temp; //交换元素,第三方变量法
min++;
max--;
}
sop(arr);
}
public static void sop(int[] arr){ //定义输出方法,遍历数组
for (int i = 0;i < arr.length ;i++ ){
System.out.print(arr[i]+"\t");
}
System.out.println();
}
}
数组排序:
选择排序:
1、先用0角标上的元素依次与其他元素进行比较,将较小值元素存放到0角标。
2、然后再拿1角标上的元素依次进行比较,以此类推。
class SortDemo{
public static void main(String[] args){
int[] arr = {1,3,4,2,9,8,5,7,6}; //定义数组
sop(arr); //排序前打印
selectSort(arr); //调用排序方法
sop(arr); //排序后打印
}
public static void selectSort(int[] arr){
int temp = 0; //定义一个第三方变量,初始值为0
for (int i = 0;i < arr.length-1 ;i++ ){ //遍历数组,因为到最后,末尾一定最大,所以长度-1
for (int j =i+1 ;j<arr.length ;j++ ){//比较大小
if (arr[i]>arr[j]){ //判断是否满足条件
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp; //采用第三方变量交换数据
}
}
}
}
public static void sop(int[] arr){ //输出方法
for (int i = 0;i<arr.length ;i++ ){
System.out.print(arr[i]+"\t");
}
System.out.println();
}
}
冒泡排序:
1、先从头角标相邻两个元素之间进行比较,将较大值存放在后一个元素中,
然后再与后一个元素的进行比较,直至最大值存放到最后一个元素中。
2、再重复1操作,每次计较次数减一,一圈比完后存放的较大元素不再参与比较。
class SortDemo{
public static void main(String[] args){
int[] arr = {1,3,4,2,9,8,5,7,6}; //定义数组
sop(arr); //排序前打印
bubbleSort(arr); //调用排序方法
sop(arr); //排序后打印
}
public static void bubbleSort(int[] arr){
int temp = 0;
for (int i = 0;i < arr.length-1 ;i++ ){
for (int j =0 ;j<arr.length-i-1 ;j++ ){ //-x让每一次比较的元素减少
if (arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp; //第三方变量,元素呼唤
}
}
}
}
public static void sop(int[] arr){ //输出方法
for (int i = 0;i<arr.length ;i++ ){
System.out.print(arr[i]+"\t");
}
System.out.println();
}
}
折半查找
import java.util.Scanner;
class SearchDemo{
public static void main(String[] args){
int[] arr = {1,2,3,4,5,6,7,8,9}; //定义数组
System.out.println("请输入您要查询的数据:");
int num = getNum();
int res = HalfSearch(arr,num); //调用排序方法
System.out.println(res);
}
public static int HalfSearch(int[] arr,int num){
int min = 0;
int max = arr.length-1;
int mid ;
while(min<max){
mid=(max+min)/2;//折半操作
if(num>arr[mid])
min=mid+1;
else if(num<arr[mid])
max=mid-1;
else
return mid;
}
return min;
}
public static int getNum(){ //键盘录入方法
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
return num;
}
}
进制转换
char[] arr = new char[8];
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]+",");
}
思考:
public static void main(String[] args){
int a = 10;
int b = 20;
System.out.println("a:"+a+",b:"+b); // a:10 , b:20
change(a,b);
System.out.println("a:"+a+",b:"+b); // ???? a:10, b:20
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[1]); // ???? 4 , 2
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------}
public static void change(int a,int b){
System.out.println("a:"+a+",b:"+b); // a:10, b:20
a = b; // a20
b = a + b; //b 40
System.out.println("a:"+a+",b:"+b); // a:20,b:40
}
public static void change(int[] arr){
for(int x=0; x<arr.length; x++){
if(arr[x]%2==0){ // 说明元素为偶数, 扩大两倍
arr[x]*=2;
}
}
}
传递基本数据类型时,形参的改变对实际参数无影响
传递引用数据类型时,形参的改变对实际参数无影响