Java语法基础——数组
数组的概念
同一种类型数据的集合,其实数组就是一个容器。数组既可以存储基本数据类型,也可以存储引用数据类型。
数组的定义格式
格式一:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
- 1
例,需求:想定义一个可以存储3个整数的容器。
int[] x = new int[3];
- 1
格式二:
元素类型[] 数组名 = new 元素类型[]{元素, 元素, ……};
- 1
例,
int[] arr = new int[] {3, 1, 6, 5, 4};
- 1
以上数组又可简写成:
int[] arr = {3, 1, 6, 5, 4};
- 1
Java中的内存分配
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。共划分了5个不同的区域:
- 栈内存:用于存储局部变量(只要是在方法中定义的变量都是局部变量),一旦变量的生命周期结束,该变量就被释放。
- 堆内存:
- 数组和对象,通过new建立的实例都存放在堆内存中。
- 每一个实体都有内存地址值。
- 堆内存的变量都有默认初始化值。不同类型不一样,int为0,double为0.0,boolean为false,char为’\u0000’(即空格)。
- 实体不再被使用,会在不确定的时间内被垃圾回收器回收。
- 方法区:又叫方法和数据共享区。运行时期,class文件进入的地方。
- 本地方法区:和系统底层的方法相关,JVM调用了系统中的功能。
- 寄存器:给CPU使用,不多说。
Java中数组的内存结构
这一节举例说明在Java中数组的内存结构。
例一,定义一个数组,然后将其指向null,如下:
int[] arr = new int[3];
arr = null;
- 1
- 2
对于以上代码,数组在内存中的结构为:
例二,试看如下代码,你能不能画出数组在内存中的结构图呢?
int[] arr = new int[3];
int[] xxx = new int[3];
arr[1] = 34;
xxx[0] = 89;
System.out.println(arr[0]);
- 1
- 2
- 3
- 4
- 5
例三,最后看一个示例代码,希望你能画出数组在内存中的结构图。
int[] arr = new int[3];
int[] xxx = new int[3];
arr = xxx;
arr[1] = 34;
xxx[0] = 89;
System.out.println(arr[0]);
- 1
- 2
- 3
- 4
- 5
- 6
数组操作常见问题
数组操作有两个常见的小问题:
-
数组脚标越界异常(ArrayIndexOutOfBoundsException)
int[] arr = new int[3]; System.out.println(arr[3]); // ArrayIndexOutOfBoundsException: 3:操作数组时,访问到了数组中不存在的角标
- 1
- 2
-
空指针异常(NullPointerException)
int[] arr = new int[3]; arr = null; System.out.println(arr[1]); // NullPointerException:空指针异常,当引用没有任何指向,值为null的情况,该引用还在用于操作实体。
- 1
- 2
- 3
数组的常见操作
数组遍历
获取数组中的元素,通常会用到遍历,数组中有一个属性可以直接获取到数组的元素个数:length,使用方式:数组名称.length
。 下面我会用两个例子来讲解数组是如何遍历的。
例一,观察如下程序,你觉得是不是可以获取到数组中的每一个元素。
int[] arr = {3, 6, 5, 1, 8, 9, 67};
System.out.println("length: "+arr.length);
for (int x = 0; x < arr.length; x++) {
System.out.println("arr["+x+"]="+arr[x]+";");
}
- 1
- 2
- 3
- 4
- 5
- 6
此时,直接输出变量arr:
System.out.println(arr);
- 1
会得到诸如[I@139a55
的值,分析该值:
[
:表示是一个一维数组。I
:表示数组中的元素类型是int。139a55
:用哈希算法算出来的地址值。
例二,定义一个功能,用于打印数组中的元素,元素间用逗号隔开。
public static void printArray(int[] arr) {
System.out.print("[");
for (int x = 0; x < arr.length; x++) {
if(x != arr.length - 1)
System.out.print(arr[x] + ", ");
else
System.out.println(arr[x]+"]");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
获取数组最值
例,给定一个数组,如{5, 1, 6, 4, 2, 8, 9},获取数组中的最大值,以及最小值。
获取最大值的原理图(获取最小值同理):
用文字描述即为:
- 获取最值需要进行比较。每一次比较都会有一个较大的值,因为该值不确定,通过一个变量进行存储。
- 让数组中的每一个元素都和这个变量中的值进行比较,如果大于了变量中的值,就用该变量记录较大值。
- 当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值了。
步骤如下:
- 定义变量,初始化为数组中的任意一个元素即可。
- 通过循环语句对数组进行遍历。
- 在遍历过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量。
此时,我们需要定义一个功能来完成,以便提高复用性。首先须明确两点:
- 明确结果:数组中的最大元素,int。
-
未知内容:一个数组,int[]。
public static int getMax(int[] arr) { int max = arr[0]; for (int x = 1; x < arr.length; x++) { if(arr[x] > max) max = arr[x]; } return max; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
获取最大值的另一种方式,可不可以将临时变量初始化为0呢?可以,这种方式其实是在初始化为数组中的任意一个角标。
public static int getMax_2(int[] arr) { int max = 0; for (int x = 1; x < arr.length; x++) { if(arr[x] > arr[max]) max = x; } return arr[max]; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
同理,获取数组中的最小值,代码如下:
public static int getMin(int[] arr) { int min = 0; for (int x = 1; x < arr.length; x++) { if(arr[x] < arr[min]) min = x; } return arr[min]; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
选择排序
虽然Java中的排序算法有很多,但在这里我只讲其中两种,即选择排序和冒泡排序。在这一小节中我用一个例子来详细讲解选择排序。
例,对给定数组进行排序,如{5, 1, 6, 4, 2, 8, 9}。
选择排序的原理图:
/*
对给定数组进行排序,如{5, 1, 6, 4, 2}。
0-1 0-2 0-3 0-4
1-2 1-3 1-4
2-3 2-4
3-4
*/
public static void selectSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {
for (int y = x + 1; y < arr.length; y++) {
if(arr[x] > arr[y]) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
冒泡排序
在这一小节中我用一个例子来详细讲解冒泡排序。例,对给定数组进行排序,如{5, 1, 6, 4, 9, 2, 8}。
冒泡排序的原理图:
/*
对给定数组进行排序,如{5, 1, 6, 4, 2}。
0-1 1-2 2-3 3-4
0-1 1-2 2-3
0-1 1-2
0-1
*/
public static void bubbleSort(int[] arr)
{
for (int x = 0; x < arr.length - 1; x++)
{
for (int y = 0; y < arr.length - 1 - x; y++)
{
if (arr[y] > arr[y + 1])
{
int temp = arr[y];
arr[y] = arr[y + 1];
arr[y + 1] = temp;
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
发现无论什么排序,都需要对满足条件的元素进行位置置换,所以可以把这部分相同的代码提取出来,单独封装成一个函数。
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
- 1
- 2
- 3
- 4
- 5
那么,冒泡排序可以写为:
public static void bubbleSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {
for (int y = 0; y < arr.length - x - 1; y++) { // -x:让每一次比较的元素减少,-1:避免角标越界
if(arr[y] > arr[y+1]) {
swap(arr, y, y+1);
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
同理,选择排序也可以写为:
public static void selectSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {
for (int y = x + 1; y < arr.length; y++) {
if(arr[x] > arr[y]) {
swap(arr, x, y);
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
折半查找
。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yerenyuan_pku/article/details/81639241
个人分类: ● Java编程语言
相关热词: cnn第六 第六范式 ce修改器第六关 it404第六关 以太坊第六分枝
▼查看关于本篇文章更多信息
区块链以太坊DApp开发是怎么炼成的?区块链的日益火爆和备受追捧,使得区块链开发人才稀缺,同时更加伴随着高薪,想要转型却不了解,特整理出学习大纲分享
2013年05月18日 482KB 下载
2010年11月02日 1.75MB 下载
2010年04月25日 14.5MB 下载
810
2009年10月24日 73KB 下载
40
本次与大家分析的是梁大师讲的创新模式板块:28~30讲。 第28讲 看产品的微观、中观与宏观视角 ...
2009年04月16日 4.11MB 下载
187
JAVA教程 第六讲 Java的线程和Java Applet
2008年08月21日 3.55MB 下载
189
Java SE 第六节 1. 条件运算符(三元表达式) ,其形式为: type d = a ? b : c; 具体化形式为:int d = 2 2. 轻量级的文本编辑器:UltraEdi...
63
一:运算符 1.1算术运算符(+ - * /) 1.2 赋值运算符(= += -= *== /== ++ --) 列:a += b -->a = a+b; (++ 在前) ...
189
493
106
一、面向对象 1.属性 就是事物的描述信息,相当于事物身上的名词. 2.方法 就是该事物可以做什么,相当于动词 3.成员变量 1...
2011年03月23日 345KB 下载
2008年11月07日 1.17MB 下载
61
735
370
今天的篮球赛很厉害,班里会打篮球的好多,会打篮球的就是酷。。。 今日结果: 1 退出程序 exit(-1). for 的另一种格式:for( k=1,i=1; str ...
个人资料
粉丝
2479
喜欢
825
评论
795
等级:
访问:
149万+
积分:
1万+
排名:
1034
勋章:
最新文章
博主专栏
-
阅读量:17162634 篇
-
阅读量:5355912 篇
-
阅读量:63995 篇
-
阅读量:292272 篇
-
阅读量:00 篇
-
阅读量:00 篇
-
阅读量:35503 篇
-
阅读量:12178319 篇
-
阅读量:00 篇
-
阅读量:311769102 篇
-
阅读量:1093815 篇
个人分类
- Java Web基础82篇
- HTML+CSS学习3篇
- 理解计算机1篇
- MySQL2篇
- Java基础加强6篇
- Struts1框架5篇
- Struts2框架17篇
- Hibernate框架25篇
- 阿昀手把手教你学习Spring框架35篇
- ● Java编程语言4篇
- ▬▬▬▬▬【Java入门】26篇
- ▬▬▬▬▬【Java基础面试题集锦】1篇
- ▬▬▬▬▬【Java Web面试题集锦】1篇
- ▬▬▬▬▬【设计模式】1篇
- ▬【我的《Head First HTML与CSS》读书心得】8篇
- ▬▬▬【教你一天玩转JavaScript】8篇
- ▬▬▬【一天快速搞定jQuery】5篇
- ▬▬▬【Ajax学习】1篇
- GitHub学习记录1篇
- Linux基础学习9篇
- Oracle基础学习4篇
- maven学习系列3篇
- UML工具——Power Designer1篇
- Activiti工作流框架的点滴2篇
- MyBatis框架学习7篇
- SpringMVC框架学习12篇
- Lucene与Solr3篇
- SVN2篇
- 阿昀的淘淘商城系列102篇
归档
- 2018年8月4篇
- 2018年4月3篇
- 2018年3月2篇
- 2017年10月10篇
- 2017年7月2篇
- 2017年6月77篇
- 2017年5月63篇
- 2017年4月22篇
- 2017年3月19篇
- 2017年2月8篇
- 2017年1月7篇
- 2016年12月7篇
- 2016年11月2篇
- 2016年10月49篇
- 2016年9月41篇
- 2016年8月36篇
- 2016年7月25篇
热门文章
- eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上
阅读量:292788
- Spring的概述
阅读量:49955
- MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码
阅读量:39603
- Hibernate框架基础——Hibernate入门
阅读量:26812
- Activiti工作流框架学习笔记(一)
阅读量:25209
最新评论
- 淘淘商城系列——Solr的安装
qq_41505485:打扰一下。刚开始配置的solr还成功了后来安装上中文分词器就报HTTP Status 503 - ...
- 淘淘商城系列——KindEdito...
n950814abc:感谢b博主的分享
- 淘淘商城系列——实现图片上传功能
n950814abc:博主很厉害
- 泛型基础
zx1749623383:ComparatorByName.java[code=java] return temp == 0...
- 淘淘商城系列——SSM框架整合之表...
hp961218:[reply]qq_41313648[/reply] 然后呢,把别人东西当成自己的,你觉得很爽? ...
联系我们
请扫描二维码联系客服
400-660-0108
©2018 CSDN版权所有 京ICP证09002463号