java数据结构array数组和list的总结
首先是array数组:
array数组初始化大小之后长度不可变,所以array数组没有增加和删除元素的方法!!!
array数组的长度一旦改变就是一个新数组
array数组的长度不变,只改变元素时,不会生成新的array数组对象
常用的array数组有:int[],String[],char[]
array数组常用的方法有:
Arrays.fill(); 填充数组
Arrays.sort(); 数组排序
Arrays.toString(); 将数组中的内容全部打印出来
Arrays.equals(); 比较两个数组的元素是否相等
Arrays.binarySearch(); 二分查找法找指定元素的索引值
Arrays.copeOf() 和Arrays.copeOfRange(); 截取数组
Arrays.asList() array转换成list
因为array数组的长度无法改变,但是list的长度可以改变,所以ArrayList的长度是可以改变的,ArrayList有add(),remove()方法来增加和删除元素。
注意数组是引用类型,并且数组大小不可变。我们观察下面的代码:
public class Main {
public static void main(String[] args) {
// 5位同学的成绩:
int[] ns;
ns = new int[] { 68, 79, 91, 85, 62 };
System.out.println(ns.length); // 5
ns = new int[] { 1, 2, 3 };
System.out.println(ns.length); // 3
}
}
数组大小变了吗?看上去好像是变了,但其实根本没变。
对于数组ns来说,执行ns = new int[] { 68, 79, 91, 85, 62 };时,它指向一个5个元素的数组:
ns
│
▼
┌───┬───┬───┬───┬───┬───┬───┐
│ │68 │79 │91 │85 │62 │ │
└───┴───┴───┴───┴───┴───┴───┘
执行ns = new int[] { 1, 2, 3 };时,它指向一个新的3个元素的数组:
ns ──────────────────────┐
│
▼
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ │68 │79 │91 │85 │62 │ │ 1 │ 2 │ 3 │ │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
但是,原有的5个元素的数组并没有改变,只是无法通过变量ns引用到它们而已。
也就是说ns指向了新的对象,并没有在指向之前的5个元素的数组对象了
字符串数组
如果数组元素不是基本类型,而是一个引用类型,那么,修改数组元素会有哪些不同?
字符串是引用类型,因此我们先定义一个字符串数组:
String[] names = {
"ABC", "XYZ", "zoo"
};
对于String[]类型的数组变量names,它实际上包含3个元素,但每个元素都指向某个字符串对象:
┌─────────────────────────┐
names │ ┌─────────────────────┼───────────┐
│ │ │ │ │
▼ │ │ ▼ ▼
┌───┬───┬─┴─┬─┴─┬───┬───────┬───┬───────┬───┬───────┬───┐
│ │░░░│░░░│░░░│ │ "ABC" │ │ "XYZ" │ │ "zoo" │ │
└───┴─┬─┴───┴───┴───┴───────┴───┴───────┴───┴───────┴───┘
│ ▲
└─────────────────┘
对names[1]进行赋值,例如names[1] = "cat";,效果如下:
┌─────────────────────────────────────────────────┐
names │ ┌─────────────────────────────────┐ │
│ │ │ │ │
▼ │ │ ▼ ▼
┌───┬───┬─┴─┬─┴─┬───┬───────┬───┬───────┬───┬───────┬───┬───────┬───┐
│ │░░░│░░░│░░░│ │ "ABC" │ │ "XYZ" │ │ "zoo" │ │ "cat" │ │
└───┴─┬─┴───┴───┴───┴───────┴───┴───────┴───┴───────┴───┴───────┴───┘
│ ▲
└─────────────────┘
这里注意到原来names[1]指向的字符串"XYZ"并没有改变,仅仅是将names[1]的引用从指向"XYZ"改成了指向"cat",其结果是字符串"XYZ"再也无法通过names[1]访问到了。
array数组的长度不变,只改变元素时,不会生成新的array数组对象
可以用System.out.println(var_name);来看看输出是不是一样
//array数组的长度不变,只改变元素时,不会生成新的array数组对象
public class test001 {
public static void main(String[] args) {
String[] names = {"ABC", "XYZ", "zoo"};
System.out.println(names); //[Ljava.lang.String;@1b6d3586
String s = names[1];
names[1] = "cat";
System.out.println(s); // XYZ
System.out.println(names); //[Ljava.lang.String;@1b6d3586
}
}