Java数组
数组概述:
数组是存储多个变量(元素)的容器;
这多个变量的数据类型要一致;
定义格式:
数据类型 [] 数组名;(推荐使用)
int[] arr; 定义了一个int类型的数组,数组名是arr。
数据类型 数组名 [];
int arr[]; 定义了一个int类型的变量,变量名是arr数组。
数组初始化:
数组初始化,其实就是为数组开辟内存空间,并为数组中的每个元素赋予初始值。
a:动态初始化; 只给出长度,由系统给出初始化值。
b:静态初始化; 给出初始化值,有系统决定长度。
动态初始化:
int[] arr = new int[5]; //new为数组开辟内存空间,int[3]表示数组长度
打印:arr --> [I@1b6d3586 -->表示在内存中地址(用于寻址)
通过 arr[i]进行数组元素的取值。
赋值方式: arr[0] = x;
静态初始化:
int[] arr = {1,2,3};
int[] arr = new int[]{1,2,3};
Java中的内存分配方式
Java中内存分配:
1.栈:(存储的是局部变量)
2.堆:(存储的是new出来的东西)
3.方法区:(面向对象部分讲解)
4.本地方法区:(和系统相关)
5.寄存器:(给CPU使用)
栈:
a:存储的是局部变量。
b:局部变量就是定义在方法中的变量。
c:使用完毕立即回收。
堆:
a:存储的是new出来的,实体,对象。
b:每个对象都有首地址值。
c:每个对象的数据都有默认值。
d:数据使用完毕后,会在垃圾回收器空闲的时候被回收
两个数组指向同一个堆内存
int [ ] arr1 = new int [ 3 ] ;
arr1[ 0 ] = 100 ;
arr1[ 1 ] = 200 ;
arr1[ 2 ] = 300 ;
int [ ] arr2 = arr1;
arr2[ 0 ] = 111 ;
arr2[ 1 ] = 222 ;
arr2[ 2 ] = 333 ;
System. out. println ( "arr1:" + arr1) ;
System. out. println ( "arr1[0]:" + arr1[ 0 ] ) ;
System. out. println ( "arr1[1]:" + arr1[ 1 ] ) ;
System. out. println ( "arr1[2]:" + arr1[ 2 ] ) ;
System. out. println ( "===============" ) ;
System. out. println ( "arr2:" + arr2) ;
System. out. println ( "arr2[0]:" + arr2[ 0 ] ) ;
System. out. println ( "arr2[1]:" + arr2[ 1 ] ) ;
System. out. println ( "arr2[2]:" + arr2[ 2 ] ) ;
System. out. println ( "===============" ) ;
数组两个常见小问题:
1.数组索引越界:java.lang.ArrayIndexOutOfBoundsException
(数组索引大于实际所以值)
2.空指针异常:java.lang.NullPointerException
(数组指向null,不再是指向堆数据,并按堆数据访问)
数组常见操作
1.数组遍历:
int[] arr = {11,22,33,44,55};
// for(int x=0,arr.x<arr.leng;x++)
for(int x=0,arr.x<=arr.leng-1;x++){
system.out.println(arr[x])
}
2.数组获取最值:
思路:找一个该数组的值作为参照物。
在这里插入代码片
public static void main ( String[ ] args) {
int [ ] arr = { 12 , 45 , 78 , 50 , 30 } ;
int max = arr[ 0 ] ;
int min = arr[ 0 ] ;
for ( int i= 1 ; i< arr. length; i++ ) {
if ( arr[ i] > max) {
max = arr[ i] ;
}
if ( arr[ i] < min) {
min = arr[ i] ;
}
}
System. out. println ( max) ;
System. out. println ( min) ;
数组练习:
需求:在编程竞赛中,有6个评委为选手打分,分数为0-100整数分。
选手的最后得分为:去掉一个最高分和最低分后4个评委的平均值。
public class Test09 {
public static void main ( String[ ] args) {
int [ ] arr = new int [ 6 ] ;
int sum = 0 ;
Scanner sc = new Scanner ( System. in) ;
for ( int i = 0 ; i <= arr. length - 1 ; i++ ) {
System. out. println ( "请6个评委打分打分" ) ;
arr[ i] = sc. nextInt ( ) ;
sum += arr[ i] ;
}
System. out. println ( "sum" + sum) ;
int max = arr[ 0 ] ;
for ( int i = 1 ; i < arr. length; i++ ) {
if ( max < arr[ i] ) {
max = arr[ i] ;
}
}
System. out. println ( "max" + max) ;
int min = arr[ 0 ] ;
for ( int i = 1 ; i < arr. length; i++ ) {
if ( min > arr[ i] ) {
min = arr[ i] ;
}
}
System. out. println ( "min" + min) ;
System. out. println ( ( sum- min- max) / ( arr. length- 2 ) ) ;
}
}
练习2:有一对兔子,从出生第3个月每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,假如兔子不死,
问第二十个月的兔子对数为多少?
规律:
第一个月: 1
第二个月: 1
第三个月: 2
第四个月: 3
第五个月: 5
public class Test09 {
public static void main ( String[ ] args) {
int [ ] arr = new int [ 20 ] ;
arr[ 0 ] = 1 ;
arr[ 1 ] = 1 ;
for ( int i= 2 ; i< arr. length; i++ ) {
arr[ i] = arr[ i- 1 ] + arr[ i- 2 ] ;
System. out. println ( arr[ i] ) ;
}
}
}
数组排序
冒泡排序
举例: int[] arr = {24,69,80,57,13};
排序后: arr = {13,24,57,69,80};
package com. scy10;
public class BubbleSort {
public static void main ( String[ ] args) {
int [ ] arr = { 24 , 69 , 80 , 57 , 13 } ;
sort ( arr) ;
printArray ( arr) ;
}
public static void sort ( int [ ] arr) {
for ( int j = 0 ; j < arr. length - 1 ; j++ ) {
for ( int i = 0 ; i < arr. length - j - 1 ; i++ ) {
if ( arr[ i] > arr[ i + 1 ] ) {
int temp = arr[ i] ;
arr[ i] = arr[ i + 1 ] ;
arr[ i + 1 ] = temp;
}
}
}
}
public static void printArray ( int [ ] arr) {
System. out. print ( "[" ) ;
for ( int i = 0 ; i< arr. length; i++ ) {
if ( i== arr. length- 1 ) {
System. out. print ( arr[ i] ) ;
}
else {
System. out. print ( arr[ i] ) ;
System. out. print ( ", " ) ;
}
}
System. out. print ( "]" ) ;
}
}