集合与泛型
1、List接口
List接口继承自—Collection—lterable。
lterable接口循环迭代方式访问集合中的数据元素,定义了唯一一个返回指向集合的Iterator迭代器。它主要通过foreach方式处理集合中的元素,任何其实现类都可以通过获取指向集合的迭代实现对集合的遍历。
List 接口间接继承自lterable接口并在Collection直接父接口基础上定义更多的可操作方法,最典型就是定义了以索引方式操作集合元素的方法。
常用方法:
boolean add(Object e) void add(int index,Object element) void clear() boolean contains(Object o) Object get(int index) int size( ) lterator<E> iterator() Object remove(int index) boolean remove(Object o) Object set(int index, Object element) public int indexOf(Object target) boolean isEmpty() void sort(Comparator comparator)
ArrayList、Vector
ArrayList集合类是List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。除了实现List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector类,除了此类是不同步的)。ArrayList查找访问集合元素速度比较快,删除,插入随机操作比较慢,经常在企业级开发中使用ArrayList处理数据应用。
Vector也被称为项量集合,和ArrayList非常类似都是可变的动态数组集合,最大区别是Vector是线程同步的,相对ArrayList数据处理效率要低;在多线程中通常使用Vector处理可能被多个线程并发访问的数据。
Vector集合具有ArrayList的所有方法外,增加了public Enumeration<E> elements()方法,此方法返回Enumeration枚举接口,可使用此接口实现对集合的变量
LinkedList
常用方法;
void addFrist(Object o) void addLast() Object getFrist() Object getLast() Object removeFrist() Object removeLast()
ArrayList与LinkedList 的异同:
(1)ArrayList 与 LinkedList 均设计为非线程安全,ArrayList 内部采用数组实现(与Vector相同),LinkedList 内部采用链表结构实现。
(2)ArrayList 采用数组保存元素,意味着当大量添加元素,数组空间不足时,依然需要通过新建数组,内存复制的方式来增加内容,效率较低;而当对数组进行插入、删除操作时,又会进行循环移位操作,效率也较低;只有进行按下标查询时(get 方法),使用数组效率很高。
(3)LinkedList 采用链表保存元素,在添加元素时只需要进行一次简单的内存分配即可,效率很高;进行插入、删除操作时,只需对链表中相邻的元素进行修改即可,效率也很高;但进行按下标查询时,需要对链表进行遍历,效率较低。
(4)可以总结出 ArrayList 在进行数据的新增、插入、删除时效率较低,按下标对数据进行查找时效率较高;LinkedList 正好相反。一般来说 ArrayList 保存经常进行查询操作的集合,LinkedList适用于保存经常修改操作的集合。
+
2、Set接口
Set接口继承自——Collectionlterable
lterable接口循环迭代方式访问集合中的数据元素,定义了唯一一个返回指向集合的lterator迭代器。它主要通过foreach方式处理集合中的元素,任何其实现类都可以通过获取指向集合的迭代实现对集合的遍历。
Set接口只能存储不相等的对象,Set接口是数学Set的抽象描述,与ArrayList不同,它其中元素不带有任何索引,不能使用索引方式访问集合中元素。
Set接口通常追加,遍历元素比较慢,随机删除修改数据速度稍块。
常用方法:
boolean add(Object e) void clear() boolean contains(Object o) lterator<E> iterator( ) boolean remove(Object o) int size() boolean isEmpty0 Object[] toArray()
HashSet
此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持实现算法。HashSet不能保证S集合元素的迭代顺序,也不能保证该顺序恒久不变。HashMap允许使用null 元素。
HashSet实现不是线程同步的。如果在多个线程同时访问一个HashSet,应该做必要额外同步处理,HashSet由于不排序,通常只需效率比较高。
TreeSet
TreeSet是基于TreeMap 的 NavigableSet实现并实现SortedSet排序接口。默认按照元素的自然顺序(升序)对元素进行排序,或者根据创建set时提供的Comparator进行排序。
TreeSet不是线程同步的。如果在多个线程同时访问一TreeSet,必需做必要额同步处理。
TreeSet由于需要进行排序,因此TreeSet比HashSet效率要低。
常用方法
public TreeSet(Comparator<E> comparator)
public lterator<E> descendinglterator()降序排序迭代器
public E last() //返回最后一个
public E first()
LinkedHashSet
基于哈希表和链接列表的Set接口的实现类,与HashSet无序集合相比,LinkedHashSet的迭代是一个可以被预知的访问操作,它以添加到集合中的顺序为迭代最终顺序。
由于LinkedHashSet需要维护元素顺序,因此效率比HashSet要稍低些。
在需要保证使用Set接口并安照存储顺序迭代时使用它 //一般不用
3、Map接口
Map接口是存储键值对象的顶级集合接口。存储在Map集合中的键值对象必需确保每个键是不重复的;对于相同的键对象在添加到Map中时会产生覆盖源键值对象操作。
在通常情况下Map通过一个唯一的键查找其对应的值对象,键和值必需同时成对出现,一个键对应一个值对象。
在很多情况下可以使用Map对象替代(如果需要)实体对象,这样可以在应用程序实体类比较多的情况下减少类的定义
常用方法:
Object put(Object key,Object value) Object get(Object key) boolean containsKey(Object key) boolean containsValue(Object value) int size( ) Set<K> keySet() Collection<V> values( )boolean isEmpty) V remove(Object key) void clear()
HashMap
HashMap是继承自AbstractMap间接实现Map接口的基于哈希表算法的 Map接口的实现类。此实现提供所有可选的映射操作,允许使用null值和null 键。HashMap不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashMap不是线程安全的,如果在多线程中使用必需在程序中处理同步问题
实现类:
public HashMap() //构造一个默认初始容量16,默认加载因子 0.75
public HashMap(int initsize)
public HashMap(int initSize,float loadFactor)
Hashtable
Hashtable类实现一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。
Hashtable 与HashMap功能几乎是相同的,最大区别在于HashMap是非线程同步的,而Hashtable是线程同步的,在多线程中通常使用同步的Hashtable。
由于Hashtable 要考虑线程同步问题,因此Hashtable执行效率要比HashMap低。在非多线程中提倡使用HashMp存储键值对象,从而提供性能。
TreeMap
基于红黑树(Red-Black tree)的NavigableMap实现。NavigableMap接口是SortedMap排序Map的子接口。
TreeMap基于树形结构的排序方式实现排序,TreeMap默认以键为依据采用自然顺序进行排序,或者根据创建映射时提供的
Comparator进行排序,具体取决于使用的构造方法由于排序,通常此类比HashMap效率要低。
TreeMap 不是线程安全的,在多线程中必需手动处理同步问题。
4、Java泛型
泛型在Java中被称之为”JAVA类型”,简称。泛型是Java SE平台1.5版本增加的新特性。泛型在Java中不是一种数据类型,是一种在编译时期的特殊语法,它能够让JVM识别从而确定在应用泛型的操作中体现泛型特点,帮助程序员在开发中从泛型中获得更高效和更安全数据的管理操作。
泛型由于不是一种Java的数据类型所以在运行时,JVM将使用擦除法将泛型描述还原成未应用泛型语法的规则进行执行。
泛型基本语法:<T>
作用:
-
- 泛型能够在代码书写过程中帮助程序员提高效率
- 泛型能够在编译阶段确定数据类型是否符合要求,规避错误发生
- 泛型能够避免数据对象强制类型转换操作
- 泛型也能够支持在动态下确定数据类型
例:List<T> list...
带泛型的类:

