【记录后端学习—Java基础 6】


内部类

内部类的定义:可以将一个类的定义放在另一个类的内部,这就是内部类。定义在类内部的类,持有外部类的引用,但对其他外部类不可见。

创建内部类

示例如下

public class OuterClass {
 	private String name ;
 	private int age;
 
 	class InnerClass{
 		public InnerClass(){
 			name = "cxuan";
 			age = 25;
 		}
 	}
}

以上代码中,InnerClass就是OuterClass的一个内部类,每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。内部类拥有外部类的访问权。

内部类不仅仅可以定义在类的内部,还可以定义在方法和作用域内部,这被称为局部内部类,除此之外,还有匿名内部类、内部类可以实现Java中的多重继承。

定义内部类的方式:

  • 一个在方法中定义的类(局部内部类)
  • 一个定义在作用域内的类,这个作用域在方法的内部(成员内部类)
  • 一个实现了接口的匿名类(匿名内部类)
  • 一个匿名类,它扩展了非默认构造器的类
  • 一个匿名类,执行字段初始化操作
  • 一个匿名类,它通过实例初始化实现构造

每一个类都会产生一个.class文件,其中包含了如何创建该类型的对象的全部信息,内部类信息的表示可以用 $ 来表示,比如OutClass$InnerClass.class

集合

集合Collection是一个庞大的集合框架。
在这里插入图片描述
首先介绍Iterator

Iterable 接口

实现此接口允许对象成为 for-each 循环的目标,也就是增强for 循环,他是Java中的一种语法糖。

List<Object> list = new ArrayList();
for (Object obj: list){}

除了实现此接口的对象外,数组也可以用for-each循环遍历,如下:

Object[] list = new Object[10];
for (Object obj: list){}

也可以使用迭代器的方式进行遍历:

for(Iterator it = coll.iterator(); it.hasNext(); ){
 	System.out.println(it.next());
}

顶层接口

Collection 是一个顶层接口,它主要用来定义集合的约定。

List接口也是一个顶层接口,他继承了Collection接口,同时也是ArrayList、LinkedList等集合元素的父类。

Set接口位于与List接口同级的层次上,他同时也继承了Collection接口。Set接口提供了额外的规定。他对add、equals、hashCode方法提供了额外的标准。

Queue是和List、Set接口并列的Collection 的三大接口之一。Queue的设计用来在处理之前保持元素的访问次序。除了Collection基础的操作之外,队列提供了额外的插入,读取,检查操作。

SortedSet接口直接继承于Set接口,使用Comparable对元素进行自然排序或者使用Comparator在创建时对元素提供定制的排序规则。set的迭代器将按升序元素顺序遍历集合。

Map是一个支持key-value存储的对象,Map不能包含重复的key,每个键最多映射一个值。这个接口替代了Dictionary类,Dictionary是一个抽象类而不是接口。

ArrayList

ArrayList是实现了List接口的可扩容数组(动态数组),它的内部是基于数据实现的。

  • ArrayList可以实现所有可选择的列表操作,允许所有的元素,包括空值。ArrayList 还提供了内部存储list的方法,能够完全替代Vector,但它不是线程安全的容器。
  • ArrayList有一个容量的概念,这个数组的容量就是List用来存储元素的容量。
  • ArrayList 不是线程安全容器,如果多个线程中至少两个线程修改了ArrayList的结构会导致线程安全问题,作为替代条件应使用Collections.synchronizedList。
List list = Collections.synchronizedList(new ArrayList(...))
  • ArrayList具有fail-fast 快速失败机制,能够对 ArrayList做出失败检测。当在迭代集合的过程中该集合在结构上发生改变时,就有可能会发生fail-fast 即抛出ConcurrentModificationException 异常

Vector

Vector 同ArrayList 一样,都是基于数组实现的,只不过Vector是一个线程安全的容器,他对内部的每个方法都简单粗暴地上锁,避免多线程引起的安全性问题,但是通常这种同步方式需要的开销比较大,因此访问元素的效率要远远低于 ArrayList。

还有一点在于扩容上,ArrayList扩容后数组长度增加50%,而 Vector的扩容后数组长度会增加一倍。

