---------------------- android培训、java培训、期待与您交流! ----------------------
我们面向对象过程中,如果操作的是多个对象,就需要把多个对象进行存储.所以我们出现了集合框架.我们不是可以通过数组做到这件事情吗?为什么要需要集合框架呢?数组的长度是固定的.
集合与数组:
1:集合用来存储对象的.(只能存对象)
长度是可以变化的.
2:数组可以存储对象,也可以存储基本数据类型. (Student[],int[])
长度固定的.
集合也是一个容器,并且,集合是最重要的容器.这个容器由于数据结构不同,又分为很多种小容器.
数据结构:按照某种方式存储数据的一种方式.由于数据结构不同,我们不断的向上抽取,形成了体系结构.
这个顶层是Collection.那么,按照我们学习的规律:我们先学习Collection.zzz
Collection接口中的方法:
1:存储数据
boolean add(Object obj);存储一个对象
boolean addAll(Collection c);存储一个集合
2:判断
boolean isEmpty();判断集合是否为空
boolean contains(Object o);判断集合是否包含一个元素
boolean containsAll(Collection c);判断集合是否包含一个集合
3:取出,遍历
Iterator iterator()
返回在此 Collection 的元素上进行迭代的迭代器。
4:删除
boolean remove(Object obj);从集合中删除一个元素
boolean removeAll(Coolection c);从集合中删除一个集合的元素
void clear();清除集合所有的元素.
5:长度
int size();返回集合中的元素个数
6:把集合转成数组
Object[] toArray();
7:boolean retainAll(Collection c);取得集合中的交集元素
Collection
|--List 元素有序(存储顺序和取出顺序一致),可重复(元素可以由相同的)
|--Set 元素无序,不可重复
List:
1:存储
void add(int index, Object obj);在指定位置存储元素,不覆盖以前的元素.以前的元素后移.
boolean addAll(int index,Collection c);在指定位置存储一个集合的元素
2:修改
Object set(int index, Object obj)
用指定元素替换列表中指定位置的元素,返回了修改前的元素.
3:获取
Object get(int index) 返回列表中指定位置的元素。
int indexOf(Object o)
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
int lastIndexOf(Object o)
返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
ListIterator listIterator()
返回此列表元素的列表迭代器(按适当顺序)。
ListIterator和Iterator的区别:
ListIterator继承了Iterator,所以说,它可以使用和Iterator一样的功能.它有含有特有的方法,
供我们使用,比如说:它可以增加元素,可以向前获取元素.
List接口:元素有序(存储顺序和取出顺序一致),可重复(元素可以由相同的)。
|--ArrayList
底层数据结构是数组,有编号,不是同步的,效率高.
查询效率高.其他操作效率低.
|--Vector
底层数据结构是数组,有编号,同步的,效率低.
查询效率及其他操作效率低.
|--LinkedList
底层数据结构是链表,不是同步的,效率高.
查询效率低,其他操作效率高.
JDK版本的升级:
1:方便书写
2:提高效率
3:提高安全
ArrayList:
需求:
去除ArrayList集合中的重复元素。
如果元素是自定义元素(Person)。如果这个人的年龄和姓名相同,我们认为它是同一个人。
根据查看原码,我们发现,ArrayList集合中的判断是否包含否个成员方法contains()判断的已经是eqauls方法.
那么,如果想解决问题,我们就必须重写equals方法.要对Person类进行比较。就在Person类中重写。
@Override
public boolean equals(Object obj) { // Object obj = new Person();
if (this == obj) {
return true;
}
if (!(obj instanceof Person)) {
return false;
}
Person p = (Person) obj;
if ((this.age == p.age) && (this.name.equals(p.name))) {
return true;
} else {
return false;
}
}
public static ArrayList getSingletonCollection(ArrayList array) {
ArrayList al = new ArrayList();
for (int x = 0; x < array.size(); x++) {
Person p = (Person) array.get(x);
//判断al中是否包含某个元素,如果不包含,则把元素加入al.
if (!al.contains(p)) {
al.add(p);
}
}
return al;
}
LinkedList:
1:增加元素
void addFirst(Object obj) 将指定元素插入此列表的开头。
void addLast(Object obj) 将指定元素添加到此列表的结尾。
Object getFirst() 返回此列表的第一个元素。
Object getLast() 返回此列表的最后一个元素。
3:移除元素
Object removeFirst()
移除并返回此列表的第一个元素。
Object removeLast()
移除并返回此列表的最后一个元素。
boolean offerFirst(Object obj) 在此列表的开头插入指定的元素。
boolean offerLast(Object obj) 在此列表末尾插入指定的元素。
Object peekFirst()
获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
Object peekLast() peek:偷看
获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
Object pollFirst poll:剪过毛的,修过枝的。
获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
Object pollLast
获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。
Set集合的特点:元素无序,不能有重复元素
放元素的时候,有可能你放入的顺序和取出的顺序一致,但这不代表Set是有序的.这是你放元素的
顺序恰好和Set集合本身对象元素放置时顺序一致.这是碰巧.你可以多放置一些元素,就能看到Set元素是无序的.
Set:元素无序,不重复,用Iterator遍历
|--HashSet
底层数据结构是哈希表.根据hashCode值存储.线程不安全,存取速度快。
它判断元素根据:hashCode和equals方法.
首先判断hashCode值是否相同:
如果不同,直接把元素存储.
如果相同,在调用equals方法进行判断.
|--TreeSet
底层数据结构是二叉树.
HashSet存储自定义对象
我们假设:姓名和年龄相同的人为同一个人.那么,HashSet中就不能存储姓名和年龄都相同的人.
对应HashSet集合:.
它判断元素是否重复,是通过hashCode和equals两个方法进行判断:
1:首先根据hashCode判断,如果hashCode不同,那么肯定不是重复元素.
2:如果hashCode相同,那么,它有可能是重复元素,这个时候,我们需要重写equals方法来进行判断.
如果我们是用ArrayList存储自定义对象,这个时候,我们的自定义对象如果是按照我们自己的方式认为它相同.
那么,我们就需要重写equals方法.
而我们用HashSet存储自定义对象,这个时候,我们的自定义对象如果是按照我们自己的方式认为它相同,
那么,我们需要重写hashCode和equals.
TreeSet:
线程不安全,可以对Set集合中的元素进行排序。
它的排序是如何进行的呢?
TreeSet数据结构是二叉树:
我想让Worker这个类按照姓名的长度进行排序
1:改Worker类中的compareTo方法,但是不推荐.
2:实现一个接口Comparator,重写compare方法。自定义比较器,而且以自定义比较器为主.
Map是个双列的集合.
Collection是个单例的集合.
Map<K,V>:是键值对形式的顶层接口. Map的键唯一,每个键对应一个值.
|--Hashtable 底层是哈希表数据结构,键和值都不能为null,同步的.
|--HashMap 底层是哈希表数据结构,键和值可以为null,不同步.
如果保证键是唯一的? hashCode,equals
|--TreeMap 底层是二叉树结构.对键进行排序.
如何保证键排序的? Comparable,Comparator
Map接口中的方法:
A:存储数据
Object put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map m)
从指定映射中将所有映射关系复制到此映射中(可选操作)。
B:判断
boolean containsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
boolean isEmpty()
如果此映射未包含键-值映射关系,则返回 true。
C:获取数据
Set<Map.Entry<K,V>> entrySet():
Object get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
Set<K> keySet()
返回此映射中包含的键的 Set视图。
Collection<V> values()
返回此映射中包含的值的 Collection视图。
D:长度
int size()
返回此映射中的键-值映射关系数。
E:删除
void clear():从此映射中移除所有映射关系
Object remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
HashMap:键保证唯一
LinkedHashMap:保证元素有序.底层是链表结构。
TreeMap 底层是二叉树结构.对键进行排序.
小技巧:
array:数组结构
linked:链表结构
hash:哈希结构
tree:二叉树结构
集合的工具类:Collections中的方法。
1:对集合进行查找
2:取出集合中的最大值,最小值
3:对List集合进行排序
4:swap(List<?> list, int i, int j)
在指定列表的指定位置处交换元素。
5:replaceAll(List<T> list, T oldVal, T newVal)
使用另一个值替换列表中出现的所有某一指定值。
6:static void reverse(List<?> list)
反转指定列表中元素的顺序。
数组的工具类:Arrays中的方法。
1:将数组转成List集合
//把数组转成集合
int[] arr = {20,10,30,25};
List<int[]> list = Arrays.asList(arr);
可以使用集合中的方法
2:对数组进行排序Arrays.sort()
//排序
Arrays.sort(arr);
3:对数组进行二分查找
//查找 二分查找的条件:数组必须有序
Arrays.binarySearch(arr, 25)
4:把数组转成字符串
static toString(xx[] xx)
---------------------- android培训、java培训、期待与您交流! ----------------------