一、数组

概念:

  1. 存储多个数据(一组数据的容器)
  2. 元素:数组中数据
  3. 下标/索引:元素的编号,从0开始

数组的声明:

数据类型[] 数组名;

1. 数组的初始化

  1. 静态初始化:初始化时,数据由程序员给定,长度由系统自动分配
  2. 动态初始化:初始化时,长度由程序员给定,数据由系统分配默认值
    • 整数类型默认:0
    • 浮点类型默认:0.0
    • 字符类型默认:’ ’
    • 布尔类型默认:false
    • 引用类型默认:null(空)
//静态初始化--通过下标设置元素
names[0] = "御坂美琴";
names[1] = "本间芽衣子";
names[2] = "小鸟游六花";
names[3] = "椎名真白";
names[4] = "一之濑千鹤";
//names[5] = "托尔"; --报错ArrayIndexOutOfBoundsException数组下标越界异常//动态初始化1
//String[] names = new String[5];
//动态初始化2
String[] names;
names = new String[5];

初始化的应用场景:

静态初始化:一开始我们知道数据
动态初始化:一开始我们知道长度

注意:

  1. 数组是引用数据类型
  2. 数组可以存储多个数据(这个是和变量最大的不同)
  3. 数组一旦初始化后,长度不可以改变

2. 数组的访问

通过下标获取元素

String str = names[3];
System.out.println("通过下标获取元素:" + str);//椎名真白

获取数组的长度

int len = names.length;
System.out.println("数组长度为:" + len);//5

遍历:数组从头到尾浏览一遍

//遍历 - for循环
for (int i = 0; i < names.length; i++) {System.out.println(names[i]);
}//遍历 - foreach(增强for循环)
for (String s : names) {System.out.println(s);
}

for & foreach
for循环中可以操作下标
foreach循环中不可以操作下标

3. 数组的排序

冒泡排序

口诀:
N个数字来排队
两两相比,小靠前
外层循环N-1
内层循环N-1-i

int[] array = {45, 69, 32, 28, 52, 18};
for (int i = 0; i < array.length - 1; i++) {for (int j = 0; j < array.length - 1 - i; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}
}
for (int num : array) {System.out.println(num);
}

4. 数组的查找

1. 顺序查找

从头到尾遍历

int[] array = {45, 69, 32, 28, 52, 18};
int num = 69;
for (int i = 0; i < array.length; i++) {if (array[i] == num) {System.out.println("查找到数据了");}
}

2. 二分查找

将数组一分为二,前提:必须先排序

int[] array = {45, 69, 32, 28, 52, 18};
int num = 69;
//排序 18,28,32,45,52,69
Arrays.sort(array);
int start = 0;
int end = array.length - 1;
while (start <= end) {int mid = (start + end) / 2;if (num < array[mid]) {end = mid - 1;} else if (num > array[mid]) {start = mid + 1;} else {System.out.println("找到数据了");break;}
}

二、一维数组扩展

1. 数组的复制

方法1:

缺点:改变原数组的数据,新数组的数据也随之改变

//原数组
String[] names = {"樱岛麻衣", "椎名真白", "一之濑千鹤", "伊卡洛斯"};
//新数组
String[] newNames = names;
//改变原数组的数据
names[3] = "宫水三叶";
//遍历新数组
for (String str : newNames) {System.out.println(str);
}

方法2:

//原数组
String[] names = {"樱岛麻衣", "椎名真白", "一之濑千鹤", "伊卡洛斯"};
//新数组
String[] newNames = new String[names.length];
//将原数组中的数据拷贝到新数组中
for (int i = 0; i < names.length; i++) {newNames[i] = names[i];
}
//改变原数组的数据
names[3] = "小鸟游六花";
//遍历新数组
for (String str : newNames) {System.out.println(str);
}

2. 数组的扩容

//原数组
String[] names = {"樱岛麻衣", "椎名真白", "一之濑千鹤", "伊卡洛斯"};
//新数组
String[] newNames = new String[names.length * 2];
//将原数组中的数据设置到新数组中
for (int i = 0; i < names.length; i++) {newNames[i] = names[i];
}
//将新数组的地址赋值给原数组的引用
names = newNames;
//遍历原数组
for (String str : names) {System.out.println(str);
}

