数组
数组的特点
1.空间存储上,内存地址是连续的,且每个元素占用的空间大小相同
2.知道首元素的内存地址
3.通过下标可以计算出偏移量,然后通过一个数学表达式就可以快速计算出某个下标位置上元素的内存地址。
- 优点:检索效率高
- 缺点:随机增删效率低,数组无法存储大数据量
Java中的数组
1.Java语言中的数组是一种引用数据类型,数组的父类是Object
2.数组实际上是一个容器,可以同时容纳多个元素
3.数组当中可以存储基本数据类型的数据,也可以存储引用数据类型的数据
4.数组因为是引用数据类型,所以数组对象是在堆内存中的
5.数组当中如果存储的是”java对象“的话,实际上存储的是对象的”引用“
6.数组一旦创建,在Java中规定,长度不可变
7.初始化一维数组?
- 静态初始化语法格式: int[] array = {100,,4545,452};
- 动态初始化语法格式: String[] names = new String[6];
8.获得数组的长度: a.length;
9.两种初始化的使用实际?
- 静态初始化:事先已经知道存储的具体元素
- 动态初始化:事先不知道,先分配内存空间
10.参数传递
printArray(new int[]{1,23,4});
printArray(new int[4]);
解释main()方法中String[] args参数的作用?
1.这个数组是留给用户的,用户可以在控制台上输入参数,这个参数自动会被转换为“String[] args”
- 例如这样运行:java ArrayTest01 ddf df gfgf ett
2.JVM会自动将字符串按照空格的方式进行分离, 分离完成之后,自动放到“String[] args”数组中,所以main方法中的 String[] args 数组主要是用来解释用户输入参数的
示例程序
public class ArrayTest01 {
public static void main(String[] args) {
//数组对象创建了,但是数组中没有任何数据
String[] strs = new String[0];
System.out.println(strs.length);
System.out.println("JVM传递的String数组参数,它的长度为:" + args.length);
if(args.length != 2){
System.out.println("请输入两个参数:用户名 + 密码");
}
String usename = args[0];
String password = args[1];
//if(usename.equals("admin") && password.equals("123"))
if("admin".equals(usename) && "123".equals(password)){
System.out.println("登录成功,欢迎【" + usename + "】");
}else {
System.out.println("验证失败,用户名不存在或者密码错误");
}
}
}
数组扩容
1.数组的特点:长度一旦确定,不可变。
2.数组扩容的过程:
- 先新建一个大容量的数组,然后将小容量数组中的一个一个拷贝到大数组中
- 使用System类中的静态方法:
void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
- srcPos destPos表示数组的起始位置
示例程序
public class ArrayTest02 {
public static void main(String[] args) {
//拷贝源
int[] src = {12,34,56};
//拷贝目标
int[] dest = new int[20];
System.arraycopy(src ,0,dest,2,3);
for (int i = 0; i < dest.length; i++) {
System.out.print(dest[i] + " ");
}
//引用类型可以拷贝
System.out.println();
String[] strs = {"hello" ,"Wrold","!"};
String[] newstrs = new String[10];
System.arraycopy(strs,0,newstrs,0,3);
for (int i = 0; i < newstrs.length; i++) {
System.out.print(newstrs[i] + " ");
}
}
}
数组的常用算法
1.排序
- 使用SUN公司提供的数组工具类:java.util.Arrays
- sort是一个静态方法,直接使用类名调用就行Arrays.sort(int[] a);
2.二分查找 - binarySearch是一个静态方法,直接使用类名调用就行Arrays.binarySearch(int[] a, int key);
示例程序
public class ArrayTest04 {
public static void main(String[] args) {
int[] arr = {12,56,33,77,1};
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
System.out.println(Arrays.binarySearch(arr, 33));
}
/**
* 冒泡排序
* @param a 被排序的数组
*/
public static void bubbleSort(int[] a){
for(int i = a.length - 1; i > 0;i--){
for (int j = 1; j <= i; j++) {
if(a[j] < a[j-1]){
int t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
}
/**
* 选择排序
* @param a 被排序的数组
*/
public static void chooseSort(int[] a){
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; j < a.length; j++) {
if(a[i] > a[j]) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
}