有哪些用960gs做的网站,58同城网站建设要多少钱,seo网站推广简历,品牌型网站制挑战第 2 天 ArrayList和linkedList的区别HashMap和HashTable的区别Collection 与 Collections 的区别Java的四种引用泛型常用特点 ArrayList和linkedList的区别
底层数据结构#xff1a;
ArrayList#xff1a;基于动态数组实现#xff0c;支持快速随机访问。LinkedList
ArrayList基于动态数组实现支持快速随机访问。LinkedList基于双向链表实现适合频繁的插入和删除操作。
随机访问性能
ArrayList由于是基于数组随机访问速度快时间复杂度为O(1)。LinkedList由于是基于链表随机访问速度慢时间复杂度为O(n)。
插入和删除性能
ArrayList在数组中间插入或删除元素时需要移动后续所有元素效率较低时间复杂度为O(n)。LinkedList在链表中插入或删除元素时只需改变节点的指针效率高时间复杂度为O(1)。
内存占用
ArrayList每个元素只存储数据内存利用率高。LinkedList每个元素除了存储数据外还需要存储两个指针指向前一个和后一个元素内存利用率低。
容量扩展
ArrayList动态数组当容量不足时会自动扩展但扩展操作涉及复制数组有额外开销。LinkedList不需要预先分配容量可以动态地添加节点没有扩展容量的开销。
线程安全
两者都不是线程安全的但在多线程环境下LinkedList的插入和删除操作可能更安全因为它们通常涉及单个节点的修改。
使用场景
ArrayList适用于频繁读取元素的场景如作为缓存。LinkedList适用于频繁插入和删除元素的场景如实现队列或栈。
其他方法
ArrayList提供toArray方法将列表转换为数组asList方法将数组转换为固定大小的列表。LinkedList除了List接口的方法外还提供了额外的方法如addFirst、addLast、removeFirst和removeLast等用于在链表的头部或尾部进行操作。
HashMap和HashTable的区别
父类不同
HashMap继承自AbstractMap类。Hashtable继承自Dictionary类。
接口方法不同
Hashtable提供了elements()和contains()方法这些方法在Dictionary类中定义。HashMap没有提供这两个方法。
对null的支持
Hashtable不允许key和value为null。HashMap允许key为null但只能有一个允许有多个value为null。
线程安全性
HashMap非线程安全适合单线程环境。Hashtable线程安全每个方法都加了synchronized关键字适合多线程环境。
性能
HashMap由于非线程安全通常比Hashtable性能高。Hashtable由于线程安全性能可能不如HashMap。
替代方案
当需要线程安全时可以使用ConcurrentHashMap它比Hashtable性能更好因为它使用了分段锁。
初始容量和扩充容量
两者都可以设置初始容量和负载因子但具体实现和默认值可能不同。
计算hash值的方法
两者可能使用不同的算法来计算hash值这会影响元素的分布和冲突解决。
Collection 与 Collections 的区别
Collection
是一个接口定义了所有单列集合即不包含重复元素的集合的基本操作。子接口包括Set不允许重复的集合、List有序集合可以重复。实现类包括ArrayList、LinkedList、Vector、Stack等。
Collections
是一个工具类提供了一系列静态方法来操作或返回各种集合。提供的方法包括搜索、排序、线程安全化等操作。不能被实例化类似于Java中的其他工具类如Arrays。
功能区别
Collection定义了集合的基本操作如添加、删除、遍历等。Collections提供了对集合的辅助操作如排序sort、搜索binarySearch、同步synchronizedCollection等。
使用场景
当你需要创建一个集合并进行基本操作时你会使用实现Collection接口的类。当你需要对集合进行更高级的操作如排序或搜索时你会使用Collections类提供的方法。
Java的四种引用
强引用Strong Reference
最常见的引用类型。只要强引用还存在垃圾回收器永远不会回收被引用的对象。声明方式Object obj new Object();
软引用Soft Reference
内存不足时垃圾回收器会回收软引用指向的对象。适用于缓存场景用于内存敏感的高速缓存。声明方式SoftReference softRef new SoftReference(new Object());
弱引用Weak Reference
只要垃圾回收器发现了弱引用对象就会回收该对象不管当前内存是否充足。适用于实现缓存、监听器等其中对象不再使用时可以被自动回收。声明方式WeakReference weakRef new WeakReference(new Object());
虚引用Phantom Reference
虚引用对象在垃圾回收时会被放入引用队列ReferenceQueue中但不会阻止对象的回收。用于跟踪对象被垃圾回收的活动进行资源释放等操作。必须与ReferenceQueue一起使用。声明方式PhantomReference phantomRef new PhantomReference(new Object(), new ReferenceQueue());
引用队列ReferenceQueue
用于跟踪垃圾回收活动当引用的对象被回收时相应的引用会被放入队列中。
使用场景
强引用普通对象的引用。软引用内存敏感的高速缓存。弱引用缓存、监听器等对象不再使用时可以被自动回收。虚引用对象销毁前的操作如资源释放。
回收机制
强引用不会被回收。软引用内存不足时被回收。弱引用一旦发现即被回收。虚引用在对象被回收前被放入引用队列。
注意
引用类型指的是对象的引用而不是Reference类的子类如SoftReference的引用。
泛型常用特点
泛型定义
泛型是Java SE 1.5引入的特性。允许代码与特定的数据类型无关从而提高代码的重用性。
泛型概念
泛型提供了一种方式使得类、接口和方法可以在不知道具体类型的情况下编写。可以在代码执行时指定具体的类型。
泛型使用示例
例如ArrayList是一个泛型类可以存储任何类型的元素。通过指定类型参数如List可以约束集合中元素的类型。
使用泛型的好处
类型安全编译时检查类型减少运行时错误。代码重用一个类可以处理多种数据类型。减少类型转换避免了不必要的类型转换提高代码的可读性和简洁性。提高性能避免了类型擦除带来的性能开销。
类型擦除
Java泛型在编译时会被擦除即泛型信息不会保留在字节码中。这意味着运行时泛型不会增加额外的存储开销。
泛型与集合
使用泛型可以定义一个集合来存放不同类型的数据同时保持类型安全。例如可以定义一个List来存储整数而不需要将所有元素都存储为Object类型。
泛型约束
可以通过泛型约束如extends和super关键字来限制泛型类型。例如List? extends Number可以存储任何Number子类型的元素。
泛型通配符
通配符如?允许在泛型中使用未知的类型。提供了灵活性允许在不知道具体类型的情况下操作泛型集合。