哈喽,大家好!我是白夜,今天给大家聊聊数组。

一、概念

计算机在内存区域分配的一段连续的区域(空间),用来存储同种类型的多个数据

简单的理解,数组就是一堆盒子,同一时间,可以保存多个相同数据类型的数据

  1. 数组名 :数组的名字
  2. 数组元素:就是存放在数组里面的数据
  3. 数组索引:就是数组里面连续存储空间的编号,从0开始
  4. length :数组的属性长度,数组名.length拿到数组的长度

作用:

​ 可以解决同时保存多个数据的问题

二、声明与赋值、取值、遍历

2.1、数组的声明

int[] ages;// 表示声明一个int类型数组ages,这个数组只能装int类型元素
String[] names;// 表示声明一个String类型数组names,这个数组只能装String类型元素

2.2、数组的初始化赋值

数组在定义后,必须初始化【赋值】才能使用。所谓初始化,就是在堆内存中给数组分配存储空间,并为每一 个元素赋上初始值,有两种方式:

2.2.1、动态创建

语法:数据类型[] 数组名 = new 数据类型[长度];// 长度不能为负数,且是int类型 最大就是int最大值

// 数组声明: 动态创建,语法 :数据类型[] 数组名 = new 数据类型[长度];
//长度不能为负数,且是int类型 最大就是int最大值
int[] arr = new int[3];// 动态创建了一个int类型的数组arr,长度3

2.2.2、静态创建

语法:数据类型[] 数组名 = {元素1, 元素2}

//  数组声明:静态创建,语法 :数据类型[] 数组名 = {元素1, 元素2, 元素3....};
int[] arr2 = {6, 9, 69};

怎么选择用动态创建还是静态创建?

根据实际情况确定,知道具体的数据,用静态创建,不知道用动态创建。

2.3、数组的赋值、取值

2.3.1、赋值

语法:数组名[下标] = 值;
//2 数组赋值:语法,数组名[下标] = 值;
arr[0] = 1;// 给数组arr第1个元素赋值1
arr[1] = 2;// 给数组arr第2个元素赋值2
arr[2] = 3;// 给数组arr第3个元素赋值3

2.3.2、取值

语法:数组名 [下标];

取值后,主要用于:

  1. 直接打印输出
  2. 赋值给另外一个变量
  3. 直接计算
  4. 作为方法参数使用
// 数组取值:语法,数组名[下标];  直接打印元素即可
System.out.println("第1个元素 : " + arr[0]);// 直接打印第1个元素
System.out.println("第2个元素 : " + arr[1]);// 直接打印第2个元素
System.out.println("第3个元素 : " + arr[2]);// 直接打印第3个元素

2.4、数组的遍历

2.4.1、for循环遍历

数组遍历【将所有元素取出来就是遍历】
// 先打印数组arr所有下标
for (int i = 0; i < arr.length; i++) {
// 打印下标:i
System.out.println("下标:" + i);
// 打印元素:arr[i]【通过下标获取对应元素】
System.out.println("元素==== :" + arr[i]);
}

2.4.2、foreach

概念:增强for循环就是类似for循环的结构,专业称呼为foreach

作用:只是用来简化遍历数组和集合的过程;

缺点:没有索引,凡是涉及有索引相关操作还是用普通for循环;

for (int e : arr) {// arr是数组名, int 是元素类型  e变量是每一个元素
System.out.println("元素 :" + e);
}

三、数组内存分析

/**
* 数组内存分析图【理解】
* 基本类型具体的值在栈帧中
* 引用类型具体的值在堆中
*/
public class _05StackHeap {
public static void main(String[] args) {
int[] arr2 = {1, 2, 5};
int[] arr = new int[3];
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr);
arr[0] = 1;
arr[1] = 9;
arr[2] = 6;
// arr[3] = 5;// ArrayIndexOutOfBoundsException 数组下标越界异常。证明下标超过了数组有效范围 int a = 1;
int b = 1;
a = 2;
}
}

四、数组的注意事项、小练习

4.1注意事项

