数组和集合
-
不同点
-
数组的长度是不可变的,集合的长度是可变的
-
数组可以存基本数据类型和引用数据类型
集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类
-
Java中的集合类主要由Collection和Map这两个接口派生而出;
Collection子接口:Set、List、Queue.
Set:无序、不可重复;
List:有序,可重复;
Map:
Collection集合只能存储单个元素,并且只能存储对象的地址。
集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变。
数组中可以存储基本数据类型和引用类型,集合只能存储对象的地址
ArrayList<E>:
可调整大小的数组实现
<E>:是一种特殊的数据类型,泛型
ArrayList 底层就是一维数组,覆写了toString。
如何使用:
在出现E的地方我们使用引用数据类型替换即可
举例:ArrayList<String>,ArrarList<Student>
ArrayList和LinkedList区别:
数据结构不同:ArrayList 是Array(动态数组)的数据结构;LinkedList是Link(链表)的数据结构;
效率不同:当随机访问List(get和set操作)时,ArrayList比LinnkedList的效率更高,因为因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。 当对数据进行增删(add和remove操作)时LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
集合中用的是equal比较
Collection遍历-迭代器:
Iterator iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到。
Iterator中的常用方法:
boolean hasNext(): 判断当前位置是否有元素可以被取出
E next(): 获取当前位置的元素,将迭代器对象移向下一个索引位置
Collection集合的遍历:
public class IteratorDemo{
public static void main(String[] args){
//创建集合对象
Collection c = new ArrayList<>();
c.add("hello");
c.add("world");
c.add("java");
c.add("new been");
Iterator<String> it = c.iterator();//返回此集合中元素的迭代器,通过集合的iterator()方法得到
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
Map:
Map中的集合,元素是成对存在的,每个元素由键与值两部分组成,可以通过键找到对应的值。也成为双列集合。
不能包含重复的键,值可以重复,每个键只能对应一个值。
HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
注意:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。
方法 | 理解 |
void clear(); | 清空Map |
boolean containsKey(Object key); | 判断Map中是否包含这样的value |
Set<Map.Entry<K,V>>entrySet(); | 把Map中的Entey<K,V>放入Set集合中 |
Object get(Object key); | 通过key取得value |
Object put(Object key,Object value); | 向集合中添加键值对 |
boolean isEmpty(); | 判断该集合是否为空 |
Object remove(Object key); | 通过key将键值对删除 |
int size(); | 获取Map中键值对的个数 |
Set keySet(); | 把Map中的key放入Set集合中 |
Collection values(); | 获取Map集合中所有的value |
s s
s