
Java
文章平均质量分 70
ImproveJin
大龄失业程序员
展开
-
Java中5中发送HTTP请求的的方式
发送HTTP请求时现代编程中的核心功能,也是我们学习一种编程语言时最先想做的事。在Java中,有多种方式实现此功能,比如JDK或第三方库,这篇文章将会介绍我所知的Java中HTTP客户端,如果你使用过其他的,那很好,请告诉我。这篇文章将会涉及:JDK中:HttpURLConnectionHttpClient流行的第三方库:ApacheHttpClientOkHttpRetrofit我将会使用 NASA APIs 中每天一图Astronomy Picture of the Day做为示翻译 2021-12-24 20:55:12 · 359 阅读 · 0 评论 -
ETL优化之道
天下武功,唯快不破。ETL Job优化的目标是执行快,耗费时间更短,总结起来有以下方式:增加硬件资源,比如增大内存、CPU等,但优化往往是在资源不足的情况下数据缓存,空间换时间服务常驻,减少初始化化时间减少输入数据量,常用以下技术数据压缩,缓存中能存放更多数据索引+BloomFilter,也是空间换时间,加快数据查找速度列裁剪,原理也是提高了缓存利用率谓词下推,减少扫描数据,一般要借助预分区或索引相关技术数据分区分桶避免重启读取相同数据,比如对同一张表多次查询UNIO原创 2021-12-18 16:43:39 · 686 阅读 · 0 评论 -
理解LSM树:频繁写的数据库基石
log-structured merge-tree(LSM tree)是可支持大量写的一种数据结构,写操作被优化成顺序写,LSM树是许多数据库背后的核心数据结构,包括BigTable, Cassandra, Scylla, 和 RocksDB.SSTablesLSM树在磁盘上以有序表(Sorted String Table)的形式存在。下图所示,SSTable存储了以key排序的key-value键值对,其中name为key。一个SSTable是由多个排序的文件组成,每个文件是一个Segment, 这些翻译 2021-12-15 20:03:13 · 240 阅读 · 0 评论 -
递归应用-链表快速排序
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。leetcode public ListNode quickSortList(ListNode head) { if (head == null) return null; ListNode pivot = head; ListNode left = null, right = null; ListNode cur = head.next; wh原创 2020-06-17 14:08:58 · 191 阅读 · 0 评论 -
动态规划-不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?leetcode public int uniquePaths(int m, int n) { int[][] a = new int[m][n]; for(int i=0; i<m; ++i) for(int j=0; j原创 2020-06-12 18:38:49 · 200 阅读 · 0 评论 -
递归&动态规划-解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。leetcode递归 public int numDecodings(String s) { int total = 0; if (s.isEmpty()) { return total; } String原创 2020-06-12 18:23:44 · 214 阅读 · 0 评论 -
面向对象的Flink SQL
任何程序都可以抽象成输入、处理、输出三部分,flink中将输入抽象成source,输出抽象成sink,中间处理则对应SQL/API,SQL对用户友好,抽象层次更高,同时也导致缺乏灵活性,表达力更弱。使用Flink中DataStream转换相关的Operater Function比如map,filter等函数编写流式应用,是一种过程式思维,大部分时候使用SQL申明式语言也能实现业务需求。下面的D...原创 2019-12-20 18:45:13 · 243 阅读 · 0 评论 -
Ali并发总结
【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。说明:资源驱动类、工具类、单例工厂类都需要注意。【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。 正例:public class TimerTaskThread extends Thread { public TimerTaskThread(){ super.setName("TimerTaskTh转载 2017-12-07 13:58:56 · 277 阅读 · 1 评论 -
Java之异常
Error和Exception都继承自Throwable。Error严重错误,一般是指系统级的错误,应用程序本身无法预防和处理,因此不用捕获处理,应该让程序直接终止退出,常见Error如AssertionError,断言失败时程序因立即退出。ExceptionJava中Exception分为RuntimeException和CheckedException, 某高人认为CheckedExceptio原创 2018-01-03 13:10:34 · 904 阅读 · 0 评论 -
Java之ClassLoader
.class文件需要被ClassLoader加载到JVM内存中的Method Area形成一个Class实例。public final class Class<T> { //不含PacakageName public String getSimpleName(); //完整类名,包含PackageName public String getName(); pu原创 2018-01-03 13:13:07 · 239 阅读 · 0 评论 -
Java之日志
Logger日志中应该使用SLF4J中的API:import org.slf4j.Logger;import org.slf4j.LoggerFactory;private static final Logger logger = LoggerFactory.getLogger(Xxx.class);参考:http://www.importnew.com/7450.htmllog4j配置及加载原创 2018-01-23 14:05:15 · 326 阅读 · 0 评论 -
Java之Reflect
ClassClass没有public构造方法,由JVM在加载类时自动构造,Class实例中存储了Object对应类的元信息,获取Class实例有三种方式。Object.getClass()Class.forName()class literal, 即类名加.class通过Class可获取类元信息,包括类声明、类中成员、方法等信息类声明信息类名public String getCanonica原创 2018-02-05 15:27:26 · 261 阅读 · 0 评论 -
Bloom Filter介绍
原文概览这篇文章我们谈谈Guava中的Bloom Filter, Bloom Filter是一种省内存的基于概率的数据结构,可判断一个元素是否在集合中。Bloom Filter没有False Negative,即判断某元素时否在Bloom Filter中时,如果返回False, 则可以肯定该元素不在集合中,但是Bloom Filter存在False Positive, 即如果返回True, ...翻译 2019-06-13 19:06:37 · 1772 阅读 · 0 评论 -
如何发送带cookie HTTP请求
Postman App&Postman Interceptor安装Postman安装chrome extension Postman Interceptorchrome上点击Postman Interceptor同步cookie, Postman App上Enable InterceptorChrome Console有时chrome抽风,调试时只能打开无痕窗口,...原创 2019-07-02 14:06:29 · 5073 阅读 · 0 评论 -
基于Drools的人群推荐实现方案
业务上运营提前建好规则,根据广告主等级、业务类型等属性给广告主推荐不同的人群,通过规则引擎来实现,可避免代码中出现过多的if else判断加载规则1、从ClassPath下加载DRL文件头,比如引入的类型、定义的全局变量private void loadRuleTemplate() throws IOException { ClassPathResource template = n...原创 2019-08-07 17:10:43 · 666 阅读 · 0 评论 -
Java之GC
内存结构JVM在启动后内存分成如下几个区域:线程私有部分:PC, Program Counter Register, 当前执行指令地址,用于线程切换后恢复JVM Stack, 调用方法时存放栈帧,局部变量存放地,栈帧大小在编译器就确定,记录在class文件中method_info的属性表中,Stack默认大小为1M,可通过启动参数-Xss或new Thread时传递参数指定;栈内部不足时会抛St原创 2017-12-07 13:57:50 · 269 阅读 · 0 评论 -
Java之NIO
NIONew IO, 相对于IO基于字节方式读取流中的数据,NIO以块为单位从Channel读写,相对效率更高。NIO分为File NIO和NetWork NIO。File NIOFile NIO通过FileChannel读写数据,FileChannel只能通过FileInputStrem/FileOutputStream获取public FileChannel FileInputStrem:get原创 2017-12-06 14:17:44 · 281 阅读 · 0 评论 -
Java之IO
IO分为磁盘IO和网络IOIOjava.io.*包中主要包含三部分:流时部分非流式部分,主要包含一些辅助流式部分的类,如:File类、RandomAccessFile类和FileDescriptor等类其他-文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和Win原创 2017-12-05 14:19:31 · 212 阅读 · 0 评论 -
Eclipse中常用快键建
作为程序员,新接触一个IDE,最常用的快捷键就是程序调试、文件查找、智能提示代码跟踪之类的,当然这些快捷键也是可以通过菜单栏获取的。查找:当前文件查找: CTRL + F文件查找:Search菜单作为入口调试:Next Step: F6 Step i原创 2014-01-22 16:28:34 · 776 阅读 · 0 评论 -
Centralized Logging
Logs are a critical part of any system, they give you insight into what a system is doing as well what happened. Virtually every process running on a system generates logs in some form or another. Usu转载 2014-07-09 18:30:03 · 940 阅读 · 0 评论 -
为什么Java不支持多继承
原文链接:http://javarevisited.blogspot.com/2011/07/why-multiple-inheritances-are-not.html翻译 2014-09-09 11:45:57 · 1024 阅读 · 0 评论 -
Java中String为什么是final或immutable
这是一个在Java面试中经常会被wenji翻译 2014-09-29 11:20:12 · 1951 阅读 · 0 评论 -
equals&hashCode
平时我们写一个java对象,很多时候会使用IDE自动生成equals方法和hashcode,那么这个两个方法到底有什么用?为什么两个要同时重写?如果不使用自动生成,该如何实现自己的equals和hashcode方法?查看jdk发现equals和hashcode都是Object的方法,因此只有对象类型才能调用者两个方法:public boolean equals(Object obj) { r原创 2017-10-27 18:38:04 · 358 阅读 · 0 评论 -
Arrays&Collections总结
Java中最常用的容器就是数组和Collection子类容器,并且数组和Collection可以相互转换,这样他们基本上可以共享彼此的方法。为方便对他们进行操作,java.util包中提供了两个工具类,java.utils.Arrays用于对数组进行操作,java.utils.Collections用于操作Collection,工具类基本上都是static方法,并且针对不同的类型会进行方法重载。下面原创 2017-11-10 22:00:24 · 245 阅读 · 0 评论 -
Java集合之Queue
Queue一般我们说的Queue是FIFO,此外还有指定排序方式的PriorityQueue以及LIFO(Stack),以下情况Queue默认都指FIFO.Queue主要提供的方法就是入队和出队,出队时区分在获取队首元素时是否删除队首元素,此外在入队出队时区分失败时是否抛出异常。 操作 失败时抛出异常方法 失败时返回特殊值 插入队尾 add(E) offer(E) 获取并删原创 2017-11-13 13:12:55 · 435 阅读 · 0 评论 -
Java集合之List
Java中最常用的三种集合类型: List,Set,MapList最常用的两种实现:ArrayListLinkedListIterable && IteratorIterable接口表示可通过迭代器进行访问,通过迭代器访问的好处是将容器本身的行为和元素访问分开,将对所有容器的访问抽象出来,形成共同的方法,既方便理解,也方便使用。Iterator仅能单向访问容器,提供了获取可用元素、删除刚获取元原创 2017-11-01 10:26:00 · 303 阅读 · 0 评论 -
Java集合之Set
Set是单元素容器,同时元素是不重复的,Java中直接利用Map key唯一性,底层是用了Map的实现,对应的value都是同一个static Object. Set 内部结构 HashSet HashMap LinkedHashSet LinkedHashMap TreeSet TreeMap EnumSet ConcurrentSkipListSet原创 2017-11-03 11:52:17 · 279 阅读 · 0 评论 -
Java集合之Map
存储双元素的容器HashMapMapMap Interface是存储双元素key-value容器接口,提供了对key-value的增删改查,注意其并没有继承Iterable,因此无法直接获取Map的Iterator。public interface Map<K,V> { // Query Operations int size(); boolean isEmpty();原创 2017-11-03 11:51:09 · 318 阅读 · 0 评论 -
Java集合总结
因为我们学过数据结构理论知识,所以集合这部分相对来说是最容易理解的,平时用集合的地方也比较多,使用的时候有意识的去看看源代码,多看看Java Doc官方文档,想想是怎么实现的,一次搞懂之后随着后面使用的越来越多印象只会越来越深刻。如果每次都只是停留在使用的脚步,浅尝辄止,会造成基础不牢,深度不够,此外搞懂后还要总结记录下来,能够系统性的认识Collection相关类原理及关系,如果只是看别人的源码分原创 2017-11-15 09:54:00 · 424 阅读 · 0 评论 -
Java之锁总结
线程互斥由于线程调度时间无法确定,获取/放弃CPU没有固定时间,再运行过程中可能时间片到后需放弃CPU,如果多个线程间共享 数据,那么对共享数据的修改需要是事物性的操作,此时操作共享数据的代码称为临界区,一个线程进入临界区后,只有执行完临界区里所有代码后,其他线程才能进入临界区,也即对临界区进行加锁操作,进入临界区需获取锁,出临界区时释放锁,只有获取锁成功后才能进入临界区。Java中提供了三种实现原创 2017-11-21 13:21:44 · 405 阅读 · 0 评论 -
Java之BitSet
案例先从一个案例说起,我司是提供在线视频观看服务的,为促进用户粘性,提高用户活跃度,我司运营人员策划了一个活动,活动持续一个月,从五一开始到六一结束,活动内容是对这一个月内用户观影时长进行统计,观影时长排行靠前的若干用户会有奖励,由于同一个账号可以在多个平台或终端上同时登陆,因此同一时刻只能计算一个平台时间,不同时刻才能累加,同时为了提高观影积极性,用户能实时查看自己的观影时长以及排行榜上top 1原创 2017-11-11 17:18:40 · 531 阅读 · 0 评论 -
Java之线程总结
线程vs进程进程是资源分布的基本单位,一个进程中可以有多个线程,多个线程可以共享进程资源,在Java进程中,堆是共享的,因此需要保证线程安全,可通过-Xms指定Heap初始化大小,-Xmx指定Heap的最大值。线程是调度的基本单位,直接理解为可获取CPU时间片执行的代码,每个线程也有私有栈,默认大小为1M,太小会报StackOverFlow, 可通过-Xss指定栈大小,也可以new Thread是通原创 2017-12-01 16:39:30 · 208 阅读 · 0 评论 -
JAVA, Hello World!
配置好JAVA环境后,就可以用编写自己的Demo了,那就从Hello World开始吧!编辑HW.java如下: public class HW { public static void main(String[] args){ System.out.println("Hello World!"); }原创 2014-01-21 19:00:25 · 819 阅读 · 0 评论