栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

内部类、集合

内部类

创建内部类 集合

Iterable 接口顶层接口

ArrayListVectorlinkedList类StackHashSetTreeSetlinkedHashSetPriorityQueueHashMapTreeMap 类linkedHashMap 类Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图


内部类

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

创建内部类

示例如下

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 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  Map synchronizedMap(Map m);
public static SortedSet synchronizedSortedSet(SortedSet s);
public static  SortedMap synchronizedSortedMap(SortedMap m);
集合实现类特征图
集合排序随机访问key-value存储重复元素空元素线程安全
ArrayListYYNYYN
linkedListYNNYYN
HashSetNNNNYN
TreeSetYNNNNN
HashMapNYYNYN
TreeMapYYYNNN
VectorYYNYYY
HashTableNYYNNY
ConcurrentHashMapNYYNNY
StackYNNYYY
CopyOnWriteArrayListYYNYYY
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号