Java 基础 | 并发 | 爬虫
文章平均质量分 89
开发者如是说
这个作者很懒,什么都没留下…
展开
-
Java-8:五分钟学习 Stream 编程
1、概述Java8中在Collection中增加了一个stream()方法,该方法返回一个Stream类型。我们就是用该Stream来进行流编程的;流与集合不同,流是只有在按需计算的,而集合是已经创建完毕并存在缓存中的;流与迭代器一样都只能被遍历一次,如果想要再遍历一遍,则必须重新从数据源获取数据;外部迭代就是指需要用户去做迭代,内部迭代在库内完成的,无需用户实现;可以连接起来的流操作...原创 2018-11-08 11:55:04 · 1139 阅读 · 0 评论 -
Java 基础回顾-7:IO 体系
Java IO流体系原创 2017-11-20 22:05:53 · 1262 阅读 · 0 评论 -
Java 基础回顾-5:容器类
容器数组的效率比容器高,但是我们应该“优先选择容器而不是数组”,只有在已证明性能成为问题时,才应该将程序重构为使用数组原创 2017-11-20 22:14:03 · 756 阅读 · 0 评论 -
Java 爬虫:是时候 Get 新技能了,使用 Java 爬取网页信息
如果你想利用自己的技术做出一点有意思的产品来,那么爬虫、算法和 AI 等技术可能是一个不错的突破口。今天,我们就来介绍下使用 Java 爬取页面信息的几种思路。说起爬虫,自从 Python 兴起之后,人们可能更多地使用 Python 进行爬虫. 毕竟,Python 有许多封装好的库。但对于 Javaer,如果你觉得学习 Python 成本比较高的话,使用 Java 也是一个不错的选择,尤其是当你...原创 2019-01-27 19:55:48 · 966 阅读 · 0 评论 -
Java 基础回顾-6:HashMap 源码分析
要理解 HashMap 的实现原理需要数据结构方面的知识,这里给出之前整理的一些数据结构和 hashCode() 方法覆写相关的知识:《Java 基础回顾:几个比较重要的预定义类》 及 《Awesome-Java》见数据结构与算法部分。Java 集合 API 中的 HashMap 是使用拉链法来解决碰撞冲突的。所谓拉链法就是使用一个数组存储链表的头结点。对每个键值对,我们计算键的哈希码,并对得到...原创 2019-02-15 20:51:02 · 417 阅读 · 0 评论 -
并发编程专题-5:生产者和消费者模式
所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为。在实现生产者消费者问题时,可以采用三种方式:使用 Object 的 wa...原创 2019-02-17 15:50:49 · 484 阅读 · 0 评论 -
JVM 系列-1:虚拟机内存管理
1、关于JavaJava程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK,JDK是用于支持Java程序开发的最小环境。Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE,JRE是支持Java程序运行的标准环境。HotSpot是目前使用最为广泛的虚拟机。Java以后发展的几个方向:1).模块化,功能组件可插拔;2).混合语言:各不同的...原创 2018-11-05 18:14:06 · 831 阅读 · 0 评论 -
JVM 系列-2:虚拟机执行子系统
1、类文件结构Java虚拟机只与Class文件相关联,它规定了Class文件应该具有的格式,而不论该文件是由什么语言编写并编译而来。所以,任何语言只要能够最终编译成符合Java虚拟机要求的Class文件,就可以运行在Java虚拟机上面。就是说,不论是使用Java, Scala, Kotlin, Groovy还是其他语言,只要编译出的Class文件符合虚拟机规范,那么都可以被虚拟机执行。所以,实际...原创 2018-11-05 18:13:26 · 729 阅读 · 0 评论 -
JVM 系列-3:虚拟机内存模型与高效并发
当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。关于定义的理解这是一个仁者见仁智者见智的事情。出现线程安全的问题一般是因为主内存和工作内存数据不一致性和重排序导致的,而解决线程安全的问题最重要的就是理解这两种问题是怎么来的,那么,理解它们的...原创 2018-11-05 18:12:02 · 701 阅读 · 0 评论 -
并发编程专题-4:ThreadLocal 原理解析
1、ThreadLocal的使用防止任务在共享资源上产生冲突的一种方式是根除对变量的共享,使用线程的本地存储为使用相同变量的不同线程创建不同的存储。下面是一个ThreadLocal的实例。这里我们使用了静态的全局变量ThreadLocal对象来保存Integer类型的值。我们在不同的线程中将指定的数字传入到threadLocal中进行保存。然后,再将其读取出来:private static...原创 2018-11-08 11:50:56 · 804 阅读 · 0 评论 -
Java基础之-JUC包相关
JUC1、原子类AtomicInteger等1.1 AtomicInteger下面是该类的部分方法和字段,至于其他的原子类与该类基本相同。public class AtomicInteger extends Number implements java.io.Serializable { private static final long serialVersionUID = 6214790原创 2017-12-02 13:50:55 · 1064 阅读 · 0 评论 -
Java 基础之 ConcurrentHashMap 原理分析
ConcurrentHashMapHashMap不是线程安全的,而当使用同步集合Collections.synchronizedXXX方法来实现HashMap同步的话,因为它同步的粒度比较大。也就是每次加锁的时候,都会对整个对象加锁。从而导致在并发的场景下,效率比较低。而ConcurrentHashMap的好处就在于,每次插入元素的时候都只对整个集合的一部分进行加锁。这样在并发的情景之下,性能就比H原创 2017-12-02 13:52:17 · 864 阅读 · 0 评论 -
并发编程专题 2:使用多线程编程
1、基础梳理进程和线程。1). 进程是操作系统正在执行的不同应用程序的一个实例,线程是操作系统分配处理器时间的基本单元。2). 每个进程运行在自己的地址空间,而线程共享数据内存和 IO 这些资源。线程的优缺点。优点:1). 程序的运行效率可能会更高;2). 可以使用线程把占用时间较长的任务放在后台去执行;3). 在一些等待耗时任务和交互事件的时候同时可以执行其他任务。缺点:1).如果有大量的...原创 2019-02-17 20:30:52 · 446 阅读 · 0 评论 -
Java-8:五分钟学习行为参数化
1、概览Java8的改进比历史上任何一次改变都比较深远。Java不断改进也是编程语言生态变化的使然——诸如大数据需要在多核上面运行,而Java此前是不支持这种操作的。在Java8之前,如果想要利用多个计算机的内核,你要使用线程,并且要处理复杂的同步逻辑。但是在Java8中,你可以很容易地使用流让自己的代码在多个内核上面执行。此外,它还借鉴了其他语言和开源库的内容,比如Scala、Guava等...原创 2018-11-08 11:56:26 · 739 阅读 · 0 评论 -
Java 基础回顾-1:基本知识总结
本篇文章对 Java 中的语言相关的基础知识进行了总结,其中部分内容参考了阿里的 Java 开发规范1、术语No结论1JDK 是编写Java程序的程序员使用的软件2JRE 是运行Java程序的用户使用的软件3Java的执行模式是编译和解释型,Java程序首先由编译器转换为标准字节代码,然后由JVM来解释执行,JVM将字节代码程序同操作系统和硬件分开,使...原创 2018-12-14 09:39:38 · 933 阅读 · 0 评论 -
Java 注解及其在 Android 中的应用
一般的,注解在 Android 中有两种应用方式,一种方式是基于反射的,即在程序的运行期间获取类信息进行反射调用;另一种是使用注解处理,在编译期间生成许多代码,然后在运行期间通过调用这些代码来实现目标功能。在本篇文章中,我们会先重温一下 Java 的注解相关的知识,然后分别介绍一下上面两种方式的实际应用。1、Java 注解回顾1. Java 注解的基础知识Java 中的注解分成标准注解和元...原创 2018-11-04 00:50:11 · 931 阅读 · 0 评论 -
Java 基础回顾-2:面向对象
1、类1.1 面向对象面向对象三大特性封装:客观事物抽象并封装成对象,将数据成员、属性和方法等集合在一个整体内;继承:用于代码重用;多态:同样的消息被不同类型的对象接收时导致完全不同的行为。1.2 类和对象概述1.2.1 声明声明形式[类修饰符] class 类名 [extends 基类] [implements 接口列表]{ 类体}[;]说明No...原创 2018-12-14 11:38:05 · 806 阅读 · 0 评论 -
Java 基础回顾-3:泛型和 Class 类
1、泛型以 ArrayList 为例,在范型出现之前,ArrayList 的实现机制是内部管理一个 Object[] 类型的数组。比如add 方法以前是 add(Object obj),现在是 add(E e)。那么以前的时候显然如果你定义一个 String 类型的 ArrayList,传入 File 类型也是可以的,因为它也继承自 Object。这显然就会出现错误!但是有了泛型之后,传入的只能...原创 2018-12-14 11:54:13 · 1039 阅读 · 0 评论 -
Java 基础回顾-4:几个比较重要的预定义类
这篇文章中梳理了 Java 中几个常见的预定义类:字符串类型 String 类、Object 类、枚举类型 Enum 类以及数组。1、字符串 String 类1.1 字符串相关问题总结String 的每一个看起来会修改 String 的方法实际都是创建一个全新的 String 对象,以包含修改后的字符串的内容,而最初的 String 对象则丝毫未动;String 使用 char val...原创 2018-12-17 12:53:14 · 1049 阅读 · 0 评论 -
RxJava2 系列-3:Subject 及其几种应用方式
在这篇文章中,我们会先分析一下 RxJava2 中的 Subject ;然后,我们会使用 Subject 制作一个类似于 EventBus 的全局的通信工具。在了解本篇文章的内容之前,你需要先了解 RxJava2 中的一些基本的用法,比如 Observable 以及背压的概念,你可以参考我的其他两篇文章来获取这部分内容:《RxJava2 系列 (1):一篇的比较全面的 RxJava2 方法总结》...原创 2018-11-04 18:54:44 · 1192 阅读 · 0 评论 -
RxJava2 系列-2:背压和 Flowable
背压(Back Pressure)的概念最初并不是在响应式编程中提出的,它最初用在流体力学中,指的是后端的压力,通常用于描述系统排出的流体在出口处或二次侧受到的与流动方向相反的压力。在响应式编程中,我们可以将产生信息的部分叫做上游或者叫生产者,处理产生的信息的部分叫做下游或者消费者。试想如果在异步的环境中,生产者的生产速度大于消费者的消费速度的时候,明显会出现生产过剩的情景,这时候就需要消费...原创 2018-11-04 18:53:27 · 1105 阅读 · 0 评论 -
RxJava2 系列-1:一篇的比较全面的 RxJava2 方法总结
看了许多讲解RxJava的文章,有些文章讲解的内容是基于第一个版本的,有些文章的讲解是通过比较常用的一些API和基础的概念进行讲解的。但是每次看到RxJava的类中的几十个方法的时候,总是感觉心里没底。所以,我打算自己去专门写篇文章来从API的角度系统地梳理一下RxJava的各种方法和用法。1、RxJava 基本1.1 RxJava 简介RxJava是一个在Java VM上使用可观测的序列...原创 2018-11-04 18:52:40 · 1259 阅读 · 0 评论 -
常用的 Java 第三方库 JodaTime
Java8之前的时间库中存在一些设计不好的地方,导致用起来非常地不方便,又容易出错。比如,要实现在指定的日期的基础上面增加指定的时间的操作,你需要些大量的样板代码;而它的月份从0开始,稍有不慎就会掉入坑中。所以,通常我们使用第三方库Joda Time来进行时间相关的操作。1、使用JodaTimeJodaTime在Github上面的主页:JodaTime使用JodaTime的时候的两种配置方式...原创 2018-11-05 18:19:57 · 1215 阅读 · 0 评论 -
Guava 源码分析之 EventBus 源码分析
EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。1、程序示例EventBus的使用是非常简单的,首先你要添加Guava的依赖到自己的项目中。这里我们通过一个最基本的例子来说明EveentBus是如何使用的。public static void main(String...args) { // 定义一个EventBus对象,这里的Jo...原创 2018-11-04 19:08:14 · 878 阅读 · 0 评论 -
Java 解惑:equals 与 == 的区别
1. 当参与==比较的两个元素中有一个是值类型的,那么就按照值类型来比较。而引用类型按照值来比较的时候使用的是它们的hashCode的返回结果。只有当参与比较的两个元素都是引用类型的,那么才按照引用类型来比较,即比较它们的hashCode的返回结果。2. 当使用equals方法进行比较的时候,实际的比较结果取决于equals方法的具体实现,在Object的默认实现中,是使用==来实现的。也就是说使用了按引用来比较的原创 2017-11-21 12:18:40 · 893 阅读 · 0 评论 -
并发编程专题 3:synchronized
1、synchronized 修饰的几种情形根据 synchronized 可以被用来修饰的对象可以分成下面几种情形,2、synchronized 的原理2.1 理论基础Java 虚拟机中的同步 (Synchronization) 基于进入和退出管程 (Monitor) 对象实现,无论是显式同步 (有明确的 monitorenter 和 monitorexit 指令,即同步代码块),还是...原创 2019-02-19 20:39:35 · 305 阅读 · 0 评论