3. 数组的删除

方法1:

缺点:数组本身就是存放数据的容器,这种方式的删除会让数组的长度越变越小

//原数组
String[] names = {"樱岛麻衣", "椎名真白", "一之濑千鹤", "伊卡洛斯"};//长度:4
//新数组
String[] newNames = new String[names.length - 1];//长度:3
//数据的迁移:要删除的数据不做迁移
int index = 0;
for (String str : names) {if (!str.equals("伊卡洛斯")) {newNames[index] = str;index++;}
}
//将新数组的地址赋值给原数组
names = newNames;
//遍历原数组
for (String str : names) {System.out.println(str);
}

方法2:

//原数组
String[] names = {"樱岛麻衣", "椎名真白", "一之濑千鹤", "伊卡洛斯", "本间芽衣子", "小鸟游六花"};
//做数据的移动
for (int i = 3; i < names.length - 1; i++) {names[i] = names[i + 1];
}
//把最后一个下标置为null
names[names.length - 1] = null;
//遍历原数组
for (String str : names) {System.out.println(str);
}

4. 数组参数和返回值

需求:设计一个方法,传入int数组,返回最大值和最小值

public static void main(String[] args) {int[] array = {45, 69, 32, 28, 52, 18};int[] newArray = method(array);System.out.println("最大值为:" + newArray[0]);System.out.println("最小值为:" + newArray[1]);
}
public static int[] method(int[] array) {int max = array[0];//假设数组的最大值是下标为0位置的数据int min = array[0];//假设数组的最小值是下标为0位置的数据//从下标为1的位置开始遍历数组for (int i = 1; i < array.length; i++) {if (max < array[i]) {max = array[i];}if (min > array[i]) {min = array[i];}}return new int[]{max, min};
}

5. 可变参数

注意:可变参数本质意义上就是数组

结构:

方法名(数据类型... 变量名)//重点是这个...

案例:设计一个方法,传入n个int值,返回数据之和

public static void main(String[] args) {//传入实参作为数组的元素int sum = add(1, 2, 3, 4, 5, 6, 7, 8, 9);System.out.println(sum);
}
public static int add(int... array) {int sum = 0;for (int num : array) {sum += num;}return sum;
}
}

注意: 可变参数后面不能加其他任何参数

public static void main(String[] args) {//传入实参作为数组的元素method("可", "变", "参", "数");
}
//可变参数前面可以加其他参数
public static void method(String str, String... ss) {System.out.println(str);System.out.println(Arrays.toString(ss));
}

6. Arrays工具类

含义:Java提供的专门操作数组的工具类
工具类:该类里的所有方法都是静态的

int[] array = {45, 69, 32, 28, 52, 18};
//排序(18,28,32,45,52,69)
Arrays.sort(array);
//替换(把数组中的所有元素替换成888)
Arrays.fill(array,888);
//替换局部:从开始下标处(包含)替换到结束下标处(不包含)
Arrays.fill(array,1,4,666);
//将数组转换为字符串
String str = Arrays.toString(array);
System.out.println(str);

数组查询binarySearch()方法

如果key在数组中,则返回搜索值的索引;否则返回-(插入点)
插入点是索引键将要插入数组的那一点,即第一个大于该键的元素索引。

int[] array = {45, 69, 32, 28, 52, 18};
//查找(返回值:如果key在数组中,就返回数组的下标)
int index = Arrays.binarySearch(array, 32);
System.out.println("下标为:" + index);

三、二维数组

含义:二维数组中包含了多个一维数组

数组的声明:

数据类型[][] 数组名;

数组的初始化:

  1. 静态初始化:数据由程序员指定,长度由系统自动分配
  2. 动态初始化:长度由程序员指定,数据由系统赋默认值
    • 整数类型:0
    • 浮点类型:0.0
    • 字符类型:’ ’
    • 布尔类型:false
    • 引用类型:null

静态初始化

