集合与数组
数组长度不可变,在某些情况下需要数组扩容时非常消耗内存,所以引入集合
数组形式:
int[] a = new int[3];
int[] b = new int[]{1,2};
int[] c = {1,2,3};
集合(以ArrayList为例):
ArrayList<Integer> a= new ArrayList();//只能存放引用类型,基本类型需要用对应封装类
Collection(java.util)
子类有:
List接口(有序,可重复)
- ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,但效率高 - Vector
底层数据结构是数组,查询快,增删慢
线程安全,但效率低 - LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
Set接口(无序,不可重复)
- HashSet
底层数据结构是哈希表
依靠 hashcode() 和 equals() 方法来保证元素唯一不重复 - LinkedHashSet(FIFO插入有序,唯一)
底层数据结构是哈希表和链表
链表保证有序
哈希表保证唯一性 - TreeSet(唯一,有序)
底层数据结构是红黑树
依靠自然排序与比较器排序实现有序
根据返回值是否是0决定唯一
公共方法
增:public boolean add(E e)
删:public boolean remove(Object obj)
改:无
查:无
其他:
public int size();//返回长度
public boolean contains(Object obj);//若含有obj则返回true
public void clear();//清空集合中的元素
public <T> T[] toArray(T[] t);//将该集合中的元素以数组形式返回
public Iterator iterator();//返回该对象的迭代器
遍历方法及迭代器Iterator
Iterator为java.util下的接口,为方便集合遍历而生
Iterator的方法:
public boolean hasNext();//集合中是否还有元素
public E next();//返回集合里的下一个元素
运用以上方法,集合遍历:
ArrayList<String> str = new ArrayList<String>();
str.add("hello");
str.add("world");
Iterator<String> it = str.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
注意:Iterator遍历过程中不允许增删集合元素,否则会引发并发修改异常
Iterator的其他应用:增强for循环
for(E s:str) {//str为存放E类对象的集合
System.out.println(s);
}
该for循环过程通过Iterator遍历实现,因此该循环过程同样不能增删集合元素
List(java.util)
特点
有下标
有序性(写入与读取的顺序有序,例写入312,读取时顺序也是312)
可重复
特有公共方法
增:pubic void add(int index,E e);//在指定位置添加元素
删:public E remove(int index);//删除指定下标处的元素并返回被删除的元素
改:public E set(int index,E e);//修改指定下标处的元素并返回修改前的元素
查:public E get(int index);//查询指定下标处的元素并返回
其他:public boolean isEmpty();//判空
实现类方法
ArrayList:与List基本一致
LinkedList:添加了与首尾相关的方法
-
增加:
void addFirst(E e); //在头部添加元素
void addLast(E e);//在尾部添加元素 -
删除:
E removeFirst();//删除头部元素并返回
E removeLast();删除尾部元素并返回 -
查找
E getFirst();
E getLast(); -
其他:
E pop();//删除第一个元素并返回
void push(E e);//添加一个元素到头部
Set (java.util)
特点
无下标
无序性(除TreeSet和LinkedHashSet外无序)
不可重复
特有公共方法
基本和Collection一致
实现类方法
HashSet和LinkedHashSet基本和Set相同
Map(java.util)
概述
Map是与Collection平行存在的接口,Map中的元素都是成对存在的,以Map<K,V>的形式存储(K,V为泛型),其中K是唯一的,V可重复
常用公共方法:
增:V put(K key,V value);//若key值不存在,则返回null;若存在则返回被替换掉的value
删:V remove(K key);//根据key删除元素,如该key不存在,返回null;否则返回被删除的value
改:V put(K key,V value);根据key修改value,若成功修改则返回原来的value,否则null
查:V get(K key);//根据key返回对应value,若key不存在返回null
实现类:
HashMap(无序)
底层数据结构是哈希表,重写K类的hashCode()和equals()方法保证K的唯一性
LinkedHashMap(有序)
底层数据结构是哈希表和链表,哈希表保证唯一性(重写K类的hashCode()和equals()),链表保证有序性
遍历方法一:keySet()
1.先获取map集合的键的集合,这个集合是一个Set集合
Set keys = map集合.keySet();
2.遍历keys集合
a.foreach b.迭代器
3.在遍历的过程中,从map集合获取键对应的值
//1.创建一个集合
Map<String, String> map = new LinkedHashMap<String, String>();
//2.添加键值对
map.put("aaa", "AAAA");
map.put("bbb", "BBBB");
map.put("ccc", "CCCC");
//3.获取map的键的集合
Set<String> keys = map.keySet();
//4.遍历keys这个集合,获取到每一个键
//4.1迭代器遍历
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
//根据key 从map集合中查找 对应值
String value = map.get(key);
//打印
System.out.println(key+":"+value);
}
//4.2 foreach遍历
for(String key : keys) {
System.out.println(key+":"+map.get(key));
}
遍历方法二:entrySet()
1.获取map集合中所有 结婚证对象
Set<Map.Entry<K,V>> set = map集合.entrySet();
2.遍历这个set集合,获取每一个Map.Entry类型的对象
a.迭代器 b.foreach
3.获取到 Map.Entry类型的对象之后
K key = entry.getKey();
V value = entry.getValue();
//1.创建一个集合
Map<String, String> map = new HashMap<String, String>();
//2.添加键值对
map.put("aaa", "AAAA");
map.put("bbb", "BBBB");
map.put("ccc", "CCCC");
//3.获取所有键值对关系对象的集合
Set<Map.Entry<String, String>> entrySet = map.entrySet();
//4.遍历 这个entry集合, 拿出每一个结婚证对象
//使用迭代器遍历
Iterator<Map.Entry<String, String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<String, String> entry = it.next();
//获取这个entry中的 键和值
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
//使用foreach
for (Map.Entry<String, String> entry : entrySet) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
Properties(java.util)
概述
Properties extends HashTable implements Map<Object,Object>
也是Map集合的一个实现类,但它的键值对类型是固定的String,它也被称为属性集,具有持久化方法
特有方法
public String getProperty(String key);//用指定的键在此属性列表中搜索属性的值,功能和Map中的get是一样
public Object setProperty(String key, String value);//添加键值对,功能和Map的put方法是一样
public Set<String> stringPropertyNames();//和Map中的keySet方法是一样
void store(new FileWriter("文件名"));//保存数据到文件,实际上不是保存到文件 而是写入到流中,由流写到文件
void load(new FileReader("文件名"));//从文件中加载数据,实际上不是直接加载文件,而是加载流中的数据,而流的数据是从该文件中读取的
Collections
public static void shuffle(List list);//打乱顺序
public static void sort(List list);//把List按照自然顺序(123,或ABC)排序