概述
数组是一种线性数据结构,是一个使用连续的内存空间存放相同的数据类型的集合容器,其中的元素均为同一类型。数组的长度在创建时确定,并且在创建后无法改变。上述两特性决定了数组随机访问性能高而难以实现增删操作的特点。
在Java中,通过new新建的数组视为对象,可通过对象引用对其进行属性的修改。
ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和删除元素、实现了ICollection和IList接口、灵活的设置数组的大小等好处。
List接口的大小可变数组(即动态数组)的实现,位于API文档的java.util.ArrayList。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
常用API
数组:
array.clone();//创建一个与原数组长度和对应元素相同的数组,并返回此副本。
array.equals();//判断两个数组对象属性是否一致
array.length();//获取指定数组初始设定长度
ArrayS.toString();//返回此对象的字符串表示形式
Arrays.hashCode();//返回指定数组的哈希码(hashCode就是对象的散列码,是根据对象的某些信息推导出的一个整数值,默认情况下表示是对象的存储地址。通过散列码,可以提高检索的效率,主要用于在散列存储结构中快速确定对象的存储地址)
Arrays.copyOf();//复制数组指定长度的部分,并以0或null填充(若有必要)
Arrays.binarySearch();//对有序数组进行对半搜索查找指定元素
Arrays.sort();//将数组进行快速排序(改造器方法)
Arrays.copyOfRange();//将数组指定范围元素复制到另一数组
动态数组:
arrayList.add();//添加元素
arrayList.addAll();//将集合中所有元素添加到动态数组
arrayList.set();//设定指定位置元素内容
arrayList.get();//通过索引值获取动态数组中元素
arrayList.indexOf();//返回动态数组中元素的索引
arrayList.remove();//移除数组指定位置元素
arrayList.size();//返回动态数组的长度
Collections.sort();//调用Collections容器类对动态数组进行排序
arrayList.contains();//判断动态数组是否含有某个元素
arrayList.isEmpty();//判断动态数组是否为空
arrayList.toString();//将动态数组转换为字符串数组
arrayList.subList();//截取动态数组指定长度部分
arrayList.toArray();//将动态数组转为数组
使用范例
数组:
public static void main(String[] args){
String[] arr = new String[]{"peach","banana","pear","apple","watermelon"};
String[] arr2 = arr.clone();
String[] arr3 = Arrays.copyOf(arr,7);
System.out.println("arr: " + Arrays.toString(arr));
System.out.println("arr2: " + Arrays.toString(arr2));
System.out.println("arr3: " + Arrays.toString(arr3));
System.out.println("hashCode: " + arr.hashCode());
System.out.println("equals: " + arr.equals(arr2));
}
输出结果:
arr: [peach, banana, pear, apple, watermelon]
arr2: [peach, banana, pear, apple, watermelon]
arr3: [peach, banana, pear, apple, watermelon, null, null]
hashCode: 1078694789
equals: false
动态数组:
public static void main(String[] args){
ArrayList<Integer> arrayList = new ArrayList<>();
int[] arr = new int[]{7,23,5,-4,46,0,235,-8};
for(int x = 1;x<20;x+=2){
arrayList.add(-3*x+7);
}
System.out.println("arraylist: " + arrayList);
Collections.sort(arrayList);
System.out.println("sorted: " + arrayList);
System.out.println("remove: " + arrayList.remove(3));
System.out.println("sublist: " + arrayList.subList(2,7));
}
输出结果:
arraylist: [4, -2, -8, -14, -20, -26, -32, -38, -44, -50]
sorted: [-50, -44, -38, -32, -26, -20, -14, -8, -2, 4]
remove: -32
sublist: [-38, -26, -20, -14, -8]
转换方法
数组转动态数组:
public static void main(String[] args){
String[] arr = new String[]{"apple","pear","lemon","grapes"};
ArrayList<String> arrayList = new ArrayList<>();
for(String str:arr){
arrayList.add(str);
}
System.out.println(arrayList);
}
动态数组转数组:
public static void main(String[] args){
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("apple");
arrayList.add("pear");
arrayList.add("strawberry");
arrayList.add("peach");
String[] arr = new String[arrayList.size()];
arrayList.toArray(arr); //不带参数的toArray()会返回Object类数组,需添加类型转换。
System.out.println(Arrays.toString(arr));
}