//静态初始化1
String[][] names = {{"御坂美琴","本间芽衣子","小鸟游六花"},{"椎名真白","一之濑千鹤","伊卡洛斯"}};
//静态初始化2
String[][] names;
names = new String[][]{{"御坂美琴","本间芽衣子","小鸟游六花"},{"椎名真白","一之濑千鹤","伊卡洛斯"}};
//静态初始化3
String[][] names = new String[][]{{"御坂美琴","本间芽衣子","小鸟游六花"},{"椎名真白","一之濑千鹤","伊卡洛斯"}};

动态初始化

String[][] names = new String[2][3];//2-二个一维数组,3-每个一维数组都有三个元素

通过下标设置元素

names[0][0] = "本间芽衣子";
names[0][1] = "小鸟游六花";
names[0][2] = "一之濑千鹤";
names[1][0] = "椎名真白";
names[1][1] = "伊卡洛斯";
names[1][2] = "爱蜜莉雅";

通过下标获取元素

String str = names[0][1];
System.out.println("通关下标获取元素:" + str);

获取长度

System.out.println("获取二维数组中一维数组的个数:" + names.length);//2
System.out.println("获取二维数组中第一个一维数组元素的个数:" + names[0].length);//3
System.out.println("获取二维数组中第二个一维数组元素的个数:" + names[1].length);//3

遍历

遍历思路:循环取出一维数组,再循环取出一维数组的元素

//遍历 -- for
for (int i = 0; i < names.length; i++) {for (int j = 0; j < names[i].length; j++) {System.out.println(names[i][j]);}
}
//遍历 -- foreach
for (String[] ss : names) {for (String s : ss) {System.out.println(s);}
}

需求:利用二维数组的动态初始化,实现第一个一维数组元素个数为3,第二个一维数组的元素个数为4

String[][] names = new String[2][];
names[0] = new String[3];
names[1] = new String[4];

案例:五子棋

import java.util.Scanner;
public class GoBang {public static void main(String[] args) {int len = 20;//棋盘长度String[][] goBang = new String[len][len];//棋盘容器//棋盘符号String add = "╋";String black = "■";String white = "○";String[] nums = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖", "⒗", "⒘", "⒙", "⒚", "⒛"};//初始化棋盘数据for (int i = 0; i < goBang.length; i++) {for (int j = 0; j < goBang[i].length; j++) {if (j == len - 1) {//每一行的最后一列goBang[i][j] = nums[i];} else if (i == len - 1) {//最后一行goBang[i][j] = nums[j];} else {goBang[i][j] = add;}}}//打印棋盘for (String[] strings : goBang) {for (String string : strings) {System.out.print(string);}System.out.println();}Scanner scan = new Scanner(System.in);boolean flag = true;//true-黑子 false-白子while (true) {System.out.println("请" + ((flag) ? "黑" : "白") + "子输入坐标:");int x = scan.nextInt() - 1;int y = scan.nextInt() - 1;//判断坐标是否超出棋盘范围if (x < 0 || x > len - 2 || y < 0 || y > len - 2) {System.out.println("坐标超出棋盘范围,请重新输入...");continue;}//判断坐标上是否有棋子if (!goBang[x][y].equals(add)) {System.out.println("坐标有棋子,请重新输入...");continue;}//落子goBang[x][y] = (flag) ? black : white;//置反flag = !flag;//打印棋盘for (String[] strings : goBang) {for (String string : strings) {System.out.print(string);}System.out.println();}}}
}

JavaEE - 数组相关推荐

  1. 269道各路算法考试题集锦

    1 某编程大赛题(35道题,中等难度) 1.在实际的开发工作中,对于string的处理是最常见的编程任务,本题是要求程序对用户输入的string进行处理,具体要求如下: 1.每个单词的首字母变为大写. ...

  2. 百无聊赖之JavaEE从入门到放弃(十二)数组

    目录 一.基础知识 1.数组的定义 2.建议 3.注意 4.数组的默认初始化 二.基操示例代码 三.拷贝 四.Arrays类 一.基础知识 1.数组的定义 数组是相同类型数据的有序集合.数组描述的是相 ...