public class GJClass<T>{ public String getClassName(T t){ return t.getClass().getName();//返回当前对象T的类型完全限定名 } }
带泛型的接口:

public interface CountManager<T>{ Double count(T countSupport, Double r); Double Count(T countSupport, Double bottom,Double height); } class CountmanagerChinaImp implements Countmanager<ComputerChina>{ } class CountManagerUsalmp implements Countmanager<ComputerUsa>{ }
泛型通配符
<?>无界通配符,占位符?通常会被处理为Object
1.当前方法中结义Object超类中的方法来功能时
2.使用泛型类不依赖于类型参数的方法时
<? extend Type> 上限通配符,? 满足是Type或其派生类型
1.集合类型存在继承关系
2.限制类型的上限标准,无下限
<? super Type>下限通配符,? 满足是 Type 的直接或间接超类型
1.集合类型存在继承关系
2.限制类型的下限标准,无上限
注意:
1 泛型通配符几乎从不会用在泛型的方法操作,对象的创建,如果集合应用泛型通配符,通常也不会调用集合相关方法插入集合元素等依赖于类型的操作﹔
2泛型通配符经常用在方法入参,方法返回值(尽量避免),成员属性字段及标识在类上,但在使用中应遵循1的习惯操作。
不能使用基本数据类型实例化泛型类
不能 new 类型参数实例 //编译错误 可以使用反射 .newInstance,但很不建议
重载方法泛型 参数禁用区
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!