集合框架和泛型——JAVA
@月月鸟
集合
数组与集合的区别
- 数组可以存储基本数据类型或者引用数据类型,集合只能存储引用数据类型,如果存储基本数据类型,会自动转换为包装类型 。
- 数组在定义的时候,就会确定存储的数据类型,即只能存储一种数据类型,集合中如果没有泛型限制,默认存储的都是Object类型。
- 数组的长度是固定不变的,不能够进行自动增长,而集合是可以根据数据的多少进行自动增长。
List接口
1. 使用ArrayList类动态存储数据
ArrayList类的常用方法
- boolean add(Object o) 在列表末尾添加元素o,其实位置从0开始。
- void add(int index,Object o) 在指定位置添加元素o,索引位置必须介于0和列表中元素个数之间
- int size() 列表中的元素个数
- Object get(int index)返回列表中的元素个数。
- voidset(int index,Object obj)返回指定位置处的元素,取出的元素是Object类型,使用前需要进行强制类型转换。
- void set(int index,Object obj) 将index 索引位置的元素替换为obj。
- boolean contians(Ojbect o)判断列表中是否存在指定元素o。
- int index(Object obj)返回元素在集合张总出现的索引位置 。
- boolean remove(Ojbect o) 从列表中产出元素o。
- Ojbect remove(inr index)从列表中删除指定位置的元素,起始索引位置从0开始。
2. 使用ListkedList类动态存储数据
- void addFirst(Object obj)将指定元素插入到当前集合的首部。
- void addLast(Object obj)将指定元素插入到当前集合的尾部。
- Object getFirst()获得当前集合的第一个元素。
- Object get Last()获得当前集合的最后一个元素。
- Object removeFirst()移除并返回当前集合的第一个元素。
- Object removeLast()移除并返回当前集合的最后一个元素。
Set接口
使用HashSet类动态存储数据
- void clear() 清除所有元素
- boolean isEmpty() 如果Set不包含任何元素,返回true
- boolean contains(Object o)如果Set包含指定元素o,返回true
- boolean remove(Object o)如果指定元素o存在于Set中,则将其移除
- int size() 集合中元素的数目
Iterator接口
hasNext()判断是否存在下一个可访问的元素,如果有元素可以迭代,则返回true
next()返回要访问的下一个元素。
使用Iterator接口遍历
Iterator it=list.iterator();
while (it.hasNext()){
数据类型 变量名=(数据类型)it.next();
}
Map接口
使用HashMap类动态存储数据
- void put(Object key,Object value); 存储键值对
- Object get(Object key); 根据键获取值 (键是唯一的)
- int size(); 获取集合中的键值对数量
- boolean containsKey(Object key); 是否包含指定的键
- boolean containsValue(Object value); 是否包含指定的值
- Set keySet(); 获取所有键的集合
- Collection values(); 获取所有值的集合
- Object remove(Object key); 根据键删除值 会返回被删除的值
- boolean isEmpty(); 判断是否是空集合
- void clear(); 清空集合内容
Collections类
- void sort(集合); 对集合进行升序排序
- int max(集合); 获取集合中的最大值
- int min(集合); 获取集合中的最小值
- int binarySearch(集合,要查找的元素); 查找指定的键
- void shuffle(集合); 打乱集合元素顺序
重点
1. Collection 和 Collections 有什么区别?
Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。
Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections. sort(
2. List 和 Set 区别
List,Set都是继承自Collection接口
List特点:元素有放入顺序,元素可重复
Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉
(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
3. Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
4. List 和 Map 区别
List是对象集合,允许对象重复。
Map是键值对的集合,不允许key重复。
5. Arraylist 与 LinkedList 区别
Arraylist:
优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
LinkedList:
优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
适用场景分析:
当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。
6. HashMap 和 Hashtable 的区别
1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
2.hashTable同步的,而HashMap是非同步的,效率上比hashTable要高。
3.hashMap允许空键值,而hashTable不允许。
注意:
TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
7. HashSet 和 HashMap 区别
set是线性结构,set中的值不能重复,hashset是set的hash实现,hashset中值不能重复是用hashmap的key来实现的。
map是键值对映射,可以空键空值。HashMap是Map接口的hash实现,key的唯一性是通过key值hash值的唯一来确定,value值是则是链表结构。
他们的共同点都是hash算法实现的唯一性,他们都不能持有基本类型,只能持有对象
8. HashMap 的工作原理及代码实现
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。
当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。
如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
HashMap是基于哈希表的Map接口的非同步实现,提供所有可选的映射操作,并允许使用null值和null键,不保证映射的顺序;HashMap是一个“链表散列”的数据结构,即数组和链表的结合体;它的底层就是一个数组结构,数组中的每一项又是一个链表,每当新建一个HashMap时,就会初始化一个数组;
泛型
泛型的定义语法格式
类1或者接口<类型实参>对象=new 类2<实型实参>();
注意:首先,“类2”可以是“类1”本身,可以是“类1”的子类,还可以是接口的实现类;其次,“类2”的类型实参必须与“类1”中类型实参相同。
例如:
ArrayListList=new ArrayList();
例如:
ListnewsTItleList=new ArrayList();
深入泛型:
泛型类:
访问修饰符 class className
public class GenericClass{
}
泛型实例类:
new className(ageList);
new GenericClass(“haha”)
泛型 接口:
public interface Test{
public T print(T t);
}
泛型方法与可变参数列表能够很好地共存:
public class GenericVarargs {
public static <T> List<T> makeList(T... args) {
List<T> result = new ArrayList<T>();
for (T t : args) {
result.add(t);
}
return result;
}
public static void main(String[] args) {
List<String> ls = makeList("A");
System.out.println(ls);
ls = makeList("A", "B", "C");
System.out.println(ls);
ls = makeList("ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""));
System.out.println(ls);
}
}
以上内容可能会有出入,仅供参考,部分出自转载,欢迎大家踊跃留言指正