数组简介
示例一
要点
main方法上面的String[] args数组主要是用来接收用户输入参数的,
用户可以在控制台上输入参数,这个参数自动会被转换为"String[] args"
例如这样运行程序: java ArrayTeste6 abc def xyz
那么这个时候JVM会自动将abc def xyz通过空格的方式进行分离,分离完成之后,自动放到"String[] args"
实例
public class ArrayTeste01{
//用户名和密码输入到String[] args数组当中。
public static void main(String[] args){
if(args.length != 2){
System.out.println("使用该系统时请输入程序参数,参数中包括用户名和密码信息,例如: zhangsan 123
return;
}
//程序执行到此处说明用户确实提供了用户名和密码。
//接下来你应该判断用户名和密码是否正常。
//取出用户名
String username = args[0];
//取出密码
String password = args[1];
//假设用户名是admin,密码是123的时候表示登录成功。其它一律失败。
//判断两个字符串是否相等,需要使用equals方法。
//if(username.equals("admin") && password.equals("123"))
//采用以下编码风格,即使username和passiword都是null,也不会出现空指针异常。
if("admin".equals(username) &&"123".equals(password)){
System.out.println("登录成功,欢迎[" + username + "]回来");
System.out.println("您可以继续使用该系统...." );
}else{
System.out.println(“验证失败,用户名不存在或者密码错误!");
}
示例二
要点
关于一维数组的扩容。
在java开发中,数组长度一旦确定不可变,那么数组满了怎么办?数组满了,露要扩容。
java中对数组的扩容是:
先新建一个大容量的数组,然后使用arraycopy方法将小容量数组中的数据一个一个拷贝到大数组当中。
结论∶数组扩容效率较低。因为涉及到拷贝的问题。所以在以后的开发中请注意∶尽可能少的进行数组的拷贝。
可以在创建数组对象的时候预估计一下多长合适,最好预估准确,这样可以减少数组的扩容次数。提高效率。
拷贝函数源码:
public static native void arraycopy(@NotNull() @Flow(...) Object src,int srcPos,
@NotNull()
Object dest,int destPos,
int length);
arraycopy方法需要五个参数:源数组、源数组起始拷贝位置、目标数组、目标数组起始拷贝位置、源数组拷贝长度。
实例
public class ArrayTest02{
public static void main(String[] args){
//java中的数组是怎么进行拷贝的呢?
// System.arraycopy(5个参数);
//拷贝源
int[] src = {1,11,22,3,4};
//拷贝目标(拷贝到这个目标数组上)
int[] dest = new int[20];//动态初始化一个长度为20的数组,每一个元素默认值0
//调用JDK System类中的arraycopy方法,来完成数组的拷贝
System.arraycopy(src,srcPos: 1,dest,destPos: 3,length:2);
//遍历目标数组
/*
for(int i=0;i<dest.length;i++){
System.out.println(dest[i]); //0 0 0 11 22 0 ... 0
}
*/
//数组中如果存储的元素是引用,可以拷贝吗?当然可以。
String[] strs = {"he1l1o","world! ","study","java","oracle","mysq1","jdbc"};
String[] newStrs = new String[20];
System.arraycopy(strs,srcPos: 0,newStrs,destPos: 0,strs.length);
for(int i = e; i < newStrs.length; i++){
System.out.println(newStrs[i]);
}
System.out.println("=================================");
Object[] objs = {new Object(), new Object(),new Object()};
Object[] newObjs = new Object[5];
//这里拷贝的不是拷贝对象,而是拷贝对象的地址。
System.arraycopy(objs,srcPos: 0,newObjs,destPos: 0,objs.length);
for(int i = e; i < newObjs.length; i++){
System.out.println(newObjs[i]);
}
}
}
数组存储拷贝Object内存图
示例三
要点
介绍一下java.util.Arrays工具类.
所有方法都是静态的,直接用类名调用
主要使用的是两个方法: 二分法查找, 排序
以后要看文档,不要死记硬背
实例
import java.util.Arrays;
public class ArraysTest {
public static void main(String[] args) {
int[] arr={112,3,4,56,67,1};
Arrays.sort(arr);
for (int i =0;i<arr.length;i++)
{
System.out.println(arr[i]);
}
//二分法查照返回下标(没找到返回-1)
int index = Arrays.binarySearch(arr,4);
System.out.println("该元素的下标是:"+index);
}
}
总结
1、为什么数组的检索效率高?
空间存储上,内存地址是连续的,每个元素占用的空间大小相同,知道首元素的内存地址,通过下标可以计算出偏移量。
通过一个数学表达式,就可以快速计算出某个下标位置上元素的内存地址,直接通过内存地址定位,效率非常高.
缺点:随机增删效率较低,数组无法存储大数据量。
注意:数组最后一个元表的增删效率不受影响因为不会导致其他数组元素的移动。
2、一维数组的静态初始化和动态初始化
静态初始化:
int[] arr = {1,2,3,4};
objeat[] objs = {new object(), new object(), new object()};
动态初始化:
int[] arr = new int[4]; // 4个长度,每个元素默认值0
Objeot[] objs = new Object[4]; // 4个长度,每个元素默认值nul1
3、一维数组的遍历
for(int 1 = 0; i < arr.length; i++) {
System.out.println(arr[1]);
}
4、main方法上"String[] args"参数的使用
5、数组的拷贝: System.arrayoopy()方法的使用
6、对数组中存储引用数据类型的情况,要会画它的内存结构图
7、数组工具类Arrays中有很多对数组进行操作的静态方法,直接使用类名调用。