Java集合
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是List和Set.
List接口的特点:元素有序,可重复。底层存放是数组的结构, 查询快,增删慢
Set接口的特点:元素无序,不可重复。
Map:双列集合类的根接口,用于存储具有键(Key),值(Value)映射关系的元素,每个元素都包含一对键值,在使用Map集合时可以通过指定的Key找到对应的Value,Map接口的主要实现类有HashMap和TreeMap
Collection接口
List接口:list接口继承自Collection接口,List集合中允许出现重复的元素,所有元素是以一种线性方式进行存储的,在程序中通过索引来访问集合中的指定元素
ArrayList
方法:
a、增 list.add("aaa");
b、删 list.clear();// 清空ArrayList集合中的所有的元素
list.remove(2);// 根据指定的索引,删除指定的元素
list.remove("bbb");// 根据指定的元素,删除
c、改 list.set(2, "ccc");// 根据索引去修改指定的元素
d、查 Objectobject = list.get(1);//单个查询 ,如果想多个查询可以用for循环,还可以用迭代
ArrayList中的其他方法
i、迭代器
|
iterator()
|
|
|
Iterator it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } |
ii、比较集合是否相同
boolean equals = list.equals(list1); |
细节:
如果在对list集合添加的时候,在用Iterator迭代器去迭代list集合中的元素的时候,不可以同时用list对象操作添加,否则出现如下异常
java.util.ConcurrentModificationException
解决办法:
在用迭代器的时候选择ListIterator迭代,应为这个迭代器自带添加的方法 add(object obj)
ListIterator是Iterator的子类,该类在父类的基础上增加了一些特有的方法,如add(Object),hasPrevious(),previous()
LinkedList集合
该集合内部维护了一个维护了一个双向链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来,
当插入一个新元素时,只需要修改元素之间的这种引用关系即可,删除一个节点也是如此。正因为这样的存储结构,所以LinkList集合对于元素的增删操作具有很高的效率
LinkedList集合特有的方法
add(int index,Eelement),addFirst(Object),addLast(Object),
getFirst(Object),getLast(Object),
removeFirst(),removeLast()
Iterator 接口
当迭代器获取元素时,都会将这些元素当作Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型装换
ListIterator 接口
Foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改。
Vector集合,该集合是List集合接口的一个实现类,用法与ArrayList完全相同,区别在于Vector集合是线程安全的,而ArrayList集合是线程不安全的。在Vector类中提供了一个elements()方法用于返回Enumeration对象,通过Enumeration对象就可以遍历该集合中的元素。 返回此向量的组件的枚举
Enumeration集合
set接口
set接口list接口一样,同样继承自Collection接口,它与Collection接口的用法基本一致,并没有对Collection接口进行扩充,只是比Collection接口更加严格了
Set接口中的元素 无序,不可重复
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。
TreeSet 是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序
HashSet:当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后在调用对象的equals()方法来确保该位置没有重复的元素。所以当向集合中存入元素时,为了保证HashSet正常工作,要求在存入对象时,重写该类中的hashCode()和equals()方法
Set集合与List集合存取元素的方式都一样。。。
HashSet TreeSet 不可以用for循环的方式遍历,因为元素是无序的
TreeSet
TreeSet集合内部使用的是自平衡的排序二叉树,它的特点是存储的元素会按照大小排序,并能去除重复元素。
集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable接口中定义的,因此要想对集合中的元素进行排序,就必须实现Comparable接口。JDK中大部分的类都实现Comparable接口,拥有了接口中的CompareTo()方法,如Integer,String等。
所以自己的类有两种方法来让自己的对象可以参与比较:
一种:实现Comparable接口,重写CompareTo()方法
另一种:实现Comparator接口,重写comparator()方法
Map
A、HashMap
底层数据结构都是hash值,hashMap中的键和值是可以为null的,线程是不同步的,hashMap的扩展性能比HashTable更好
所以今后开发中推荐使用HashMap
1、增
put() 增加一个对象 map.get(“key”)获取指定key值对应的value值
2、删
Remove()
3、改
先查询,在重写赋值
4、查
两种方式
keySet
entrySet
5、values()方法得到所有的值的Collection集合
6、LinkedHashMap类可以让迭代出的元素的顺序和取出的顺序一致,它是HashMap 的子类
B、HashTable 和HashMap十分相似
底层数据结构都是hash值
hashTable中的键和值不可以为null
线程是同步的,线程安全的,基本被HashMap类取代,有一个子类Properties非常重要
C、TreeMap 存放键值映射关系
底层数据结构是二叉树,通过二叉树的原理来保证键的唯一性,这与TreeSet集合存储的原理一样,因此TreeMap中的键是按照某种顺序排列的
可以对元素排序。默认是对key进行排序(系统自带的对象),如String类型,这是因为String实现了Comparable接口。按照自然书序排序
如果要添加自定义对象,用自己定义的排序方式,需要自己封装一个排序的方法。 如
package InetAddress;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
public class example {
public static void main(String[] args) {
TreeMap map = new TreeMap(new MyComparator());//传入一个比较器
map.put("1", "Jack");
map.put("2", "Rose");
map.put("3", "Locy");
Set keySet = map.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
Object key = it.next();
Object value = map.get(key);
System.out.println(key+":"+value);
}
}
}
class MyComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
String obj1 = (String) o1;
String obj2 = (String) o2;
return obj2.compareTo(obj1);
}
}
D、Properties HashTable的子类,主要用来存取字符串类型的键和值,在实际开发中,经常使用Properties集合来存取应用的配置项。
package InetAddress;
import java.util.Enumeration;
import java.util.Properties;
public class example2 {
public static void main(String[] args) {
Properties p = new Properties();
p.setProperty("background-color", "red");
p.setProperty("Font-size", "14px");
p.setProperty("Languge", "chinese");
Enumeration names = p.propertyNames();//获取Enumeration对象的所有键的枚举
while(names.hasMoreElements()){
String key = (String) names.nextElement();
String value = p.getProperty(key);
System.out.println(key+" = "+value);
}
}
}
泛型
Collections工具类
Arrays工具类