1 数组的下标范围是[0,arr.length-1],使用数组的时候,超过下标范围会报错ArrayIndexOutOfBoundsException 数组下标越界异常。
例如:数组长度是3个,但是现在操作第4个元素arr[3]就会报这个错误。 2 数组动态创建可以分为两步:
2.1. int[] arr;//只是声明一个int类型的数组,还没有创建(即,还没有分配内存空间)
2.2. arr = new int[长度];//分配内存空间,动态创建数组 3 数组静态创建可以分为两步:
3.1. int[] arr;//只是声明一个int类型的数组,还没有创建(即,还没有分配内存空间)
3.2. arr = new int[]{1,2,43};// 分配内存空间,动态创建数组
不能直接这样写:arr = {1,2,43};// 语法错误 4 数组一旦创建,长度就固定不变了。
如果长度不够或者长度多了,就需要创建新数组,将原来数组中元素复制到新数组中。int[] arr = {1,2,43};
arr = new int[]{1,43};//开辟新的内存区域,重新创建新的数组扩容、缩容 5 数组是引用数据类型,直接打印数组名是打印的地址 6 动态创建,没有给数组元素赋值,则系统会分配默认值
(byte/short/int/long)整数类型默认值:0
(float、double)小数类型默认值:0.0
boolean类型:false
char类型默认值:空字符 7 空指针异常:NullPointerException,操作了一个尚未初始化或者没有分配内存空间的数组,即,没有只是声明,但是没有创建的数组

4.2小练习

1. 用for循环求1-35的7的倍数的和
int sun = 0;
for (int i = 1; i <= 35; i++) {
if (i %7 == 0){
sun += i;
}
}
System.out.println(sun); 2. 请打印出int[] arr = {1, 9, 96, 9, 6, 66}; 数组中最小的一个数和最大的一个数
int[] arr = {1, 9, 96, 9, 6, 66};
int max = arr[0];
int min = arr[0];
for (int i = 0; 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); 3.已知数组:int[] arr = {1,9,96,9,6,66};现有新数组:int[] newArr = new int[4];
请将数组arr从第2个元素开始的4个元素复制到新数组newArr中。(即复制:9,96,9,6 到新数组newArr中)
int[] arr = {1, 9, 96, 9, 6, 66};
int[] newArr = new int[4];
for (int i = 0; i < arr.length; i++) {
if(i >= 1 && i <= arr.length -2){
newArr[i-1] = arr[i];
System.out.println(newArr[i-1]);
}
} 4.现有如下的数组 int[] oldArr = {1,3,4,5,6,6,0,5,6,7,0,5};取出以上数组不为0的值,然后将不为0的值存入一个新的数组,生成新的数组为:int[] newArr = {1,3,4,5,6,6,5,6,7,5};
int[] oldArr = {1, 3, 4, 5, 6, 6, 0, 5, 6, 7, 0, 5};
int count = 0;
for (int i = 0; i < oldArr.length; i++) {
if(oldArr[i] != 0){
count++;
}
}
int[] newArr = new int[count];
int index = 0;
for (int i = 0; i < oldArr.length; i++) {
if(oldArr[i] != 0){
newArr[index] = oldArr[i];
index++;
}
}
for (int i = 0; i < newArr.length; i++) {
System.out.println(newArr[i]);
}
5.现在给出两个数组,数组arr1: “1,7,9,11,13,15,17,19”;数组arr2:”2,4,6,8,10”,两个数组合并之后数组arr
int[] arr1 = {1, 7, 9, 11, 13, 15, 17, 19};
int[] arr2 = {2, 4, 6, 8 ,10};
int newArrLength = arr1.length + arr2.length;
int[] newArr = new int[newArrLength];
int index = 0;
for (int i = 0; i < arr1.length; i++) {
newArr[index] = arr1[i];
index++;
}
for (int i = 0; i < arr2.length; i++) {
newArr[index] = arr2[i];
index++;
}
for (int i = 0; i < newArr.length; i++) {
System.out.println(newArr[i]);
} 6.输出斐波那契数列的前 10 项
方法一:
int a = 0;
int b = 1;
int c = 1;
System.out.println(a+ "");
System.out.println(b+ "");
for(int i=2; i < 10; i++){
System.out.println(c + "");
int m = c;
a = b;
b = m;
c = a + b;
}
方法二:
int[] arr = new int[10];
arr[0] = 0;
arr[1] = 1;
for(int i = 2; i < arr.length; i++){
arr[i] = arr[i-1]+arr[i-2];
}
for (int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
} 7.冒泡排序
int[] scores = {11, 34, 76, 77, 88, 99, 58, 97, 56};
for(int i=0; i <scores.length; i++){
for(int j = 0 ; j < scores.length-i-1; j++){
if(scores[j] > scores[j+1]){
int temp = scores[j];
scores[j] = scores[j+1];
scores[j+1] = temp;
}
}
}
for (int e : scores) {
System.out.println(e + "");
}

