欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

集合框架和泛型——JAVA

程序员文章站 2022-05-23 14:22:43
...

@月月鸟

集合

数组与集合的区别

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

集合框架和泛型——JAVA

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);
    }
}

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

相关标签: 集合和泛型