容器
Java中常用的容器为数组和集合框架。
数组
一种用于存储同类数据的、固定容量的容器。
声明
//区别于C和C++,更纯粹
dataType[] arrayRefVar;
创建
// 确定长度
dataType[] arrayRefVar = new dataType[arraySize];
// 确定初始值
dataType[] arrayRefVar = {value0, value1, ..., valuek};
长度
int[] arr = new int[10];
// 快递为数组
// 长度若不够
// 能 退 货
// leng t h
int length = arr.length;
操作
// 打印所有数组元素
for (int item: arr) {
System.out.println(item);
}
Arrays类
int[] arr = {1,3,2,5,4,6,9,7,8};
// 排序
Arrays.sort(arr);
// 遍历(不属于Arrays类)
for (int item : arr) {
System.out.println(item);
}
数组拷贝
public static native void arraycopy(
Object src, // 原数组
int srcPos, // 拷贝原数组的起始位置
Object dest, // 目标数组
int destPos, // 粘贴目的数组的起始位置
int length // 长度
);
注意
-
Java 基本数据类型传递参数时是值传递 ;引用类型传递参数时是引用传递 。下面代码是一个引用过程中的常见陷阱。
class TestIt { public static void main ( String[] args ) { int[] myArray = {1, 2, 3, 4, 5}; ChangeIt.doIt( myArray ); for(int j=0; j<myArray.length; j++) { System.out.print( myArray[j] + " " ); } } } class ChangeIt { static void doIt( int[] z ) { // 引用置空不会影响源对象数据 z = null ; } }
数组虽然是引用传递 ,但是将引用 z = null 只是将引用z不指向任何对象 ,并不会对原先指向的对象数据进行修改 。
集合框架
集合框架是一个用来代表和操纵集合的统一架构。其框架图如下图所示:
由框架图可以看出,集合框架的三个顶层接口分别是Collection、Map和Iterator(迭代器)。接下来从这三方面入手讲解集合框架。
Collection接口
Collection 接口有 3 种子类型,List 、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、HashMap等等。通过面向接口实现多态,让相同的方法可以在相似的接口上执行不同的实现。
ArrayLsit
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
// 1.增
boolean add(E e)
// 2.删(但是原对象没有变成垃圾)
E remove(int index)
boolean remove(Object o)
// 3.改
E set(int index, E e)
// 4.查
E get(int index)
int size()
// 5.排序
void sort(Comparator<? super E> c)
// 6.遍历
// list.forEach(e -> System.out.println("for each: "+e));
void forEach(Consumer<? super E> action)
LinkedList
LinkedList 的增加和删除对操作效率更高,而查找和修改的操作效率较低。
以下情况使用 ArrayList :
- 频繁访问列表中的某一个元素。
- 只需要在列表末尾进行添加和删除元素操作。
以下情况使用 LinkedList :
- 你需要通过循环迭代来访问列表中的某些元素。
- 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
// 1.增
boolean add(E e)
// 2.删(但是原对象没有变成垃圾)
E remove(int index)
boolean remove(Object o)
// 3.改
E set(int index, E element)
// 4.查
E get(int index)
int size()
HashSet
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
HashSet 是无序的,即不会记录插入的顺序。
HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。
Map接口
HashMap
HashMap 用于存放键值对。HashMap 是无序的,即不会记录插入的顺序。
// 1.增
// class HashMap<K,V> 泛型
V put(K key, V value)
// 2.删
V remove(Object key)
void clear()
// 3.改
boolean replace(K key, V oldValue, V newValue)
// 4.查
V get(Object key)
int size()
迭代器(Iterator)
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代(遍历) ArrayList 和 HashSet 等集合。
-
遍历
public void testIterator(){ List list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); Iterator iter = list.iterator(); while (iter.hasNext()){ String str = (String) iter.next(); System.out.println(str); } }
-
删除
// 引入 ArrayList 和 Iterator 类 import java.util.ArrayList; import java.util.Iterator; public class RunoobTest { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<Integer>(); numbers.add(12); numbers.add(8); numbers.add(2); numbers.add(23); Iterator<Integer> it = numbers.iterator(); while(it.hasNext()) { Integer i = it.next(); if(i < 10) { // 删除小于 10 的元素 it.remove(); } } System.out.println(numbers); } }