  3. Java基础笔记(入门,语法基础,流程控制,数组)

    Java语言入门 发展历程 三大技术体系 JavaSE 标准版 JavaEE 企业版 JavaME 嵌入式版 Java语言特点 简单性 健壮性 面向对象 分布式 多线程 动态性 可移植性(跨平台) J ...

  4. [JavaEE笔记]Cookie

    引言 由于 Http 是一种无状态的协议,服务器单从网络连接上无从知道客户身份. 会话跟踪是 Web 程序中常用的技术,用来跟踪用户的整个会话.常用会话跟踪技术是 Cookie 与 Session. ...

  5. java基础(十) 深入理解数组类型

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 1. 数组类简介   在java中,数组也是一种引用类型,即是一种类. ...

  6. javaee实验报告心得_准大四学生七月青软实训总结

    写在前头: 去青岛实训基地学习了一个月..回家已经好几天了,为什么一直没有写这篇博客,因为太忙了..不总结还是不行,总结一下这个月的收获吧,以后回头看看会很有用. 这个月我学到了什么关于人生的知识? ...

  7. java如何对一个表达式开根号_作为一个零基础的新手,如何系统的自学Java和JavaEE开发技术?...

    0基础就找资料学习吧,建议不要看书,选择视频更好,对于新手来说,书本如果在没有人指导之下去看基本上很难看懂 在你学习Java之前一定要去了解一下这门语言,千万不要脑子热就选择来这行 如何系统的自学Ja ...

  8. 大数据WEB阶段(十五)JavaEE三大核心技术之过滤器

    Filter过滤器 一.Filter 过滤器概述 Filter是JavaEE三大核心技术(Servlet . Filter . Listener)之一 FIlter作用是拦截对资源的访问 , 拦截下来 ...

  9. 【Java3】封装,对象数组,构造器,this/super/继承,抽象

    文章目录 1.封装:数据抽象 2.对象数组:先new 3.构造器:不写也有无参构造 3.1 数组工具类:return 3.2 冒泡排序应用:sort,temp 4.this/super/继承:多重,匿 ...

  10. javaEE 飞机大战

    javaEE 飞机大战 展示素材 下载地址 源码: Airplane Award Bee BigAirplane Bullet FlyingObject Hero Score Sky World 展示 ...

最新文章

  1. Nature :全球表层土壤中微生物组的结构和功能
  2. c语言中volatile关键字
  3. vc调用mysql数据库操作例子
  4. android eclipse 按钮事件,android eclipse按钮的OnClick事件 - java
  5. .bin 文件用excel文件打开_bin文件怎么打开呢?
  6. POJ1080 Human Gene Functions 动态规划 LCS的变形
  7. 从一个骗局谈生活中的基础算法
  8. pytorch nn.Conv1d
  9. unity3d 材质概述 ---- shader
  10. 多媒体个人计算机硬件,A.对个人计算机增加多媒体功能所需软硬件进行最低标准.PDF...
  11. 带你过一遍:廖雪峰大神Git教程(建议收藏)
  12. 房屋租赁管理系统 基于SSM框架
  13. 可以免费自学编程的12个网站
  14. Pytest + Allure 测试报告定制
  15. GNOME 3 使用技巧
  16. 如何在word中删除一段文字的所有空格
  17. Codeforces 1324D Pair of Topics
  18. 有效性指标——传输速率和频带利用率
  19. 码农翻身讲网络2:TCP协议
  20. 如何在家远程控制公司的电脑,高效便捷的远程办公?

热门文章

  1. 面试题——红黑树,B树、B+树
  2. 常见的meta标签用法
  3. 软件测试基础概念(二)测试环
  4. 使用CSS制作图片相框以及图片放大旋转效果
  5. 松翰单片机之M2ASM创建新工程
  6. 重温张柏芝08年博客_开发人员和运营人员将在2017年继续重温其在企业中的角色...
  7. unity2d自动生成敌人_在Unity 2D中产生敌人
  8. 全球及中国DNA测序行业发展与竞争状况分析报告2022~2027年
  9. 常见WA错误总结(待更)
  10. uboot中bss的理解