集合框架和泛型——JAVA

@月月鸟

集合

数组与集合的区别

  1. 数组可以存储基本数据类型或者引用数据类型,集合只能存储引用数据类型,如果存储基本数据类型,会自动转换为包装类型 。
  2. 数组在定义的时候,就会确定存储的数据类型,即只能存储一种数据类型,集合中如果没有泛型限制,默认存储的都是Object类型。
  3. 数组的长度是固定不变的,不能够进行自动增长,而集合是可以根据数据的多少进行自动增长。

在这里插入图片描述

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类动态存储数据

  1. void put(Object key,Object value); 存储键值对
  2. Object get(Object key); 根据键获取值 (键是唯一的)
  3. int size(); 获取集合中的键值对数量
  4. boolean containsKey(Object key); 是否包含指定的键
  5. boolean containsValue(Object value); 是否包含指定的值
  6. Set keySet(); 获取所有键的集合
  7. Collection values(); 获取所有值的集合
  8. Object remove(Object key); 根据键删除值 会返回被删除的值
  9. boolean isEmpty(); 判断是否是空集合
  10. void clear(); 清空集合内容

Collections类

  1. void sort(集合); 对集合进行升序排序
  2. int max(集合); 获取集合中的最大值
  3. int min(集合); 获取集合中的最小值
  4. int binarySearch(集合,要查找的元素); 查找指定的键
  5. 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);
    }
}

以上内容可能会有出入,仅供参考,部分出自转载,欢迎大家踊跃留言指正

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值