《On Java进阶卷》阅读笔记(二)

第3章 集合主题

List的行为:

List是除数组之外最基本的对象存储和检索方式,基本操作如下:

  • add()用于插入元素
  • get()用于随机访问元素,这个操作在特定的List的实现成本不同
  • iterator()用于返回该序列上的iterator
  • stream()用于生成序列中元素的Stream

Set的行为:

Set的意义在于测试成员身份,也可以用于删除重复元素。

  • HashSet的输出是没有明显的顺序
  • TreeSet和ConcurrentSkipListSet都会对其元素进行排序,而且都实现了SortedSet接口来表明
  • ConcurrentSkipListSet 和 CopyOnWriteArraySet是线程安全的

Map的函数式操作是由Map.Entry对象组成的Set。这个Set又包含了stream 和parallelStream方法。

TreeMap 和 ConcurrentSkipListMap 都实现了NavigableMap 接口,这个接口的目的是解决需要选择某个 Map中部分元素的问题。

填充集合:

  1. Collections.nCopies()

第一个参数表示列表大小,第二个参数表示要添加的对象。

该方法生成的列表是固定数组大小,无法再通过其他方法添加元素,不然会报错。

public class FillTest {

    public static void main(String[] args) {

        List stringList = Collections.nCopies(4, "hello");
        System.out.println(stringList);

        stringList.add("88");
        System.out.println(stringList);
    }
}

2. Colletions.fill()

第一个参数表示非空的数组,第2个参数是待添加的对象数据。

该方法是用第2个参数覆盖第一个参数数组里的所有元素。

public class FillTest {

    public static void main(String[] args) {
        
        List stringList = new ArrayList<>();
        stringList.add("99");
        System.out.println(stringList);
        Collections.fill(stringList, "hello");
        System.out.println(stringList);
    }
}

Set与存储顺序:

集合

行为

Set接口

向Set中添加的每个元素都必须是唯一的,Set不会添加重复的元素。被添加到Set中的对象必须至少定义了equals方法,用以确定确定对象的唯一性。Set继承了Collection,而且没有添加任何东西。Set接口不保证以任何特定的顺序维护元素

HashSet

用于对快速查找时间要求较高的Set,要添加的元素必须定义hashcode和equals方法

TreeSet

有序的Set,底层是一个树结构。通过这种方式,我们可以从某个Set提取出一个有序的序列。要添加的元素必须实现Comparable接口。

LinkedHashSet

拥有HashSet的查找速度,但是内部使用了一个链表维护者我们添加元素的顺序,即插入顺序。因此,当我们在这个Set上迭代时,结果是以插入顺序出现的。要加入的元素必须定义hashcode和equals方法。

Queue:

给一端放入元素,从另一端取出元素。

PriorityQueue,优先级队列,要求放入队列中的对象实现了Comparable接口,并重写compareTo方法。

Deque,双端队列,可以在任意一端添加和移除元素。

Map:一组键-值对的集合。

集合

行为

HashMap

基于哈希表实现,使用这个类代替旧的HashTable,提供了常数时间的键值对插入和定位性能。可以通过构造器来调整其性能,因为构造器支持设置这个哈希表的容量capacity 和负载因子 load factor

LinkedHashMap

类似于HashMap,但是在便利时会以插入的顺序或最近最少使用LRU的顺序获得键值对。除遍历之外,性能比HashMap稍低。对于遍历情况,因为它用了链表来维护内部顺序,所以更快一些。

TreeMap

基于红黑树实现,当我们查看键或者键值对时,会发现他们是有序的(顺序通过Comparable或者Comparator来确定)。TreeMap的要点是,我们会以有序的方式得到结果。TreeMap是唯一提供了subMap方法的Map,它会返回树的一部分。

WeakHashMap

由弱键组成的Map,该映射锁引用的对象可以被释放。它是为解决特定类型的问题而设计的。如果在这个映射之外,已经没有指向某个特定键的引用,那么可以对这些健进行垃圾收集。

ConcurrentHashMap

线程安全的Map,没有使用同步锁。

IdentityHashMap

哈希映射,它使用 == 而不是equals 来比较键。仅用于解决特殊类型的问题,并非通用。

第4章 注解

注解是一个很受欢迎的Java新特性,它是一种结构化且接受类型检查的向代码中添加元数据的方法,并且不会导致代码被渲染得混乱和不可读。

它可以帮助我们免除部署描述文件和其他生成文件的编写工作。

Java中仅有少量的注解。

Java5引入了3个注解:

  • @Override,用来声明该方法的定义会重载基类中的某个方法。不小心写错会使编译器报错。
  • @Deprecated,如果该元素被使用了,则编译器会发出警告。
  • @SuppressWarnings,关闭不当的编译警告。

Java7引入:

  • @SafeVarargs,用于在泛型作为可变参数的方法或构造器中关闭对调用者得警告。

Java8引入:

  • @FunctionalInterface,用于表明类型声明是函数式接口。

还有几个注解是用于创建注解时使用的。

定义注解:

注解的定义要求必须要有元注解@Target和@Retention。

@Target定义了该注解可以在何处应用,例如方法或字段。

@Retention定义了该注解在源代码(SOURCE)、类文件CLASS、运行时RUNTIME中是否可用。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
    
}

注解通常包含一些可以设定值的元素,元素看起来比较像接口的方法,只不过可以指定默认值,非null的。

没有任何元素的注解被称为标记注解。

元注解:

  1. @Target,该注解可能应用的地方。可能的ElementType参数包括:
    1. CONSTRUCTOR,构造器声明
    2. FIELD,字段声明,包括枚举常量;
    3. LOCAL_VARIABLE,本地变量声明
    4. METHOD,方法声明
    5. PACKAGE,包声明
    6. PARAMETER,参数声明
    7. TYPE,类、接口,包括注解类型、或枚举的声明
  2. @Retention,注解信息可以保存多久。可能的RetentionPolicy参数包括:
    1. SOURCE,注解会被编译器丢弃
    2. CLASS,注解在类文件中可被编译器使用,但会被虚拟机丢弃
    3. RUNTIME,注解在运行时仍被虚拟机保留,因此可以通过反射读取到注解信息
  3. @Document,在Javadoc中引入该注解
  4. @Inherited,允许子类继承父类注解
  5. @Repeatable,可以多次应用于同一个声明(Java8)

注解里的元素

  • 所有的基本类型,int,float,double,boolean等
  • String类型
  • Class类
  • enum
  • Annotation,允许注解嵌套
  • 以上任何类型的数组

注解元素默认值不能为null,因为这导致很难让处理器去判断某个元素存在与否,但是可以通过检查该元素是否为特殊值来绕过这个限制。

注解不支持继承:

无法对@interface 使用 extends关键字。但是可以在注解里嵌套其他注解来优雅的去实现此效果。

注解的解析:

使用到Java的反射机制,class对象中的getAnnotation方法可以获取这个class上被使用的注解。

你可能感兴趣的:(面试,学习路线,阿里巴巴,java,笔记,python)