-
Java中数组的定义与使用(一)
2018-09-01 00:05:13如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下: int i1, i2, i3, ... i100; 但是这儿时候如果按照此类方式定义就会非常麻烦,...数组的基本概念
如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下:
int i1, i2, i3, ... i100;
但是这个时候如果按照此类方式定义就会非常麻烦,因为这些变量彼此之间没有任何的关联,也就是说如果现在突然再有一个要求,要求你输出这100个变量的内容,意味着你要编写
System.out.println()
语句100
次。其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配,而数组的定义语法有如下两类。
- 数组动态初始化:
- 声明并开辟数组:
- 数据类型 [] 数组名称 =
new
数据类型[长度]; - 数据类型 [] 数组名称 =
new
数据类型[长度];
- 数据类型 [] 数组名称 =
- 分布进行数组空间开辟(实例化)
| Tables | Are |
| ------------- |:-------------?
| 声明数组: | 数组类型 数组名称[] =nu
ll; | | | 数组类型 [] 数组名称 =
null; | | 开辟数组空间: | 数组名称 =
new` 数组类型[长度]; |
- 声明并开辟数组:
那么当数组开辟空间之后,就可以采用如下的方式的操作:
- 数组的访问通过索引完成,即:“数组名称[索引]”,但是需要注意的是,数组的索引从
0
开始,所以索引的范围就是0
~ 数组长度-1
,例如开辟了3
个空间的数组,所以可以使用的索引是:0,1,2,如果此时访问的时候超过了数组的索引范围,会产生java.lang.ArrayIndexOutOfBoundsException
异常信息; - 当我们数组采用动态初始化开辟空间后,数组里面的每一个元素都是该数组对应数据类型的默认值;
- 数组本身是一个有序的集合操作,所以对于数组的内容操作往往会采用循环的模式完成,数组是一个有限的数据集合,所以应该使用
for
循环。 - 在
Java
中提供有一种动态取得数组长度的方式:数组名称.length;
范例: 定义一个int型数组
public class ArrayDemo { public static void main(String args[]) { int data[] = new int[3]; /*开辟了一个长度为3的数组*/ data[0] = 10; // 第一个元素 data[1] = 20; // 第二个元素 data[2] = 30; // 第三个元素 for(int x = 0; x < data.length; x++) { System.out.println(data[x]); //通过循环控制索引 } } }
数组本身除了声明并开辟空间之外还有另外一种开辟模式。
范例: 采用分步的模式开辟数组空间
public class ArrayDemo { public static void main(String args[]) { int data[] = null; data = new int[3]; /*开辟了一个长度为3的数组*/ data[0] = 10; // 第一个元素 data[1] = 20; // 第二个元素 data[2] = 30; // 第三个元素 for(int x = 0; x < data.length; x++) { System.out.println(data[x]); //通过循环控制索引 } } }
但是千万要记住,数组属于引用数据类型,所以在数组使用之前一定要开辟控件(实例化),如果使用了没有开辟空间的数组,则一定会出现
NullPointerException
异常信息:public class ArrayDemo { public static void main(String args[]) { int data[] = null; System.out.println(data[x]); } }
这一原则和之前讲解的对象是完全相同的。
数组在开发之中一定会使用,但是像上面的操作很少。在以后的实际开发之中,会更多的使用数组概念,而直接使用,99%情况下都只是做一个
for
循环输出。数组引用传递
既然数组属于引用数据类型,那么也一定可以发生引用传递。在这之前首先来研究一下数组的空间开辟。
范例: 观察一道程序
public class ArrayDemo { public static void main(String args[]) { int data[] = null; data = new int[3]; //开辟一个长度为3的数组 data[0] = 10; data[1] = 20; data[2] = 30; } }
那么既然说到了引用数据类型了,就一定可以发生引用传递,而现在的引用传递的本质也一定是:同一块堆内存空间可以被不同的栈内存所指向。
范例: 定义一个程序
public class ArrayDemo { public static void main(String args[]) { int data[] = null; data = new int[3]; //开辟一个长度为3的数组 int temp[] = null; //声明对象 data[0] = 10; data[1] = 20; data[2] = 30; temp = data; //int temp[] = data; temp[0] = 99; for(int i = 0; i < temp.length; i++) { System.out.println(data[i]); } } }
引用传递分析都是一个套路。同一块堆内存被不同的栈内存所指向。
数组静态初始化
在之前所进行的数组定义都有一个明显特点:数组先开辟内存空间,而后再使用索引进行内容的设置,实际上这种做法都叫做动态初始化,而如果希望数组在定义的时候可以同时出现设置内容,那么就可以采用静态初始化完成。
数组的静态初始化一共分为以下两种类型:
Tables Are 简化格式: 数据类型 数组名称 = {值, 值,…} 完整格式: 数据类型 数组名称 = new 数据类型[] {值, 值,…} 范例: 采用静态初始化定义数组
public class ArrayDemo { public static void main(String args[]) { int data[] = {1, 2, 4, 545, 11, 32, 13131, 4444}; for(int i = 0; i < data.length; i++) { System.out.println(data[i]); } } }
在开发之中,对于静态数组的初始化强烈建议使用完整语法模式,这样可以轻松地使用匿名数组这一概念。
public class ArrayDemo { public static void main(String args[]) { System.out.println(new int[] {1, 2, 4, 545, 11, 32, 13131, 4444}.length); } }
以后使用静态方式定义数组的时候一定要写上完整格式。
数组最大的缺陷:长度固定。
二维数组
在之前所使用的数组发现只需要一个索引就可以进行访问,那么这样的数组实际上非常像一个数据行的概念。
索引 0 1 2 3 4 5 6 7 8 内容 12 23 44 56 90 445 49 99 1010 现在痛过一个索引就可以取得唯一的一个记录。所以这样的数组可以简单理解为一维数组,而二维数组本质上指的是行列集合,也如果要确定某一个数据需要行索引和列索引来进行定位。
索引 0 1 2 3 4 5 6 7 8 0 12 23 44 56 90 445 49 99 1010 1 2 3 41 56 9 45 49 99 10 如果要想确定一个数据则数据使用的结构是“数组名称[行索引][列索引]”,所以这样的结构就是一个表的结构。
那么对二维数组的定义有两种声明形式:
- 数组的动态初始化:数据类型 对象数组[][] = new 数据类型[行个数][列个数];
- 数组的静态初始化:数据类型 对象数组[][] = new 数据类型[行个数][列个数]{{值, 值,…}, {值, 值,…},…};
数组的数组就是二维数组。
范例: 定义一个二维数组
public class ArrayDemo { public static void main(String args[]) { //此时的数组并不是一个等列数组 int data[][] = new int[][] { {1, 2, 3}, {4, 5}, {6, 7, 8, 9}}; //如果在进行输出的时候一定要使用双重循环, //外部的循环控制输出的行数,而内部的循环控制输出列数 for(int i = 0; i < data.length; i++) { for(int j = 0; j < data[i].length; j++) { System.out.print("data[" + i + "][" + j + "]=" + data[i][j] + "、"); } System.out.println(); } } }
由于输出麻烦,所以可以忽略了,在进行开发之中,出现二位数组的几率并不高。
- 数组动态初始化:
-
数组的三种定义方式
2017-12-25 16:16:581.数组的定义 用于存储同一类型数据的集合,其实数组就是一个容器。 连续的存储单元 2.数组的好处 自动给数组中的元素从零开始编号。自动给下标,从零开始0-1-2-3-…… 3.书写格式 元素类型[] 数组名 = new...1.数组的定义
用于存储同一类型数据的集合,其实数组就是一个容器。
连续的存储单元
2.数组的好处
自动给数组中的元素从零开始编号。自动给下标,从零开始0-1-2-3-……
3.书写格式
元素类型[] 数组名 = new 元素类型[]{元素,元素,元素……};
3.1 格式1
int [] arr = new int[5];
需要手动赋值
arr[0]=1; arr[1]=2; arr[3]=3 arr[4]=4; arr[5]=5;
3.2 格式2
int [] arr = new int[]{1,3,5,7}
3.3 格式3
int[]arr = {1,3,5,7};
4.数组的内存结构
5.数组的内存特点
(1).因为使用了关键字new 会在堆内存中开辟相应的空间,分别赋予了两个数组不同的地址。当比较的时候,比较的是两个数组的地址,则为不同
(2).本例虽未使用new 关键字,但是同样的比较的也是数组的地址;
(3).此例输出为true
因为他们指的都是同一个对象abc的地址,所以是相同的
-
结构体定义 typedef struct 用法详解和用法小结
2018-07-31 22:25:48typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node{ }这样来定义结构体的话。在定义 node 的结构体变量时,需要这样写:struct node n; 若用typedef,可以这样写:...typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。
具体区别在于:
若struct node{ }这样来定义结构体的话。在定义 node 的结构体变量时,需要这样写:struct node n;
若用typedef,可以这样写:typedef struct node{}NODE; 。在申请变量时就可以这样写:NODE n;其实就相当于 NODE 是node 的别名。区别就在于使用时,是否可以省去struct这个关键字。首先:
在C中定义一个结构体类型时如果要用typedef:
typedef struct Student { int no; char name[12]; }Stu,student;
于是在声明变量的时候就可:Stu stu1;或者:student stu2;(Stu 和student 同时为Student的别名)
如果没有typedef即:struct Student { int no; char name[12]; }Stu;
就必须用struct Student stu1;或者struct Stu stu1;来声明
另外这里也可以不写Student(于是也不能struct Student stu1;了)typedef struct { int no; char name[12]; }Stu;
其次:
在c++中如果用typedef的话,又会造成区别:
struct Student { int no; char name[12]; }stu1;//stu1是一个变量
typedef struct Student2 { int no; char name[12]; }stu2;//stu2是一个结构体类型,即stu2是Student2的别名
使用时可以直接访问stu1.no
但是stu2则必须先定义 stu2 s2;
然后 s2.no=10; -
python中class的定义及使用
2019-06-05 13:38:44它定义了该集合中每个对象所共有的属性和方法。 #对象:它是类的实例化。 #方法:类中定义的函数。 #类(Class) 由3个部分构成: ''' 类的名称:类名 类的属性:指对象的特征(一组数据) 类的方法:允许对象进行操作的...#类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。 #对象:它是类的实例化。 #方法:类中定义的函数。 #类(Class) 由3个部分构成: ''' 类的名称:类名 类的属性:指对象的特征(一组数据) 类的方法:允许对象进行操作的方法 (行为/功能) ''' # Python 3.x中取消了经典类,默认都是新式类。 # 新式类的语法 -> class 类名(object): pass # 类对象支持两种操作:属性引用 和 实例化。 # 属性引用的语法:obj.属性 # 类实例化的语法:obj = 类名() # 类中方法的调用:obj.方法名() # 下面分析新式类的2种常见形式: #例1: #自定义一个类student class student(object): def speak(self): ## 哪个对象调用了这个方法,self就是那个对象;可以把self理解为一个形参 print("%s 说:我今年%s岁" % (self.name, self.age)) #类student 实例化一个对象john john = student() # 给对象添加属性 john.name = "约翰" john.age = 19 # 调用类中的 speak()方法 john.speak() #<<<约翰 说:我今年19岁 #例2: class student(object): # 定义构造方法 def __init__(self, n, a): #__init__() 是类的初始化方法;它在类的实例化操作后 会自动调用,不需要手动调用; # 设置属性 self.name = n self.age = a # 定义普通方法 def speak(self): print("%s 说:我今年%s岁" % (self.name, self.age)) #类student 实例化一个对象john john = student("约翰",19) # 调用类中的 speak()方法 john.speak() #>>>约翰 说:我今年19岁 # 在python中使用__开头 并以__结尾的方法,称之为魔法方法; # __init__(self) 是类的初始化方法,也称构造方法,是一种特殊的魔法方法。 # __init__(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里。 # 常用到的魔法方法还有:__str__(self) 、 __del__(self)等。 ## __str__(self) class student(object): # 定义构造方法 def __init__(self, n, a): # 设置属性 self.name = n self.age = a # 输出一个字符串(追踪对象属性信息变化) def __str__(self): # __str__(self)不可以添加参数(形参) return "名字:%s 年龄:%d" % (self.name, self.age) # 实例化一个对象john john = student("约翰",19) # 当使用print输出对象时,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据 print(john) #>>>名字:约翰 年龄:19
-
vs code 跳转指定行数和跳转到函数定义
2018-11-07 16:39:36跳转指定行数: Ctrl + G 跳转到函数定义: F12 或者函数名右键>转到定义 -
MATLAB02:结构化编程和函数定义
2019-11-13 13:43:31文章目录MATLAB02:结构化编程和函数定义结构化编程流程控制语句和逻辑运算符流程控制语句示例使用循环语句应尽量预先分配内存空间 MATLAB02:结构化编程和函数定义 结构化编程 流程控制语句和逻辑运算符 与大多数编程... -
C语言结构体类型的定义和使用(一)
2019-08-16 16:50:390x00 前言 文章中的文字可能存在语法错误以及标点错误,请谅解; 如果在文章中发现代码错误或其它问题请告知,感谢!...0x01 结构体类型的定义 0x02 结构体类型变量的定义 0x03 结构体类型变量初始化和引用 ... -
Golang 之区分类型别名与类型定义
2019-07-06 17:12:14Golang 之区分类型别名(Type Alias)与类型定义(Type define)一、类型别名(Type Alias)、类型定义是什么?二、区分类型别名与类型定义类型定义 类型别名 类型定义 区分类型别名、类型定义 非本地类型不能... -
C语言中宏定义的使用
2018-08-21 08:54:361.1 宏定义的基本语法 1.2 宏定义的优点 1.3 宏定义的缺点 1.4 宏还是函数 2 使用宏时的注意点 2.1 算符优先级问题 2.2 分号吞噬问题 2.3 宏参数重复调用 2.4 对自身的递归引用 3. 宏函数的集中特定语法 3.1 ... -
Python进阶(十一)-定义实例方法
2017-03-17 17:09:09Python进阶(十一)-定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外部访问。那这些属性定义有什么用? 虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。除了可以定义实例的属性外... -
递归的定义
2020-09-12 16:04:07递归的定义 在高级语言中,函数调用自己和调用其他函数并没有本质的不同。我们把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。 不过,写递归程序最怕的就是陷入永不结束的无穷递归... -
SATA电源线和数据线接口定义
2017-09-26 22:16:44SATA电源线和数据线接口定义 SATA是Serial ATA的缩写,即串行ATA。2001年,由Intel、APT、Dell、IBM、希捷、迈拓这几大厂商组成的Serial ATA委员会正式确立了Serial ATA 1.0规范,2002年确立了Serial ATA 2.0规范。... -
宏定义有无参数宏定义和带参数宏定义两种
2017-06-15 10:40:41宏定义有无参数宏定义和带参数宏定义两种。 无参数的宏定义的一般形式为 # define 标识符 字符序列 其中# define之后的标识符称为宏定义名(简称宏名),要求宏名与字符序列之间用空格符分隔。这种宏定义要求... -
JTAG接口定义与其他简介
2019-01-12 19:59:24JTAG接口定义与其他简介 JTAG(Joint Test Action Group)是一个接口,为了这个接口成立了一个小组叫JTAG小组,它成立于1985年,比推丸菌的年龄还大。在1990年IEEE觉得一切妥当,于是发布了 IEEE Standard 1149.1-... -
Python进阶(二十四)-Python中函数的参数定义和可变参数
2017-04-06 11:37:36Python进阶(二十四)-Python中函数的参数定义和可变参数 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个和*让人有点费解。其实只要把函数参数定义搞清楚了,... -
C语言宏定义和宏定义函数
2018-12-04 08:39:48要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏... -
C++ 宏定义
2016-10-19 16:28:04———————— #define基本用法 ————————#define命令是C语言中的一个宏定义命令,它用来将一个标识符(宏名)定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。程序编译之前,编译的... -
Jlink 接口定义
2018-06-15 10:19:48接口定义 引脚定义 -
Python类的定义和使用
2019-03-06 10:35:18为了代码的编写方便简洁,引入了类的定义; 一般,使用 class 语句来创建一个新类,class之后为类的名称(通常首字母大写)并以冒号结尾,例如: class Ticket(): def __init__(self,checi,fstation,tstation,fdate,... -
python 定义结构体
2019-09-23 21:45:30定义结构体 -
VS Code不能跳转到定义
2020-02-10 18:05:01VsCode不能跳转到定义 VsCode不能跳转到定义,F12或者ctrl加鼠标左键都不能跳转到定义,在setings中搜索Jedi Enabled,前面的方框内打钩,重新打开vscode即可。 ... -
Python - 在定义函数时,为什么默认参数不能放在必选参数前面?
2019-03-05 16:55:43分享一个大牛的人工智能教程。零基础!...直接定义这样的函数时,Python会报错: Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)] on win32 Type "... -
时间戳定义
2018-07-03 18:43:53时间戳(timestamp): 通常是一个字符序列,唯一地标识某一刻的时间。...定义: 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。... -
定义列表
2017-05-25 10:09:05HTML标签 - 定义列表: 自定义列表不仅仅是一列项目,而是项目及其注释的组合。... (定义列表的列表项内部可以使用段落、换行符、图片、链接以及其他列表等) <dl> <dt>... -
S-属性定义与L-属性定义
2019-05-11 20:00:43文章目录S-属性定义L-属性定义 S-属性 定义 仅仅使用综合属性的SDD称为S属性的SDD,或S-属性定义、S-SDD。 例如: 如果一个SDD是S属性的,可以按照语法分析树节点的任何自底向上顺序来计算它的各个属性值 S-属性... -
手写 Hibernate ORM 框架-01-注解定义、常量定义
2018-05-02 21:38:56目录 目录 本节内容 注解定义 @Entity @Column @Id @GenerateValue ...进行 Hibernate 的注解定义,常量定义 注解定义 直接模拟 Hibernate 定义几个最常见的注解。 @Entity package co... -
JAVA为什么要用interface定义接口然后实现
2019-07-28 19:08:47很多人会有很多疑惑,就是为什么写JAVA要用interface定义接口,感觉根本就是一点作用没有,还多敲了许多代码,因为interface定义的接口里面只有方法的参数,还有定义的方法的返回值,方法实现还要在自己类的内部实现... -
在C语言中怎样定义一个字符串并输入输出
2018-02-28 16:57:29字符数组定义:char 数组名 [常量表达式][常量表达式] 说明:一维字符数组,用于存储和处理一个字符串 。二维字符数组,用于同时存储和处理多个字符串 输入输出方法:逐个字符输入输出:%c 整个字符串输入输出:%s ... -
C#泛型类定义和泛型方法定义
2018-11-24 01:45:00泛型类定义 定义一个泛型类就是指的是,定义一个类,这个类中某些字段的类型是不确定的,这些类型可以在类构造的时候确定下来,举例: class ClassA&lt;T&gt;{ private T a; private T b; public ... -
rj45接口定义/rj45针脚定义/rj45引脚定义
2014-03-22 18:50:24[导读] rj45接口定义/rj45针脚定义/rj45引脚定义 10 100base tx rj45接口是常用的以太网接口,支持10兆和100兆自适应的网络连接 关键词:RJ45 rj45接口定义/rj45针脚定义/rj45引脚定义 10 100base...
-
基于opencv,vc2015+MFC制作的播放视频的例子程序
-
<bdi>
-
并查集记录
-
用于单片机的进制转换
-
file (1).pdf
-
GY-273 HMC5883L电子指南针设计(原理图及源程序)
-
uni-app实战专题
-
DropDown.js
-
【2021】Python3+Selenium3自动化测试(不含框架)
-
GIT命令出现.swp文件解决办法
-
2021-01-23
-
实验五 存储器实验.circ
-
安Sir扣字软件.exe
-
MyBatisPlus逻辑删除与唯一索引冲突问题
-
第4章 数学计算.pdf
-
python+openCV图像处理(二十三)轮廓检测
-
队 列 的 实 现 与 应 用.docx
-
讲稿-LaSO_Label-Set_Operations_Networks_for_Multi-Label_Few-Shot_Learning.docx
-
离线安装.net Framework 3.5的方法和安装包
-
c++ string类常用方法