JAVA快速回顾

Posted ztytoby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA快速回顾相关的知识,希望对你有一定的参考价值。

原文来自:

Java 关键字_w3cschool

 

1. JAVA关键字/保留字/标识符

abstract

class extends implements null strictfp true
assert const false import package super try
boolean continue final instanceof private switch void
break default finally int protected synchronized volatile
byte do float interface public thix while
case double for long return throw  
catch else goto native short throws  
char enum if new static transient  

虽然不知道网站为啥这么排列,也许学着学着就知道了吧。

以上这几个不能当标识符标识符就是程序员自己给(变量、方法、类、标签(?))命名的名字。

标识符格式:

"字母"、"$"或"_"作为开头,后续可以是"字母"、"$"、"_"或"数字"

区分大小写! !

2.数据类型

1.布尔类型

boolean,数据只有true 和 false,且不能用1/0表示(我记得python好像是可以的?总之留意一下)。

2.整数类型

byte 字节,范围-128 ~ 127 (28

short 短类型,范围-32768 ~ 32767 (216

int 整型,范围-2147483648 ~ 2147483648 (232

long 长型,范围-9223372036854775808 ~ 9223372036854775807 (264)指定的时候需要在文本末附加一个l或L,例如long a = 12345678912345L(不附加会怎么样呢?下次试试)

未完。。。。。。

 

Java容器(ListSetMap)知识点快速复习手册(下)

前言

本文快速回顾了Java中容器的知识点,用作面试复习,事半功倍。

上篇:容器概览,容器中用到的设计模式,List源码

中篇:Map源码

下篇:Set源码,容器总结

其它知识点复习手册

  • Java基础知识点面试手册(上)
  • Java基础知识点面试手册(下)
  • Java容器(List、Set、Map)知识点快速复习手册(上)
  • Java容器(List、Set、Map)知识点快速复习手册(中)

HashSet

http://wiki.jikexueyuan.com/project/java-collection/hashset.html

https://segmentfault.com/a/1190000014391402

关键词:

  • 默认容量16,扩容两倍,加载因子0.75

  • 允许元素为null

  • 实现Set接口

  • 不保证迭代顺序

  • 非同步

  • 初始容量非常影响迭代性能

  • 底层实际上是一个HashMap实例

public HashSet() {map = new HashMap<>();}

如果添加的是在 HashSet 中不存在的,则返回 true;如果添加的元素已经存在,返回 false。

对于 HashSet 中保存的对象,请注意正确重写其 equals 和 hashCode 方法,以保证放入的对象的唯一性。

HashSet 和 HashMap 的区别

重要:

  1. HashMap中使用键对象来计算hashcode值

  2. HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
    技术图片
    在这里插入图片描述

TreeSet

关键词

  • 实现NavigableSet接口
  • 可以实现排序功能
  • 底层实际上是一个TreeMap实例
  • 非同步
  • 不允许为null

LinkedHashSet

关键词

  • 迭代是有序的
  • 允许为null
  • 底层实际上是一个HashMap+双向链表实例(其实就是LinkedHashMap)
  • 非同步
  • 性能比HashSet差一丢丢,因为要维护一个双向链表
    初始容量与迭代无关(与LinkedHashMap相同),因为LinkedHashSet迭代的是双向链表

总结Set

HashSet:

  • 无序,允许为null,底层是HashMap(散列表+红黑树),非线程同步
    TreeSet:

  • 有序,不允许为null,底层是TreeMap(红黑树),非线程同步
    LinkedHashSet:

  • 迭代有序,允许为null,底层是HashMap+双向链表,非线程同步

WeekHashMap

存储结构

WeakHashMap 的 Entry 继承自 WeakReference,被 WeakReference 关联的对象在下一次垃圾回收时会被回收。

WeakHashMap 主要用来实现缓存,通过使用 WeakHashMap 来引用缓存对象,由 JVM 对这部分缓存进行回收。

1private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>
2

ConcurrentCache

Tomcat 中的 ConcurrentCache 使用了 WeakHashMap 来实现缓存功能。

ConcurrentCache 采取的是分代缓存:

  • 经常使用的对象放入 eden 中,eden 使用 ConcurrentHashMap 实现,不用担心会被回收(伊甸园);
  • 不常用的对象放入 longterm,longterm 使用 WeakHashMap 实现,这些老对象会被垃圾收集器回收。
  • 当调用 get() 方法时,会先从 eden 区获取,如果没有找到的话再到 longterm 获取,当从 longterm 获取到就把对象放入 eden 中,从而保证经常被访问的节点不容易被回收。
  • 当调用 put() 方法时,如果 eden 的大小超过了 size,那么就将 eden 中的所有对象都放入 longterm 中,利用虚拟机回收掉一部分不经常使用的对象。
1public final class ConcurrentCache<K, V> {
 2
 3    private final int size;
 4
 5    private final Map<K, V> eden;
 6
 7    private final Map<K, V> longterm;
 8
 9    public ConcurrentCache(int size) {
10        this.size = size;
11        this.eden = new ConcurrentHashMap<>(size);
12        this.longterm = new WeakHashMap<>(size);
13    }
14
15    public V get(K k) {
16        V v = this.eden.get(k);
17        if (v == null) {
18            v = this.longterm.get(k);
19            if (v != null)
20                this.eden.put(k, v);
21        }
22        return v;
23    }
24
25    public void put(K k, V v) {
26        if (this.eden.size() >= size) {
27            this.longterm.putAll(this.eden);
28            this.eden.clear();
29        }
30        this.eden.put(k, v);
31    }
32}

常见问题总结

Enumeration和Iterator接口的区别

Iterator替代了Enumeration,Enumeration是一个旧的迭代器了。

与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。

区别有三点:

  • Iterator的方法名比Enumeration更科学
  • Iterator有fail-fast机制,比Enumeration更安全
  • Iterator能够删除元素,Enumeration并不能删除元素

ListIterator有什么特点

  • ListIterator继承了Iterator接口,它用于遍历List集合的元素。
  • ListIterator可以实现双向遍历,添加元素,设置元素
    技术图片
    在这里插入图片描述

    与Java集合框架相关的有哪些最好的实践

如果是单列的集合,我们考虑用Collection下的子接口ArrayList和Set。

如果是映射,我们就考虑使用Map

  • 是否需要同步:去找线程安全的集合类使用

  • 迭代时是否需要有序(插入顺序有序):去找Linked双向列表结构的

  • 是否需要排序(自然顺序或者手动排序):去找Tree红黑树类型的(JDK1.8)

  • 估算存放集合的数据量有多大,无论是List还是Map,它们实现动态增长,都是有性能消耗的。在初始集合的时候给出一个合理的容量会减少动态增长时的消耗

  • 使用泛型,避免在运行时出现ClassCastException

  • 尽可能使用Collections工具类,或者获取只读、同步或空的集合,而非编写自己的实现。它将会提供代码重用性,它有着更好的稳定性和可维护性

参考

  • https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Java%20%E5%AE%B9%E5%99%A8.md
  • 公众号:Java3y
  • Eckel B. Java 编程思想 [M]. 机械工业出版社, 2002.
  • Java Collection Framework
  • Iterator 模式
  • Java 8 系列之重新认识 HashMap
  • What is difference between HashMap and Hashtable in Java?
  • Java 集合之 HashMap
  • The principle of ConcurrentHashMap analysis
  • 探索 ConcurrentHashMap 高并发性的实现机制
  • HashMap 相关面试题及其解答
  • Java 集合细节(二):asList 的缺陷
  • Java Collection Framework – The LinkedList Class

关注我

本人目前为后台开发工程师,主要关注Python爬虫,后台开发等相关技术。

原创博客主要内容

  • 笔试面试复习知识点手册
  • Leetcode算法题解析(前150题)
  • 剑指offer算法题解析
  • Python爬虫相关实战
  • 后台开发相关实战

同步更新以下博客

Csdn

http://blog.csdn.net/qqxx6661

拥有专栏:Leetcode题解(Java/Python)、爬虫开发

知乎

https://www.zhihu.com/people/yang-zhen-dong-1/

拥有专栏:码农面试助攻手册

掘金

https://juejin.im/user/5b48015ce51d45191462ba55

简书

https://www.jianshu.com/u/b5f225ca2376

个人公众号:Rude3Knife

技术图片

以上是关于JAVA快速回顾的主要内容,如果未能解决你的问题,请参考以下文章

上周热点回顾(9.26-10.2)

Java容器(ListSetMap)知识点快速复习手册(下)

快速排序算法回顾 (Python实现)

Java容器(ListSetMap)知识点快速复习手册(上)

SQL语法快速回顾

快速回顾MySQL:汇总和分组