1.Collecctions和Collection
Collection:集合框架中的用与存储一个一个元素的接口,又分为List和Set等子接口.
Collections:用于操作集合框架的一个工具类.此时的集合框架包括Set,List和Map
2.List接口
1.List接口的特点
用于存储有序的,可重复的数据--->"动态"数组
2.List接口中的常用方法:
①Collection中的方法
basic Operations
-
boolean add(E e)
-
在集合中加入特定的元素
-
Returns
true
if the collection was modified as a result.
-
-
boolean addAll(Collection<? extends E> c)
-
把一个指定集合的所有元素加入到集合中
-
Returns
true
if the collection was modified.
-
-
void clear()
-
移除集合内的所有元素
-
-
boolean remove(Object o)
-
移除一个指定元素
-
Returns
true
if the element was removed.
-
-
boolean removeAll(Collection<?> c)
-
移除所有在集合中存在的指定集合的元素
-
Returns
true
if the collection was modified.
-
-
boolean retainAll(Collection<?> c)
-
保存所有在集合中存在的指定集合的元素
-
移除其他元素
-
Returns
true
if the collection was modified.
-
Query Operations
-
boolean contains(Object o)
-
查询集合中是否存在指定元素
-
Returns
true
if the element is present.
-
-
boolean containsAll(Collection<?> c)
-
查询集合中是否存在指定集合中的所有元素
-
Returns
true
if all elements are present.
-
-
boolean isEmpty()
-
Checks if the collection is empty.
-
Returns
true
if it contains no elements.
-
-
int size()
-
Returns the number of elements in the collection.
-
Iterator Operations
-
返回一个迭代器以遍历集合中的所有数组Iterator<E> iterator()
Array Conversion
-
Object[] toArray()
-
Converts the collection to an array of
Object
.
-
-
<T> T[] toArray(T[] a)
-
Converts the collection to an array of the specified type.
-
②由于List有序,引出索引相关方法
1.删
remove(int index)
2.改
set(int index,Object obj)
3.查
get(int index)
4.插
void add(int index,Object obj)
5.长度
size()
6.遍历
Iterator
增强for循环
//(数据类型) (元素名) (集合或数组)
for(ArrayList element : ArrayList){
System.out.ptint(element)
}
一般for循环
3.具体实现类
1.ArrayList(主要)
2.Vector(过时了,线程安全)
3.LinkedList
3.Set接口
常用实现类
HashSet | 使用哈希表实现的 Set ,不保证元素的顺序,性能非常高,适用于快速查找。 |
LinkedHashSet | 基于 HashSet 实现,但维护了元素插入顺序。 |
TreeSet | 基于 TreeMap 实现,保证集合中的元素是有序的(自然排序或自定义排序)。 |
常用方法:(如上)
1.Set中无序性、不可重复性的理解(以HashSet及其子类为例说明)
-
无序性1=随机性
添加元素的顺序与遍历元素的顺序不一样不属于无序性
无序性与添加的元素的位置有关,不像ArrayList是紧密,有序的
-
不可重复性:添加带Set中的元素是不能相同的.
比较的标准,需要判断HashCode()得到的哈希值以及equals()得到的Boolean型结果
哈希值相同且equals()返回true,则认为元素是相同的.
4.Map接口
1.Map实现类
java.util.Map:存储一对一对的数据(key-value键值对,(x1,x2),(x2,y2)--> y=f(x),类似于高中的函数)
|----HashMap(主要实现类);线程不安全,效率高;可以添加null的key和value值;底层使用数组+单向链表+红黑树结构存储
|----LinkedHashMap:是HashMap的子类;在HashMap使用的数据结构的基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而我们在遍历元素是,就可以按照添加的顺序显示。
开发中,对于频繁的的遍历操作,建议使用此类。
|----Hashtable:线程安全,效率低;可以添加null和value值;底层使用数组+单向链表结构存(jdk8)
|----TreeMap:底层使用红黑树存储;可以按照添加的key-value中的key元素的指定的属性大小顺序进行遍历。需要考虑使用①自然排序 ②定制排序
|----Properties:其kay和value都是String类型。常用来处理属性文件。
2.HashMap中元素的特点
-
HashMap中所有的key彼此之间是不可重复的、无序的。所有的key就构成一个Set集合。---->key所在的类要重写hashCode()和equals()
-
HashMap中的所有中的所有value彼此之间是可重复的 无序的.所有value就构成一个Collection集合 --->value所在的类要重写equals()
-
HashMap中的所有的entry彼此之间是不可重复的 无序的。所有的entry就构成了一个Set集合
3.Map中的常用方法
Basic Operations:
5.泛型
泛型类\接口
1.声明格式
class A<T>{
T(此时可以当作数据类型)
}
-
put(K key, V value)
: Adds or updates a key-value pair. -
putAll(Map m)
: Copies all mappings from another map into this map. -
get(Object key)
: Retrieves the value associated with a key. -
remove(Object key)
: Removes the mapping for a key. -
containsKey(Object key)
: Checks if a key exists. -
containsValue(Object value)
: Checks if a value exists. -
size()
: Returns the number of key-value pairs. -
isEmpty()
: Checks if the map is empty. -
clear()
: Removes all entries from the map. -
replace(K key, V value)
: Replaces the value for the specified key if it exists. -
replace(K key, V oldValue, V newValue)
: Replaces the value only if the key is mapped to the specified old value. -
4.TreeMap的使用
-
底层使用红黑树存储;
-
可以按照添加的key-value中的key元素的指定属性大小顺序进行遍历。
-
需要考虑使用①自然排序 ②定制排序
-
要求:向TreeMap中添加的key必须是同一个类型的对象
2.使用说明
-
我们在声明完自定义泛型类以后,可以在类的内部(比如:属性\方法\构造器中)使用类的泛型
-
我们在创建自定义泛型类的对象时,没有指明泛型参数类型,那么泛型将被擦除,泛型对应的类型均按照Object处理,但不等价于Object
-
如果在创建自定义泛型类的对象时,可以知名泛型参数类型.一旦知名,内部凡是使用类的泛型参数的位置,都具体化为指定的类的泛型类型
-
泛型的指定中必须使用引用数据类型
-
出创建泛型类对象外,子类继承泛型类时,实现类实现泛型接口时,也可以确定泛型结构中的泛型参数.如果我们在给泛型类提供子类是,子类也不确定泛型的类型,则可以继续使用泛型参数.还可以在现有父类额的泛型基础上,新增泛型参数
由于数据多变,若直接设定存放Object类,会导致类型不安全
指定一个不确定的类型,可以是任何引用数据类型,一旦指定引用数据类型,就只能添加此一种数据
<>
1.泛型方法的优点
-
复用性高:可以在一个方法内用不同的引用数据类型
-
类型安全:不同于直接Object泛型
-
灵活性:泛型方法可以用于泛型类和非泛型类
泛型在继承中的实现
ArrayList<Object> list = new ArrayList<>(); ArrayList<String> list1 = new ArrayList<>(); list = list1;
上面的代码错误 解释:
-
泛型是不可变的...虽然String时Object的子类,但ArraysList<String>不是ArrayList<Object>的子类
-
如果声明允许,就不符合类型安全.会破环list1设定的初衷
ArrayList<Object> list = new ArrayList<>();
ArrayList<String> list1 = new ArrayList<>();
list = list1; // Hypothetically allowed
list.add(42); // Add an Integer to list, which is also a list1 reference
String s = list1.get(0); // Type mismatch, leads to runtime error
报错
正确方法:(通配符)
ArrayList<?> list = new ArrayList<>();
ArrayList<String> list1 = new ArrayList<>();
list = list1; // Allowed, but list is now read-only
有于list类型不确定,地址指向了list1(ArrayList<String>),为了保证类型安全,设定为list只可以读取数据不能增或改
限定范围的通配符
<? extends Object>意味着指定的类型小于或等于Object,依旧只可读.
<? super String>意味着指定类型大于或等于String类,由于String一定是本类或子类,所以可以在此类型中修改数据(多态)