Java基础知识篇04——数组的更多相关文章

  1. 「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指南」一份涵盖大 ...

  2. Java学习之旅基础知识篇:数组及引用类型内存分配

    在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...

  3. 超详细的Java面试题总结(二)之Java基础知识篇

    多线程和Java虚拟机 创建线程有几种不同的方式?你喜欢哪一种?为什么? 继承Thread类 实现Runnable接口 应用程序可以使用Executor框架来创建线程池 实现Callable接口. 我 ...

  4. 超详细的Java面试题总结(一)之Java基础知识篇

    面向对象和面向过程的区别 面向过程:   优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的因 ...

  5. Java基础知识篇【gitee】

    https://snailclimb.gitee.io/javaguide 一.Java基本功 Java一次编译,字节码通过JVM,处处运行jsp会转化为servlet,也要由jdk编译OracleJ ...

  6. Java基础知识强化04:判断101~200之间有多少素数

    1. 判断101~200之间有多少素数? package himi.hebao; /** * (1).编写函数isPrime()用来判断输入数据是否为素数 (2).遍历判断101~200之间的数据是否 ...

  7. Java 基础知识(一)

    Java基础知识篇: 一.关键字解释 1. final:修饰非抽象类,非抽象方法和属性, 以及修饰方法参数,代表“无法改变的”.出于对设计或者效率的考虑使用该关键字. final类无法被继承,fina ...

  8. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  9. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  10. 【Java面试题系列】:Java基础知识常见面试题汇总 第一篇

    文中面试题从茫茫网海中精心筛选,如有错误,欢迎指正! 1.前言 ​ 参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后,一般都会让先做一份笔试题,然后公司会根据笔试题的回答结果,确定 ...

随机推荐

  1. ASCII、Unicode、UTF8 10年后,重新整理《专题1》

    以后基本都是Unicode定义二进制对应的字符,UTF8来按照一种格式来存储Unicode二进制,所以只需知道 unicode unicode 官网:https://home.unicode.org/ ...

  2. ubuntu之jupyter notebook配置

    ubuntu之jupyter notebook配置 安装jupyter: 前提:安装pip pip install jupyter jupyter notebook 配置: 生成配置文件: jupyt ...

  3. SAS (Statistics Analysis System) 统计分析系统软件

    SAS SAS (Statistical Analysis System) 是一个统计软件系统,由 SAS Institute 开发, 用于数据管理, 高级分析, 多元分析, 商业智能, 刑事调查和预 ...

  4. Centos8 单机配置 Zookeeper3.6.3 集群

    安装 Zookeeper 3.6.3 前提 已经安装好 JDK8+. 如果使用JDK8, 版本需要在211以上. 下载, 解压 使用root用户 wget https://downloads.apac ...

  5. 51单片机封装库HML_FwLib_STC89/STC11

    HML_FwLib_STC89/11 项目地址 https://github.com/MCU-ZHISHAN-IoT/HML_FwLib_STC89 https://github.com/MCU-ZH ...

  6. comm命令

    comm命令 comm命令用于比较两个已排过序的文件,该命令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成3列显示:第1列仅是在第1个文件中出现过的列,第 ...

  7. ORA-39087: Directory Name Is Invalid

    说明 有时我们在Oracle数据库服务器执行expdp/impdp过程中会碰到这个错误:ORA-39087: Directory Name Is Invalid,意思是我们指定的directory参数 ...

  8. jsp中无法识别EL表达式问题

    今天在开发系统时需要在JSP中遍历List<javabean>,其中用到了EL表达式:${item.value} 页面死活不出数据,只显示表达式本身:${item.value}. 页面代码 ...

  9. win32 - WriteConsoleA 的使用

    #include <Windows.h> #include <stdio.h> #pragma warning(disable:4996) void PasswordCheck ...

  10. CSDN的Markdown编辑器使用说明

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...