(1),关于 LinkedHashMap  TreeMap HashMap 之间的区别:

HashMap 是无序的,LinkedHashMap 由于内部维护了一个记录的链表,数据操作的前后顺序都会在链表上下节点保存着;

而TreeMap 内部的数据是有序的

分析如下:

  1. .LinkedHashMap 我们看类结构上是实现了HashMap ,在添加元素的时候,在实现添加put 方法时候,重写了其newNode 方法,如下:
  2.  
  3. 我们看HashMap newNode 方法: 就是普通的创建了一个节点对象
  4.  
  5. // Create a regular (non-tree) node
  6. Node<K,V> newNode(int hash, K key, V value, Node<K,V> next) {
  7. return new Node<>(hash, key, value, next);
  8. }
  9.  
  10. 我们再看LinkedHashMap 重写的newNode 方法:
  11. Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
  12. LinkedHashMap.Entry<K,V> p =
  13. new LinkedHashMap.Entry<K,V>(hash, key, value, e);
  14. linkNodeLast(p);
  15. return p;
  16. }
  17.  
  18. //链表操作
  19. // link at the end of list
  20. private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
  21. LinkedHashMap.Entry<K,V> last = tail;
  22. tail = p;
  23. if (last == null)
  24. head = p;
  25. else {
  26. p.before = last;
  27. last.after = p;
  28. }
  29. }

我们看一看TreeMap 结构: 对于数据都要进行比较,然后再判断放到数的左边还是右边,然后进行红黑树自旋

  1. public V put(K key, V value) {
  2. Entry<K,V> t = root;
  3. if (t == null) {
  4. compare(key, key); // type (and possibly null) check
  5.  
  6. root = new Entry<>(key, value, null);
  7. size = 1;
  8. modCount++;
  9. return null;
  10. }
  11. int cmp;
  12. Entry<K,V> parent;
  13. // split comparator and comparable paths
  14. Comparator<? super K> cpr = comparator;
  15. if (cpr != null) {
  16. do {
  17. parent = t;
  18. cmp = cpr.compare(key, t.key);
  19. if (cmp < 0)
  20. t = t.left;
  21. else if (cmp > 0)
  22. t = t.right;
  23. else
  24. return t.setValue(value);
  25. } while (t != null);
  26. }
  27. else {
  28. if (key == null)
  29. throw new NullPointerException();
  30. @SuppressWarnings("unchecked")
  31. Comparable<? super K> k = (Comparable<? super K>) key;
  32. do {
  33. parent = t;
  34. cmp = k.compareTo(t.key);
  35. if (cmp < 0)
  36. t = t.left;
  37. else if (cmp > 0)
  38. t = t.right;
  39. else
  40. return t.setValue(value);
  41. } while (t != null);
  42. }
  43. Entry<K,V> e = new Entry<>(key, value, parent);
  44. if (cmp < 0)
  45. parent.left = e;
  46. else
  47. parent.right = e;
  48. fixAfterInsertion(e);
  49. size++;
  50. modCount++;
  51. return null;
  52. }

(2).java 类加载器,以及委托机制

  java 类加载器分为引导,扩展,系统 三类类加载器  引导类加载器主要负责加载java 类库下的包,扩展类加载器主要负责加载扩展包(e x t),系统类加载器主要负责加载我们的Java 文件 以及第三方j a r包

  双亲委托机制原理:

  1.当系统加载器加载一个class 的时候,他自己不会自己器加载这个类,而是把这个类加载的请求交给他的父加载器(扩展加载器)ExtClassLoader 去完成;

  2.到了扩展加载器加载时候,他首先也不会自己去尝试加载这个类,而是又把这个类加载请求交给你它的父加载器(引导加载器)去完成

  3.然后到了引导加载器加载的时候,如果加载未找到,则会让它下级ExtClassLoader 加载;

  4.如果ExtClassLoader也加载失败,则就使用系统加载器进行加载,系统记载器如果没有发现,就会抛出ClassNotFound 异常

  为什么会设计这种双亲委托机制进行类的加载:

  为了安全,为了防止外部恶意进行自定义java 类库的类,达到安全的作用以及优先级作用

(3).线程池:

  创建线程池又如下参数需要进行配置:

  1.     corePoolSize:核心线程数
        maximumPoolSize:最大线程数
        keepAliveTime:线程存活的时间
        workQueue:任务队列
        threadFactory:线程工厂
        handler:在队列满了以及线程数已经到达了最大线程数的时候,触发此handler

  线程池要与数据库连接池要区别开,线程池这里的实现是如果我的Runnable 任务能够被队列一直容纳的话,线程的数量始终是核心线程的数量,只有在队列满了

