????????一维数组
javase进阶 p542-p557 关键词: 一维数组
Array
1.java语言中的数组是一种引用数据类型,不属于基本数据类型。数组的父类是Object。
2.数组实际上是一个容器,可以同时容纳多个元素。(数组是一个数据的集合。)
3.数组当中可以存储基本数据类型的数据,也可以存储引用数据类型的数据。
4.数组因为是引用类型,所以数组对象实在堆内存当中。(数组是存储在堆当中。)
5.数组在内存方面是怎么样的一个图形?
连续的
6.对于数组当中如果存储的是java对象的话,实际上储存的是对象的引用(内存地址)。数组中不能直接存储java对象。
7.数组一旦创建,在java中规定,长度不可变。
(数组长度不可变)
8.数组分类:
一维数组、二维数组、三维数组、多维数组…(一维数组较多,二维数组偶尔使用!)
9.所有数组都用Length属性(java自带的),用来获取素组的元素个数。
10.java中的数组要求数组中元素的类型统一。
比如int类型数组只能储存int类型Person类型数组只能储存Person类型。 例如:超市购物,购物袋当中只能装苹果,不能同时装苹果和橘子。
11.数组在内存方面存储的时候,数组中的元素内存地址是连续的。
(存储的每一个元素都是有规则的,挨着排列的。) 这是数组存储元素的特点。数组实际上是一种简单的数据结构。
12.所有的数组都是拿第一个小方框的内存地址作为整个数组对象的内存地址。(数组中首元素的内存地址,作为整个数组对象的内存地址)
13.数组中的下标:
数组中每个元素都有下标,下标从0开始,以1递增。最后一个元素的下标是“ Length - 1 下标非常重要,因为我们对数组进行存取的时候,都需要通过下标进行。
14.数组这种数据结构的优点和缺点是什么?
优点:查询/查找/检索某个下标上的元素时效率极高。k可以说是查询效率最高的一个数据结构。 为什么检索效率高: 第一:每一个元素的内存地址存储上是连续的。 第二:每一个元素类型相同,所以占用空间大小一样 第三:知道首元素的内存地址。 第四:通过下标可以计算出偏移量。 通过一个数学表达式,就可以快速计算出某个下标位置上元素的内存地址,直接通过内存地址定位,效率非常高。
数组中存储100个元素,或者存储100万个元素,在元素查询/检索方面,效率是相同的,因为数组中的元素查找的时候不会一个一个找,是通过数学表达式计算出来的。(算出一个内存地址,直接定位的。) 缺点:第一:由于为了保证数组中的每个元素内存地址连续,所以在数组上随机删除或者增加元素的时候,效率较低,因为罖增删元素会涉及到后面元素统一向前或者向后位移的操作。 第二:数组不能存储大数据量,为什么? 因为很难在内存上找到一块特别大的连续的内存空间 随机增删效率较低,数组无法存储大数据量。 注意:数组最后一个元素的增删效率不受影响。
15.怎么声明/定义一个一维数组?
语法格式: int[] array1; double[] array2; boolean[]] array3; String[] array4; Object[] array5;
16.怎么初始化一个一维数组?
包括两种方式:静态初始化一维数组,动态初始化一维数组。 静态初始化语法格式: int[] array = {100,2100,300,55}; 动态初始化语法格式: int[] array = new int[5];//这里的5表示数组的元素个数。 //初始化一个5个长度的intl类型数组 //每个元素默认值为0 String[] names = new String[6]; //初始化6个长度的String类 //型数组,每个元素默认值null 什么使用采用静态初始化方式,什么时候使用动态初始化方式呢? 当你创建数组的时候,确定数组中存储哪些具体元素时,就采用静态初始化方式。 当你创建数组的时候,不确定数组里面存储哪些数据,就使用动态初始化方式,预先分配内存空间。 也可后期赋值,注意下标别越界 main方法的编写方式,也可以采用c++的语法格式 String args[]
一维数组怎么遍历?
代码:
package com.javase.array;
public class ArrayTest01 {
public static void main(String[] args) {
int[] a = {111, 555, 666, 777, 888, 999};
System.out.println("第一个元素为:" + a[0]);
System.out.println("最后一个元素为: " + a[a.length-1]);
a[0] = 123;
System.out.println("第一个元素为:" + a[0]);
for (int i = 0; i <a.length;i++){
System.out.println(a[i]);
}
for(int i = a.length - 1;i >= 0;i--){
System.out.println("倒序输出-->"+a[i]);
}
}
}
当一个方法类似是数组的时候,我们应该怎么传参:
public class ArrayTest03 {
public static void main(String[] args) {
int[] x = {1,2,3,4};
String[] stringArray = {"abc","def","hehe"};
String[] strArray = new String[10];
printArray(x);
printArray(stringArray);
printArray(strArray);
printArray(new String[3]);
printArray(new int[4]);
}
public static void printArray(int[] array){
for (int i = 0; i <array.length ; i++) {
System.out.println(array[i]);
}
}
public static void printArray(String[] args){
for (int i = 0; i <args.length ; i++) {
System.out.println("String数组中的元素" + args[i]);
}
}
}
main方法中的String[] args有什么用:
例:
public class ArrayTest06 {
public static void main(String[] args) {
if(args.length != 2 ){
System.out.println("输入格式错误,应该输出类似zhangsan 123");
return;
}
String username = args[0];
String password = args[1];
if("admin".equals(username) && "123".equals(password)){
System.out.println("账户密码正确,登陆成功");
System.out.println("您可以继续使用该系统");
}else{
System.out.println("登陆失败,您的账户名或者密码错误");
}
}
}
一维数组的深入:
数组中存储的类型为:引用数据类型 对于数组来说,实际上只能存储java对象的内存地址。 数组中存储的每个元素是引用
关于一维数组的扩容。 在java开发中,数组长度一旦确定不可变,那么数组满了怎么办? 数组满了,需要扩容 java中对数组的扩容是: 先建一个大容量的数组,然后讲小容量的数组中的数据一个一个拷贝到大数组当中。 结论:数组扩容效率较低。因为涉及到拷贝的问题。所以在以后开发中请注意:尽量少的进行拷贝数组。 可以在创建数组对象的时候预估一下多长合适,最好预估精确,这样可以减少数组扩容次数,提高效率。 一维数组拷贝,调用了System.arraycopy(拷贝源,拷贝源开始位置,目的数组,目的数组开始位置,拷贝长度)方法
当是数组中如果存储的元素是引用,可以拷贝吗? 当然可以,但是在这拷贝的是内存地址。 拷贝内存图: 
|