JDK 初步

ArrayList

底层就是一个Object数组,初始容量为10,每当元素要超过容量时,重新创建一个更大的数组,并把原数据拷到新数组中来。

ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。

size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性(roughly speaking)。

每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

LinkedList

LinkedList采用双向链表。集合中的每一个元素都会有两个成员变量prev和next,分别指向它的前一元素和后一元素。

LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。注意LinkedList没有同步方法。

Vector

Vector底层实现和ArrayList类似,区别在于在许多方法上加了synchronized关键字,来实现了多线程安全。但代价是性能的降低。由于加锁的是整个集合,所以并发情况下进行迭代会锁住很长时间。

Stack

Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

HashMap

HashMap采用的是哈希表结构,用链表法来解决hash冲突。



HashMap是非同步的,并且允许null,即null value和null key。Map不保证顺序;get,put方法运行时间为常数。

但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低

HashMap有两个重要参数影响性能:初始容量(initial capacity)和负载因子(load factor)。capacity是哈希表创建时候的桶数;load factor是衡量HashMap多满的时候增加capacity的大小(也就是增加bucket的比例,默认0.75),也就是说当size >(capacity * loadFactor)的时候会出现HashMap重新初始化一个新的数组,然后把原来的所有的元素重新hash到新的数组中,所以如果你使用的场景是在短时间内需要往HashMap中添加较多的元素,那么建议不要使用HashMap的默认capacity,因为这样会引起多次的rehash(也就是ArrayList中的arrayCopy操作差不多),从而引起性能的下降。

Hashtable

Hashtable实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。Hashtable是同步的。

添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。

Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。

LinkedHashMap

在HashMap的基础上加了双链表,非同步的,并且允许null,即null value和null key。保证迭代顺序

该集合中的每个元素也都保留了前一个元素和后一个元素的“指针”。这样便可以按照插入顺序来迭代

LinkedHashMap(int,float,boolean)构造函数被用来构建LRU缓存:其迭代顺序包含了是最近最频繁的几个元素。调用put,putIfAbsent,get,getOrDefault,compute,computeIfAbsent,computeIfPresent或merge方法会导致访问相应的条目(假设key存在)。如果替换了值,replace方法只会导致访问该替换条目。putAll方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键 - 值映射的顺序。removeEldestEntry(Map.Entry)强制在将新KV添加到map时自动删除过时KV的策略。

由于要维护额外的双链表,LinkedHashMap增删操作会比HashMap慢,但迭代时会比HashMap快

TreeMap

TreeMap是红黑树基于NavigableMap的实现,非同步的

根据使用的构造器决定该map是根据key值进行自然排序(Comparable)还是按照map创建时指定的规则(Comparator)进行排序。

该实现保证了containsKey,get,put,remove操作均具有log(n)的时间复杂度

注意TreeMap维持的排序和任何排序的map一样,无论是否提供明确的比较器,要正确地实现map接口,必须有一致的equals方法。这是因为Map接口是根据equals方法定义,但是一个排序map使用compare或者compareTo进行键值的比较,所以从这个角度看,两个键值相等的元素是相等的。

HashSet

HashSet底层实现其实就是一个固定value(PRESENT属性)的HashMap,允许null,不保证迭代顺序;非同步的;

LinkedHashSet

LinkedHashSet就是一个value(PRESENT属性)固定的LinkedHashMap,允许null,保证迭代顺序;非同步的;

TreeSet

TreeSet就是一个value(PRESENT属性)固定的TreeMap,允许null,不保证迭代顺序;非同步的;

PriorityQueue

PriorityQueue是基于优先级堆(小顶堆)实现的无界优先级队列。优先级队列中的元素根据其可比较的(Comparable)自然顺序来排序,或者由构造队列时提供的比较器(Comparator)来排序,这取决于使用的是哪个构造函数。优先级队列不允许插入空元素。一个依赖自然排序的优先级队列同样不允许插入不可比较的对象。

队列的头部是与指定顺序相关的最小元素。如果有多个相同优先级的最小元素,则从中任意选取一个作为队列的头。队列的检索操作如poll()、remove()、peek()、element()都是从队列的头部元素开始。

优先级队列是无界的,但队列具有可以控制存储元素数组大小的内部容量。它总是至少和队列大小一样大。当元素被添加到优先级队列时,其容量会自动增长。队列容量的增长策略细节并没有指定。

需要注意的是,优先级队列并不是同步的。当一个线程正在修改队列时,其他多个线程不应该同时访问队列。可以使用线程安全的PriorityBlockingQueue。

实现大顶堆代码

// 大顶堆实现
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(size, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return -o1.compareTo(o2);
}
});

ConcurrentLinkedQueue

ConcurrentLinkedQueue一个基于链接节点线程安全的无界队列。队列的元素顺序为FIFO。队列的头部,是在队列上时间最久的元素。队列的尾元素是在队列中时间最短的元素