之后,才会进行创建新的线程<最大线程数;这个是要注意的;

  1. public ThreadPoolExecutor(int corePoolSize,
  2. int maximumPoolSize,
  3. long keepAliveTime,
  4. TimeUnit unit,
  5. BlockingQueue<Runnable> workQueue,
  6. ThreadFactory threadFactory,
  7. RejectedExecutionHandler handler) {....}

  举个例子:如下代码,只会创建两个核心线程,剩余的4个任务是放到了LinkedBlockingQueue 中;

  1. public static void main(String[] args) {
  2. /**
  3. * 核心线程为2
  4. * 最大线程为6
  5. * LinkedBlockingQueue 容纳 Integer.MAX_VALUE个任务
  6. */
  7. ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 6,
  8. 0L, TimeUnit.MILLISECONDS,
  9. new LinkedBlockingQueue<Runnable>());
  10.  
  11. pool.submit(()-> fs());
  12. pool.submit(()-> fs());
  13. pool.submit(()-> fs());
  14. pool.submit(()->fs());
  15. pool.submit(()->fs());
  16. pool.submit(()->fs());
  17. pool.submit(()->fs());
  18. pool.submit(()->fs());
  19.  
  20. }
  21.  
  22. public static void fs(){
  23. try {
  24. Thread.sleep(1000);
  25. System.out.println(Thread.currentThread().getName());
  26. }catch (Exception E){
  27.  
  28. }
  29.  
  30. }

 (4).maven 重要的使用:

  1. 1.查看项目完整的依赖数:mvn dependency:tree -Dverbose
  2. 2.查看依赖树中包含某个groupIdartifactId的依赖链 mvn dependency:tree -Dverbose -Dincludes=com.alibaba:

(5).git常用命令:

  1. 场景:在切换分支,想要保存原有分支修改未提交的文件;在切换回来的时候还原
  1. git stash save "name": 将未提交的文件保存到仓库里并命名;
  2. git stash list :查看仓库保存的文件;
  3. git stash pop stash@{0} :仓库的文件被弹出恢复根据stash list 索引

git 版本会退:

  //查看日志

  git reflog --pretty=oneline

  1.  git reset --hard 目标版本号

(6).SL4J 日志框架体系(使用slf4j 进行统一日志管理):

  1. SLF4J 是Java 日志的门面,用于统一管理java 混乱的日志框架与项目日志框架不统一的问题,并不提供日志系统的统一实现;

  2.SLF4J 的具体实现有slf4j-simple、logback,要使用log4j 需要使用slf4j-log4j12来实现slf4j;

  3.jcl-over-slf4j ,log4j-over-slf4j, jul-to-slf4j 用于替换commons-logging, log4j, java util logging 原有实现;

(7) .java  默认的环境变量:

  1. java默认的系统变量有下面这些:
  2.  
  3. java.version:java运行时版本
  4.  
  5. java.vendor:java运行时环境供应商
  6.  
  7. java.vendor.url:java供应商url
  8.  
  9. java.home;java安装目录
  10.  
  11. java.vm.specification.version:java虚拟机规范版本
  12.  
  13. java.vm.specification.vendor:java虚拟机规范供应商
  14.  
  15. java.vm.specification.name:java虚拟机规范名称
  16.  
  17. java.vm.version:java虚拟机实现版本
  18.  
  19. java.vm.vendor:java虚拟机实现供应商
  20.  
  21. java.vm.name:java虚拟机实现名称
  22.  
  23. java.specification.version:java运行时环境规范版本
  24.  
  25. java.specification.vendor:java运行时环境规范运营商
  26.  
  27. java.specification.name:java运行时环境规范名称
  28.  
  29. java.class.version:java类格式版本
  30.  
  31. java.class.path:java类路径
  32.  
  33. java.library.path:加载库是搜索的路径列表
  34.  
  35. java.io.tmpdir:默认的临时文件路径
  36.  
  37. java.compiler:要使用的JIT编译器的路径
  38.  
  39. java.ext.dirs:一个或者多个扩展目录的路径
  40.  
  41. os.name:操作系统的名称
  42.  
  43. os.arch:操作系统的架构
  44.  
  45. os.version:操作系统的版本
  46.  
  47. file.separator:文件分隔符(在unix系统中是“/”)
  48.  
  49. path.separator:路径分隔符(在unix系统中是“:”)
  50.  
  51. line.separator:行分隔符(在unix系统中是“/n”)
  52.  
  53. user.name:用户的账户名称
  54.  
  55. user.home:用户的主目录
  56.  
  57. user.dir:用户的当前工作目录

