Java基础知识篇04——数组
哈喽,大家好!我是白夜,今天给大家聊聊数组。
一、概念
计算机在内存区域分配的一段连续的区域(空间),用来存储同种类型的多个数据
简单的理解,数组就是一堆盒子,同一时间,可以保存多个相同数据类型的数据
- 数组名 :数组的名字
- 数组元素:就是存放在数组里面的数据
- 数组索引:就是数组里面连续存储空间的编号,从0开始
- 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、取值
语法:数组名 [下标];
取值后,主要用于:
- 直接打印输出
- 赋值给另外一个变量
- 直接计算
- 作为方法参数使用
// 数组取值:语法,数组名[下标]; 直接打印元素即可
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——数组的更多相关文章
- 「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !
本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指南」一份涵盖大 ...
- Java学习之旅基础知识篇:数组及引用类型内存分配
在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...
- 超详细的Java面试题总结(二)之Java基础知识篇
多线程和Java虚拟机 创建线程有几种不同的方式?你喜欢哪一种?为什么? 继承Thread类 实现Runnable接口 应用程序可以使用Executor框架来创建线程池 实现Callable接口. 我 ...
- 超详细的Java面试题总结(一)之Java基础知识篇
面向对象和面向过程的区别 面向过程: 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的因 ...
- Java基础知识篇【gitee】
https://snailclimb.gitee.io/javaguide 一.Java基本功 Java一次编译,字节码通过JVM,处处运行jsp会转化为servlet,也要由jdk编译OracleJ ...
- Java基础知识强化04:判断101~200之间有多少素数
1. 判断101~200之间有多少素数? package himi.hebao; /** * (1).编写函数isPrime()用来判断输入数据是否为素数 (2).遍历判断101~200之间的数据是否 ...
- Java 基础知识(一)
Java基础知识篇: 一.关键字解释 1. final:修饰非抽象类,非抽象方法和属性, 以及修饰方法参数,代表“无法改变的”.出于对设计或者效率的考虑使用该关键字. final类无法被继承,fina ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java 面试知识点解析(一)——基础知识篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- 【Java面试题系列】:Java基础知识常见面试题汇总 第一篇
文中面试题从茫茫网海中精心筛选,如有错误,欢迎指正! 1.前言 参加过社招的同学都了解,进入一家公司面试开发岗位时,填写完个人信息后,一般都会让先做一份笔试题,然后公司会根据笔试题的回答结果,确定 ...
随机推荐
- 基于keras的文本情感识别
情感识别是一个典型的分类问题,可以使用Keras来实现,本文是之前整理的笔记,分享出来大家一起学习. 流程描述 Keras文本情感分类基于机器学习算法,会根据大量数据训练出分类模型,然后使用训练好 ...
- 【Unity3D】UGUI概述
1 UGUI 与 GUI 区别 GUI控件 在编译时不能可视化,并且界面不太美观,在实际应用中使用的较少.UGUI 在编译时可视化,界面美观,实际应用较广泛. 2 Canvas 渲染模式(Rend ...
- Laravel入坑指南(4)——数据库(Mysql)
来来来,新的一节出炉了.这一节大家一起了解,Laravel如何对Mysql进行CURD. 我们回顾一下,PHP操作Mysql无非就是通过五个要素:host(地址).username(用户名).pass ...
- Oracle11gr2新增APPEND_VALUES提示
在11.2中,Oracle新增了APPEND_VALUES提示,使得INSERT INTO VALUES语句也可以使用直接路径插入. 例子很简单: SQL> SELECT * FROM V$VE ...
- SDL开发笔记(一):SDL介绍、编译使用以及工程模板
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- 异步aioredis连接时报错TypeError: duplicate base class TimeoutError问题
版本 python3.11版本,aioredis 2.0.1版本,redis 7.x版本 redis.conf配置文件 daemonize yes bind 0.0.0.0 port 6379 pro ...
- day05---系统的重要文件(3)
1) /usr/local 编辑 安装的软件 第三方软件安装位置 软件安装的三种方法 1.yum安装 自动解决依赖问题 yum [选项参数] 包名 第一个里程碑:我想要安装的软件的名字 或者是 知道命 ...
- 在ABP的模块解决方案中使用BootstrapBlazor
1.为Study.Trade.Blazor.Server.Host引入两个包 成功后效果如下: 2.修改Study.Trade.Blazor.Server.Host的Pages目录下的_Host.cs ...
- Javascript之Object、Array
Object.keys 对象的键转化为数组 Object.values 对象的属性值转化为数组 Object.assign 对象的合并 Array.from() 伪数组对象的属性值转化为数组.类似 ...
- 终端SSH远程连接CentOS报错:-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
终端SSH远程连接CentOS时,报以下错误提示: -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such ...