LinkedList类

LinkedList是一个双向链表,允许存储任何元素(包括null)。他的主要特性如下:

  • LinkedList所有的操作都可以表现为双向性的,索引到链表的操作将遍历从头到尾
  • 这个实现也不是线程安全的,这个链表必须进行外部加锁,或者使用
List list = Collections.synchronizedList(new LinkedList(...))

Stack

堆栈是我们常说的后入先出容器。继承了Vector类,提供push和pop操作,以及在栈顶的peek方法,测试stack是否为空的empty方法,和一个寻找与栈顶距离的search方法。

HashSet

HashSet 是Set接口的实现类,由哈希表支持,实际上HashSet是HashMap的一个实例。不能保证集合的迭代顺序,允许null元素。

  • 不是线程安全的。必须进行外部加锁或者使用Collections.synchronizedSet()方法重写。

  • 支持fail-fast机制

TreeSet

TreeSet是一个基于TreeMap的 NavigableSet 实现。这些元素使用它们的自然排序或者在创建时提供的Comparator进行排序,具体取决于使用的构造函数。

  • 此实现为基本操作add,remove和contains提供了log(n)的时间成本。
  • 不是线程安全的,必须进行外部加锁或者使用
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...))
  • 支持fail-fast机制

LinkedHashSet

LinkedHashSet继承于Set,他的继承体系:
在这里插入图片描述
LinkedHashSet 是Set接口的Hash表和LinkedList的实现。这个实现不同于HashSet的是他维护着一个贯穿所有条目的双向链表。此链表定义了元素插入集合的顺序。如果元素重新插入,则插入顺序不会受到影响。

  • LinkedHashSet有两个影响其构成的参数:初始容量和加载因子。它们的定义与HashSet完全相同。
  • 不是线程安全的,如果多线程同时访问,必须加锁,或者使用
Collections.synchronizedSet
  • 支持fail-fast机制

PriorityQueue

暂时不重要

HashMap

HashMap 是一个利用哈希表原理来存储元素的集合,并且允许空的 key-value键值对。HashMap是非线程安全的。但Hashtable是线程安全的容器。HashMap也支持fail-fast机制。HashMap的实例有两个参数影响其性能:初始容量和加载因子。可以使用Collections.synchronizedMap(new HashMap(…)) 来构造一个线程安全的HashMap。

TreeMap 类

一个基于NavigableMap实现的红黑树。这个map 根据 key 自然排序存储,或者通过Comparator进行定制排序。

  • TreeMap 为 containsKey,get,put 和remove方法提供了log(n)的时间开销。
  • 不是线程安全的,必须进行外部加锁。或者使用 SortedMap m = Collections.synchronizedSortedMap(new TreeMap(…))
  • 支持fail-fast机制

LinkedHashMap 类

暂时不重要

Hashtable 类

Hashtable 类实现了一个哈希表,能够将键映射到值。任何非空对象都可以用作键或值。

  • 支持fail-fast机制
  • Hashtable是线程安全的。如果不需要线程安全的容器推荐使用HashMap,如果需要多线程高并发推荐使用ConcurrentHashMap。

IdentityHashMap 类

暂时不重要

WeakHashMap 类

暂时不重要

Collections 类

Collections不属于Java框架继承树上的内容,它属于单独的分支,Collections 是一个包装类,它的作用就是危机和框架提供某些功能实现,只包括静态方法操作或者返回collections。

同步包装

同步包装器将自动同步(线程安全性)添加到任意集合。

public static Collection synchronizedCollection(Collection c);
public static Set synchronizedSet(Set s);
public static List synchronizedList(List list);
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);
public static SortedSet synchronizedSortedSet(SortedSet s);
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m);

集合实现类特征图

集合排序随机访问key-value存储重复元素空元素线程安全
ArrayListYYNYYN
LinkedListYNNYYN
HashSetNNNNYN
TreeSetYNNNNN
HashMapNYYNYN
TreeMapYYYNNN
VectorYYNYYY
HashTableNYYNNY
ConcurrentHashMapNYYNNY
StackYNNYYY
CopyOnWriteArrayListYYNYYY
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值