一、数组的基本概念
1、概念
数组,就是若干个相同数据类型的元素按一定顺序排列的集合。在Java语言,数据元素可以由简单数据类型的量组成,也可以由对象组成。数组中所有元素都具有相同的数据类型,可以使用一个统一的数组名和一个下标来唯一地确定数组中的元素。从数组的构成形式上可以分为一维数组和多维数组。
2、栈内存和堆内存
Java语言把内存分为两种:栈内存和堆内存
(1)栈内存
在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配。当在一段代码块中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,Java会自动释放掉为该内存所分配的内存空间。
(2)堆内存
堆内存用来存放由new运算符创建的对象和数组。在堆中分配的内存,由Java的自动垃圾回收器(GC)来管理。
(3)引用变量
在堆中创建了一个数组或对象后,同时在栈中也定义了一个特殊的变量,即数组或对象的引用变量,该变量的取值等于数组或对象在堆内存中的首地址(也称为对象的句柄),使用栈内存中引用变量来访问堆中的数组或对象。引用变量相当于为数组或对象起的一个名称。
引用变量是一个普通变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。
数组或对象本身在堆内存中分配,所占的内存空间不会自动释放。数组或对象在没有引用变量指向它时,会变成垃圾,不能再被使用,占用的内存空间不放,直到一个不确定的时间被垃圾回收器回收。
(4)null常量
Java中的特殊引用型常量。如果将一个引用变量赋值为null,则表示该引用 变量不再指向任何对象,那么该引用变量原来指向的数组或对象就会变成“孤儿”,最终会垃圾回收器处理。
3、数组的特点
- 数组是相同数据类型元素的集合
- 数组中的各元素有先后顺序,它们在内存中按这个先后顺序连续存放
- 数组元素用数组的名字和它自己在数组中的顺序位置来表示
- 数组的长度一旦确定,就不能修改
二、一维数组
一维数组是最简单的数组,其逻辑结构是线性表。
1、一维数组的定义
(1)数组使用的三个步骤:
<1>声明数组
<2>创建空间 new
<3>创建数组元素并赋值
(2)注意
Java语言在数组的声明时并不为数组分配内存,因此[ ]不用指定数组的长度。但必须为数组分配内存空间( new )后才可使用。
(3)new关键字
在数组声明之后,接下来就是分配数组所需的内存。
int[] x; //声明数组
x = new int[10]; //分配内存空间
合并成一行:
int[] x = new int[10];
注意:数组用new运算符分配内存空间的同时,数组的每一个元素都会自动赋值一个默认值:整型为0,实数为0.0,字符为“\0”,boolean型为false,引用类型为null。
(4)Arrays支持的常用方法
方法 | 说明 |
---|---|
binarySearch(X[] a,X key) | X是任意数据类型。返回 key 在升序数组 a 中首次出现的下标,若 a 不包含 key ,则返回负值 |
sort(X[] a) | X是任意数据类型。对数组 a 升序排序后仍存放在 a 中 |
sort(X[] a,int fromIndex,int toIndex) | 对任意数据类型的数组 a 中从 fromIndex 到 toIndex-1的元素进行升序排序,其结果仍存放在 a 数组中 |
copyOf(X[] original,int new Length) | 截取任意类型数组 original 中长度为 newLength 的数组元素拷贝给调用数组 |
equals(X[] a, X[] b) | 判断同类型的两个数组 a 和 b 中对应元素值是否相等。若相等,返回true,否则返回false |
2、一维数组的访问
(1)方法:下标访问元素
(2)数组的length属性:指明数组长度
3、一维数组的初始化与应用
(1)动态初始化
数组声明且为数组元素分配空间与赋值的操作分开进行
(2)静态初始化
在定义数组的同时就为数组元素分配空间并赋值。
注意:
1、在Java语言中,声明数组的同时是不可以指定数组长度的;
2、数组一旦初始化,其长度是不可变的
3、数组在分配空间后,自动被赋默认值
int[5] a; //编译报错,对应注意点(1)
int[] a = new int[5];//正确
三、foreach语句与数组
1、特点
不需要下标就可以遍历整个数组;
用户不用判断数组是否越界
2、需要三个数据
- 元素类型(type)
- 循环变量的名字(element):用于存储连续的元素
- 待检索的数组(array)
3、语法
for(type element : array){
System.out.println(element);
....
}
4、注意点
element的类型必须和数组array中元素的类型相同
四、多维数组
1、二维数组
(1)声明
Java语言的二位数组不一定是规则的矩形。
- 规则数组
int[][] x = new int[2][3];
创建了2x3布局的规则数组
- 不规则数组
int[][] x = new int[3][];
x[0] = new int[3];
x[1] = new int[2];
创建了第一行3个元素,第二行2个元素,第三行0个元素的不规则数组。
(2)注意点
数组申请内存空间时,二维数组必须指定高层维数。
- 正确的申请方式:只指定数组的高层维数
int[][] myArray = new int[10][];
- 正确的申请方式:指定数组的高层维数和底层维数
int[][] myArray = new int[10][3];
- 错误的申请方式:只指定数组的低层维数
int[][] myArray = new int[][5];
- 错误的申请方式:不指定数组任何维数
int[][] myArray = new int[][];
2、三维及以上的数组
五、字符串
分类:
1、创建之后不会再做修改和变动的字符串变量——String类
2、创建之后允许再做修改的字符串变量——StringBuilder类
1、字符串变量的创建
注意:String类创建的字符串变量,一旦被初始化或赋值,它的值和所分配的内存内容就不可再改变。如果硬要改变它的值,它就会产生一个新的字符串。
String str1 = "Java";
str1 = str1 + "Good";
这看起来像是一个简单的字符串重新赋值,实际上在程序的解释过程中却不是这样的。程序首先产生str1的一个字符串对象并在内存中申请了一段空间,由于发现又需要重新赋值,在原来的空间不可以再追加新的内容,系统不得不将这个对象放弃,再重新生成第二个新的对象,并重新申请新的内存空间。虽然str1指向的内存地址是同一个,但对象已经不再是同一个了。
2、String类的常用方法
方法 | 说明 |
---|---|
length() | 返回字符串长度 |
equals(Object anObject) | 两字符串比较,相等为true,否则为false |
subString(int beginIndex) | 返回字符串从beginIndex开始的子串 |
subString(int beginIndex,int endIndex) | 返回字符串从beginIndex开始到endIndex结束的子串 |
charAt(int index) | 返回index指定位置的字符 |
indexOf(String str) | 返回str字符串第一次出现的位置 |
compareTo(String anotherString) | 若调用该方法的字符串大于参数字符串,则返回大于0的值;若相等,返回数0;若小于参数字符串,则返回小于0的值 |
replace(char oldChar,char newChar) | 以newChar字符替换字符串中所有oldChar字符 |
trim() | 去掉字符串的首尾空格 |
toLowerCase() | 将字符串中的所有字符转换为小写字符 |
toUpperCase() | 将字符串中的所有字符转换为大写字符 |