数组(array)
大纲
数组是什么
概述
变量 : 存储单个数据数组 :
数组 : 存储多个数据
一段连续的内存空间,是一个线性序列
相同数据类型数据的有序集合
数组的特点
-
引用数据类型 -> 对象数据
基本数据类型 -> 数据值
-
定长,长度一旦确定不可改变
-
存储所有数据要求类型一致相同
-
有序,下标|索引,从0开始每次+1,根据索引精确的区分每一个空间(数据)
-
数组中可以存储任意类型的数据
数组的数据存储
数组:可以存储多个值的容器。 很多其他存储多个值的集合底层都是使用数组的逻辑编写的。
数据结构: 数据存储的结构 + 算法 。
数据结构: 物理结构 + 逻辑结构
物层硬件或者是语言直接支持的
逻辑结构: 底层依然是数组或者是其他的存储结构,但是通过编码的方式将之改变,更加符合业务要求。
数据结构和算法是相辅相成的。优秀的数据结构是为了更好的服务于优秀的算法。优秀的算法的基础是建立在优秀的数据结构之上的。
通过连续的存储空间进行存储
- 数组的优势:方便查找,因为元素都在一块;
- 数组的劣势:一定程度上比较吃内存,要求内存的连续空间要足够大。
看到new关键词,做三件事
1: 开空间 在堆内存中开辟存储空间
2:初始化 给堆内存中的空间进行初始化动作
3.指向引用 将堆内存中的地址赋值给栈中的局部变量存储
数组的声明和使用
/*数组的定义
声明 : []
数据类型[] 数组名; --> 推荐
数据类型 数组名[];
初始化 :
动态初始化 : 先创建数组然后再赋值
数据类型[] 数组名 = new 数据类型[长度n];
数据类型 : 数据中存储数据的类型
可以为基本|引用数据类型
数组已创建没有赋值存在默认值 : 整数0 小数0.0 字符:空字符 布尔:false 引用数据类型:null
静态初始化 : 创建数组的同时赋值
数据类型[] 数组名 = new 数据类型[]{值列表}; -- >标准
数据类型[] 数组名 = {值列表}; --> 简化
数组的使用
数组名[索引]
*/
public class ArrayTest {
public static void main(String[] args) {
int[] arr1;//声明数组
boolean[] arr2;
String[] arr;
char[] arrChar;
arrChar = new char[5];//创建数组,动态初始化
arr = new String[3];//动态初始化
arr1 = new int[4];//动态初始化
arr2 = new boolean[2];
double[] arr3 = {1.1,3.3,5.5};//静态初始化简化
char[] arr4 = new char[]{'A','k'};//静态初始化标准
//设置数据
arr1[1] = 1;
arr[2] = "卡卡";
arr2[1] = true;
//获取数组中的数据
System.out.println(arr[0]);//默认值null
System.out.println(arr[2]);//卡卡
System.out.println(arr1[0]);//默认值0
System.out.println(arr1[1]);// 1
System.out.println(arr2[0]);//默认false
System.out.println(arr2[1]);//true
System.out.println(arr3[2]);// 5.5
System.out.println(arrChar[3]);//默认为空字符
System.out.println(arr4[0]);// A
}
}
数组的遍历
import java.util.Arrays;//导包
/*
遍历 :
1.for : 遍历的数组的索引,根据索引获取使用
2.foreach :
for(数据类型 变量:数组名|集合名){
变量存储的为数组中的每一个数据,顺序为从前到后
}
区别 :
遍历两个循环都可以实现
for操作索引,foreach无法操作索引
*/
public class ForTest {//遍历char类型的数组 依次输出每个数组元素
public static void main(String[] args) {
char[] ch = {'k','a','k','a'};//静态初始化数组
for (int i = 0; i < ch.length; i++) {//for循环遍历数组下标
System.out.println(ch[i]);//输出每一个值
}
System.out.println(Arrays.toString(ch));//输出数组的方法
for(char chars:ch){//for each 遍历数组
System.out.println(chars);
}
System.out.println(Arrays.toString(ch));//[k,a,k,a]
}
}
相关练习
public class ForTest {
public static void main(String[] args) {
char[] ch = {'k','a','k','a'};//静态初始化数组
flashback(ch);//调用方法
}
//A 倒叙输出数组元素
public static void flashback(char[] arr){
for (int i = arr.length-1; i >= 0 ; i--) {//从末位的下标索引开始
System.out.println(arr[i]);
}
}
}
public class GetMaxMinTest {
public static void main(String[] args) {
int[] arr = {3,5,7,1,9};
getMaxMin(arr);
}
//B: 最值:获取数组中的最大值和最小值
public static void getMaxMin(int[] arr){
int max = arr[0];//假设数组中第一个元素是最大值
int min = arr[0];//假设数组中第一个元素是最小值
for (int i = 0; i < arr.length; i++) {//for方法遍历数组
if(arr[i] >= max){//比较数组元素和max
max = arr[i];
}
if(arr[i] <= min){//比较数组元素和min
min = arr[i];
}
}
System.out.println("数组中最大值是"+max);
System.out.println("数组中最大值是"+min);
}
}
import java.util.Arrays;
public class GetMaxMinTest {
public static void main(String[] args) {
int[] arr = {3,5,7,1,9};
int[] mm = get(arr);
System.out.println(mm[0]);
System.out.println(mm[1]);
System.out.println(Arrays.toString(get(arr)));//输出数组结果
}
//B: 最值:获取数组中的最大值和最小值
public static void getMaxMin(int[] arr){
int max = arr[0];//假设数组中第一个元素是最大值
int min = arr[0];//假设数组中第一个元素是最小值
for (int i = 0; i < arr.length; i++) {//遍历数组
if(arr[i] >= max){//比较数组元素和max
max = arr[i];
}
if(arr[i] <= min){//比较数组元素和min
min = arr[i];
}
}
System.out.println("数组中最大值是"+max);
System.out.println("数组中最大值是"+min);
}
//B: 最值 方式二 用加强for返回数组
public static int[] get(int[] arr){
int max = arr[0];//假设数组中第一个元素是最大值
int min = arr[0];//假设数组中第一个元素是最小值
for(int i:arr){
if(i > max){
max = i;
}
if(i < min){
min = i;
}
}
return new int[]{max,min};
}
}
import java.util.Arrays;
/*
* C.将一个整型数组中的0去掉后但会一个新数组.
* 例如: int[] arr={1,26,0,8,10,50,8,0,7,35,0,4,3,20,0,17};
* 要求:将以上数组中的0去掉,将不为0的值存入一个新数组,生成新的数组作为返回值.
* int newArr={1,26,8,10,50,8,7,35,4,3,20,17};
*/
public class CheckZero {
public static void main(String[] args) {
int[] arr={1,26,0,8,10,50,8,0,7,35,0,4,3,20,0,17};
System.out.println(Arrays.toString(check(arr)));
}
//方法
public static int[] check(int[] arr){
int count = 0;//计数器,用来计算得到新数组长度
for(int i:arr){//通过加强for遍历数组得到不包括数值0的新数组长度
if(i != 0){
count++;//只要值不为0,长度加1
}
}
if(count == arr.length){//如果新数组长度和原来数组长度一样,说明没有0
return arr;//直接返回原数组即可
}
int[] newArr = new int[count];//声明初始化新数组和长度
int j = 0;
for (int a:arr) {
if(a != 0){//只要值不为0,就进行赋值
newArr[j++] = a;//赋值完毕,新数组的下标需要加一位
}
}
return newArr;//返回新数组
}
}
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] findArr = {3,6,0,1};
System.out.println(find(findArr,1));
char[] ch = {'A','b','1','B'};
System.out.println(Arrays.toString(change(ch)));
}
/*1数组元素查找*/
public static int find(int[] arr,int num){//形参需要一个数组,一个值;返回是序号的值
for (int i = 0; i < arr.length; i++) {//for循环遍历数组
if(arr[i] == num){
return i;//如果发现就返回下标
}
}
return -1;
}
/*2大写字母转为小写数组返回*/
public static char[] change(char[] arr){
if(arr != null && arr.length != 0){//原数组不能为空,且长度不能为0
for (int i = 0; i < arr.length; i++) {
if(arr[i] >= 'A' && arr[i] <= 'Z'){
arr[i] += 32;//大写变小写,ASCII码加32
}
}
}
return arr;返回数组
}
}
所有看起来的毫不费力,一定有着藏起来的拼尽全力…