
java
java基础和应用
自由地带
踏踏实实的程序员
展开
-
应用开发--集合02、map概述
Map接口Map与Collection并列存在。用于保存具有映射关系的数据:key-value,key 和 value 都可以是任何引用类型的数据,其中key 用Set来存放, 不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。常用String类作为Map的“键”,key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到...翻译 2019-11-12 23:52:54 · 190 阅读 · 0 评论 -
应用开发--集合01、list和set概述
集合概述Java 集合可分为 Collection 和 Map 两种体系Collection接口: 单列数据, 定义了存取一组对象的方法的集合List: 元素有序、可重复的集合 Set: 元素无序、不可重复的集合Map接口: 双列数据,保存具有映射关系“key-value对”的集合Collection 接口Collection 接口是 List、 Set 和 Que...翻译 2019-11-12 23:11:53 · 273 阅读 · 0 评论 -
应用开发--反射
动态语言 vs 静态语言1 、动态语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。2 、静态语言与动态语言相对应的,运行时结构不可变的语言就是静态语言。如J...翻译 2019-11-10 22:28:31 · 182 阅读 · 0 评论 -
JVM05--字节码与热部署
字节码技术字节码技术应用场景AOP技术、Lombok去除重复代码插件、动态修改class文件等字节技术优势Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改。Java字节码增强主要是为了减少冗余代码,提高性能等。实现字节码增强的主要步骤为:1、修改字节码在内存中获取到原来的字节码,然后通过一些工具(如...翻译 2019-11-10 19:18:44 · 543 阅读 · 0 评论 -
JVM04--对象创建过程
通过上面的介绍我们大概知道了虚拟机的内存情况,下面我们来详细的了解一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问的全过程。对象的创建下图便是 Java 对象的创建过程,我建议最好是能默写出来,并且要掌握每一步在做什么。①类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否...翻译 2019-11-10 19:22:02 · 226 阅读 · 0 评论 -
JVM03--垃圾回收
什么是垃圾回收机制不定时去堆内存中清理不可达对象。不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。程序员唯一能做的就是通过调用System.gc 方法来"建议"执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。这也是垃圾收集器的最主要...翻译 2019-11-10 17:03:05 · 132 阅读 · 0 评论 -
JVM02--运行数据区(内存结构)和参数调优
内存结构图如下: 类加载器负责加载class文件,执行引擎负责解释命令,提交操作系统执行。具体查看:https://blog.youkuaiyun.com/tyf2007635/article/details/102964712程序计数器(Program Counter Register)程序计数器是一块较小的内存...翻译 2019-11-10 02:05:46 · 144 阅读 · 0 评论 -
JVM01--类加载和执行引擎
JVM包含三大系统,分别是:类加载器 运行时数据区 执行引擎类加载器类加载的机制的层次结构每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,...翻译 2019-11-09 18:39:18 · 266 阅读 · 0 评论 -
并发编程09--ForkJoin
ForkJoin框架其实是线程池ExecutorService的实现,将一个任务分解成多个部分同时运行,最后在将多个结果合并,实现方式类似于分治算法,或者MapRdeuce的思想,利用所有可用的处理能力来提高程序的响应和性能类结构ForkJoin框架的核心是ForkJoinPool类,基于AbstractExecutorService扩展。ForkJoinPool中维护了一个队列数组Wor...翻译 2019-11-06 22:34:41 · 224 阅读 · 0 评论 -
并发编程09--Callable、Future
Callable在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Futur...翻译 2019-11-06 21:02:55 · 131 阅读 · 0 评论 -
并发编程08--线程池
线程池作用Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够具有以下优势:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定...翻译 2019-11-06 16:21:42 · 143 阅读 · 0 评论 -
并发编程07--队列
队列在java中队列是一个先进先出的数据结构,属于集合Collection的一个子类,如下图 在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列非阻塞,一个是以BlockingQueue接口为代表的阻塞队列,具体如下:ArrayDeque, (非阻塞数组双端队列)线程不安全,不支持null ...原创 2019-11-05 23:56:07 · 108 阅读 · 0 评论 -
并发编程06--并发工具和原子类
并发工具(计数器)CountDownLatchCountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后...翻译 2019-11-05 11:07:08 · 130 阅读 · 0 评论 -
并发编程05--线程锁
多线程编程是为了保证线程安全,会用到锁,Java中提供了多种锁类型可以使用,下列列出几个常用的锁类型:内置锁(sychronized)和显示锁(例如ReentrantLock) 重入锁和非重入锁 读写锁 CAS 乐观锁和悲观锁 公平锁和非公平锁 自旋锁内置锁与显示锁内置锁即是java提供的sychronized方式,可以分为同步方法和同步代码块,两种方式的核心都是对某个资源类...原创 2019-11-05 10:51:25 · 160 阅读 · 0 评论 -
并发编程03--内存模型
Java内存模型共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。...原创 2019-11-04 19:06:42 · 109 阅读 · 0 评论 -
并发编程04--线程通讯
多线程通讯线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。共享内存多线程之间以共享内存方式通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。第一个线程写入(input)用户,另一个线程取读取(out...原创 2019-11-04 22:00:58 · 171 阅读 · 0 评论 -
并发编程02--线程安全
线程安全线程安全问题当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。代码:public class ThreadTrain implements Runnable { private int trainCo...原创 2019-11-04 17:05:28 · 128 阅读 · 0 评论