新元素添加到队列的尾部,队列获取元素,从队列头部获取。ConcurrentLinkedQueue适用于多个线程需要同时访问一个相同集合的场景。与大多数并发集合一样,不允许插入null元素。队列的实现是基于一个有效的wait-free算法,具体参见链接:简单快速实用的并发

不像大多数的集合,size操作时间复杂度不是一个常量,因为队列异步操作的天性,决定了遍历队列元素时,有可能其他线程修改队列,导致最终size的数量可能不准确。另外addAll,removeAll,retainAll,containsAll,equals,toArray都不能保证原子性。比如遍历操作和addAll操作同时发生,可能会看到一些相同的新增元素。ConcurrentLinkedQueue实现了所有Queue和Iterator接口的所有方法。内存一致性影响:与其他并发线程集合一样,线程添加一个元素到队列发生在其他线程访问或移除队列元素之前。

第三方类库

Apache HttpComponents Client

HttpComponents项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。以下列出的是 HttpClient 提供的主要的功能。

实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)

支持自动转向

支持 HTTPS 协议

支持代理服务器等

支持Cookie

HttpClient Quick Start

HttpClient Tutorial

spring-core

spring是一个开源的,轻量级控制反转和面向切面的容器框架,解决企业应用开发的复杂性,降低耦合,更易于测试。

spring核心的功能就是一个工厂模式,spring相当于为你的项目专门成立一个工厂,这个工厂负责创建对象,维护对象之间的关系,以前是直接new,现在从spring的工厂里面获取。

docs/4.3.10.RELEASE/spring-framework-reference

Spring Resource框架体系介绍

jetty

Jetty是一个用 Java 实现、开源、基于标准的,并且具有丰富功能的 Http 服务器和 Web 容器。 Jetty 可以用来作为一个传统的 Web 服务器,也可以作为一个动态的内容服务器,并且 Jetty 可以非常容易的嵌入到 Java 应用程序当中。

jetty是轻量级的web服务器和servlet引擎。它的最大特点是:可以很方便的作为嵌入式服务器。 就是只要引入jetty的jar包,可以通过直接调用其API的方式来启动web服务。

https://www.eclipse.org/jetty/

Jetty使用教程(一)——开始使用Jetty

Jetty使用教程(四:21-22)—Jetty开发指南

Jetty使用教程(四:23)—Jetty开发指南

Jetty使用教程(四:24-27)—Jetty开发指南

Jetty使用教程(四:28-30)—Jetty开发指南

thoughtworks xstream

XStream是一个Java对象与XML互相转换的工具类库。

使用XStream实现Java对象与XML互相转换

thoughtworks xstream 官网

fastjson

FastJSOn是阿里巴巴开源的JSON处理工具。

Fastjson是一个json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:

速度最快,测试表明,fastjson具有极快的性能,超越任其他的java json parser。包括自称最快的jackson。

功能强大,完全支持java bean、集合、Map、日期、Enum,支持范型,支持自省。

无依赖,能够直接运行在Java SE 5.0以上版本

支持Android。

官网地址:http://code.alibabatech.com/wiki/display/FastJSON/Overview

Fastjson介绍

commons 组件

  • commons-lang3/commons-lang

    包结构

    org.apache.commons.lang3

    org.apache.commons.lang3.builder

    org.apache.commons.lang3.concurrent

    org.apache.commons.lang3.event

    org.apache.commons.lang3.exception

    org.apache.commons.lang3.math

    org.apache.commons.lang3.mutable

    org.apache.commons.lang3.reflect

    org.apache.commons.lang3.text

    org.apache.commons.lang3.text.translate

    org.apache.commons.lang3.time

    org.apache.commons.lang3.tuple

    【小家Java】Java第二API之apache的commons-lang3工具包史上最完整的讲解(书写优雅代码必备工具)

    【小家Java】common-lang3中StringUtils的使用详解

    日期格式化类DateFormatUtils【org.apache.commons.lang3.time.DateFormatUtils】

  • apache commons-math3/apache commons-math

    apache-commons-math3是java的一种科学计算类库。

    官方文档

  • commons-net

    Apache commons net 项目中封装了各种网络协议的客户端。

    编写更少量的代码:使用apache commons工具类库

    api doc

  • fastutil

    fastutil扩展了Java集合框架,通过提供特定类型的map、set、list和queue,以及小内存占用、快速访问和插入;也提供大(64位)array、set 和 list,以及快速、实用的 二进制文件和文本文件的I/O类。

    官方文档

  • commons-dbpc

  • commons-pool

  • mysql-connector-java

  • guava

    Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。这个库是为了方便编码,并减少编码错误。这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法。Guava 的好处:

    标准化 - Guava库是由谷歌托管。

    高效 - 可靠,快速和有效的扩展JAVA标准库

    优化 -Guava库经过高度的优化。

    函数式编程 -增加JAVA功能和处理能力。

    实用程序 - 提供了经常需要在应用程序开发的许多实用程序类。

    验证 -提供标准的故障安全验证机制。

    最佳实践 - 强调最佳的做法。

    Google的Java常用类库 Guava