Java 重要知识点,踩过的坑的更多相关文章

  1. java 反射的踩的一个坑

    今天工作的时候用到了一个反射.其业务简单描述为:系统启动时将需要定时调用的方法签名保存到数据库中,开启线程定时从数据库中读取对应的方法签名,通过反射生成实例后调用方法.完成一定的定时任务. 写到的方法 ...

  2. 踩过无数坑实现的哈夫曼压缩(JAVA)

    最近可能又是闲着没事干了,就想做点东西,想着还没用JAVA弄过数据结构,之前搞过算法,就试着写写哈夫曼压缩了. 本以为半天就能写出来,结果,踩了无数坑,花了整整两天时间!!orz...不过这次踩坑,算 ...

  3. "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"

    欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...

  4. 初学spring boot踩过的坑

    一.搭建spring boot环境 maven工程 pom文件内容 <project xmlns="http://maven.apache.org/POM/4.0.0" xm ...

  5. elasticsearch2.3.3集群搭建踩到的坑

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 作者原来搭建的环境是0.95版本 现在升级到2.3.3版本, ...

  6. wrk 使用记录及踩过的坑

    wrk是什么?https://github.com/wg/wrk wrk 是一个非常小巧高效的开源性能测试工具,支持lua脚本来创建复杂的测试场景.wrk 的一个很好的特性就是能用很少的线程压出很大的 ...

  7. 在Mac osx使用ADT Bundle踩过的坑

    前言 本篇博客整理一下笔者在Mac下使用ADT Bundle踩过的坑,Google现在也不支持Eclipse了,开发者也到了抛弃Eclipse的时候,但考虑到大部分Java的开发者还是比较习惯与Ecl ...

  8. 那些移动端web踩过的坑

    原文链接:https://geniuspeng.github.io/2017/08/24/mobile-issues/ 扔了N久,还是捡回来了.好好弄一下吧.刚工作的时候挺忙的,后来不那么忙了,但是变 ...

  9. 转载:appium踩过的坑

    原文地址:http://blog.csdn.net/wirelessqa/article/details/29188665 自己的操作:由于在window上安装appium时,报各种错误:所以选择在u ...

  10. 初学Java 精简知识点总结

    面对Java丰富的知识资料,很多初学者难免觉得迷惘,该学什么,怎么去学?下面给大家讲Java基础知识做了精简总结,来帮助你梳理学习思路,赶快看看吧! 方法/步骤1 对象的初始化(1) 非静态对象的初始 ...

随机推荐

  1. Quartz.Net—初识

    什么是Quartz.Net 计划任务,定时框架.大到可以做灾难转移  负载均衡.小到可以做定时生成数据,数据更新等等. 官网 http://www.quartz-scheduler.org/    Q ...

  2. Python 解LeetCode:394 Decode String

    题目描述:按照规定,把字符串解码,具体示例见题目链接 思路:使用两个栈分别存储数字和字母 注意1: 数字是多位的话,要处理后入数字栈 注意2: 出栈时过程中产生的组合后的字符串要继续入字母栈 注意3: ...

  3. 【Docker】:全面认识Docker和基本指令

    Docker逐渐成为虚拟化技术的佼佼者,接下来会推出一系列的Docker相关技术文章,Docker技术也是架构师的必备技能. 什么是Docker Docker 是一个开源的应用容器引擎,基于Go语言, ...

  4. 又是a+b

    题目描述: 给定两个整数 a, b (a, b 均不超过 int 类型的表示范围),求出 a + b 的和.输入描述: 多组输入,每组输入为一行,里面有 2 个数 a, b.输出描述: 对于每一组输入 ...

  5. UVALive-8201-BBP Formula

    8201-BBP Formula Time limit: 3.000 seconds In 1995, Simon Plouffe discovered a special summation sty ...

  6. Python08之分支和循环3(for、while循环)

    一.for语句: for 目标 in 表达式: 循环体 i = "湖人总冠军" for each in i: print(each) 湖 人 总 冠 军 for each in i ...

  7. 《The Google File System》 笔记

    <The Google File System> 笔记 一.Introduction 错误是不可避免的,应当看做正常的部分而不是异常.因此需要设计持续监控,错误检查,容错,自动恢复的系统. ...

  8. 微信小程序的页面跳转==编程式导航传参 和 标签的方法传参==以及如何过去传递过来的参数

    小程序导航传参接收传递过来的参数 在onload中 实例

  9. javascript之instanceof

    定义和用法 instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上. 语法: object instanceof construct ...

  10. C# 卡控时间输入

    int hour = (int.Parse(DateTime.Now.Hour.ToString())) * 60;        int minute = int.Parse(DateTime.No ...