logback日志组件

cache组件

附录

【推荐算法工程师技术栈系列】程序语言--Java的更多相关文章

  1. 【推荐算法工程师技术栈系列】分布式&数据库--tensorflow

    目录 TensorFlow 高阶API Dataset(tf.data) Estimator(tf.estimator) FeatureColumns(tf.feature_column) tf.nn ...

  2. [转]Java工程师技术栈--成神之路

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133http://if ...

  3. [转载 java 技术栈] eclipse 阅读跟踪 Java 源码的几个小技巧!

    本文基于Eclipse IDE,我们每天都使用的IDE其实提供了很多强大的功能,掌握它们,往往能够事半功倍. 1.Quick Type Hierarchy 快速查看类继承体系. 快捷键:Ctrl + ...

  4. 关于Java 软件工程师应该知道或掌握的技术栈

    鄙人星云,今天突然想写这么一篇需要持续更新的文章,主要目的用于总结当前最流行的技术和工具,方便自己也方便他人. 更新时间:2018-10-23 09:26:19 码农职业路径图 码农入门职业路径图 J ...

  5. Java 技术栈

    JAVA是一个面向对象的编程语言,由SUN公司的程序员所开发.它不仅吸收了C++的各种优点,而且还撇弃了C++中难以理解的概念,如多继承.指针等:因此JAVA语言具有功能强大且简单易用两个特征, JA ...

  6. 一个基于React整套技术栈+Node.js的前端页面制作工具

    pagemaker是一个前端页面制作工具,方便产品,运营和视觉的同学迅速开发简单的前端页面,从而可以解放前端同学的工作量.此项目创意来自网易乐得内部项目nfop中的pagemaker项目.原来项目的前 ...

  7. Elastic 技术栈之 Logstash 基础

    title: Elastic 技术栈之 Logstash 基础 date: 2017-12-26 categories: javatool tags: java javatool log elasti ...

  8. Vue+koa2开发一款全栈小程序(1.课程介绍+2.ES6入门)

    1.课程介绍 1.课程概述 1.做什么? Vue+koa2开发一款全栈小程序 2.哪些功能? 个人中心.图书列表.图书详情.图书评论.个人评论列表 3.技术栈 小程序.Vue.js.koa2.koa- ...

  9. 微博推荐算法学习(Weibo Recommend Algolrithm)

    原文:http://hijiangtao.github.io/2014/10/06/WeiboRecommendAlgorithm/ 基础及关联算法 作用:为微博推荐挖掘必要的基础资源.解决推荐时的通 ...

随机推荐

  1. hdu4352 XHXJ's LIS[数位DP套状压DP+LIS$O(nlogn)$]

    统计$[L,R]$内LIS长度为$k$的数的个数,$Q \le 10000,L,R < 2^{63}-1,k \le 10$. 首先肯定是数位DP.然后考虑怎么做这个dp.如果把$k$记录到状态 ...

  2. k8spod控制器概述

    自主式pod对象由调度器绑定至目标工作节点后即由相应节点上的kubelet负责监控其容器的存活性,容器主进程崩溃后,kubelet能够自动重启相应的容器.不过,kubelet对非主进程崩溃类的容器错误 ...

  3. Linux下C++编译(代码高亮自动换行)

    1.环境准备 在ubuntu中要想编译c程序可以安装gcc编译器,编译c++的话就不能使用gcc了,要使用g++编译器. 安装gcc或是g++可以在新立得软件包管理器中直接搜索后安装或是使用终端文字命 ...

  4. Java三大体系JavaEE、JavaSE、JavaME的区别

    Java由四方面组成: ●Java编程语言,即语法. ●Java文件格式,即各种文件夹.文件的后缀. ●Java虚拟机(JVM),即处理*.class文件的解释器. ●Java应用程序接口(Java ...

  5. CF 354 D 迷宫与门的旋转 BFS +状态压缩 一定要回头看看

    D. Theseus and labyrinth time limit per test 3 seconds memory limit per test 256 megabytes input sta ...

  6. 数据聚类算法-K-means算法

    深入浅出K-Means算法 摘要: 在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. K-Mea ...

  7. [CSP-S模拟测试]:小盆友的游戏(数学 or 找规律)

    题目传送门(内部题110) 输入格式 第一行一个整数$N$,表示小盆友的个数. 第二行$N$个整数$A_i$,如果$A_i=-1$表示$i$目前是自由身,否则$i$是$A_i$的跟班. 输出格式 一个 ...

  8. Spring boot之添加JSP支持

    大纲 (1) 创建Maven web project: (2) 在pom.xml文件添加依赖 (3) 配置application.properties支持jsp (4) 编写测试Controller ...

  9. 02.替换空格 (Java)

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路 感觉这题对于Java意义 ...

  10. C++入门经典-关于extern变量

    1:extern用于解决使用非本源文件的全局变量. 例如:在sample1.cpp中 int a,b; /*外部变来那个定义*/ char c; void main() { cout<<a ...