
java基础
文章平均质量分 94
顽石九变
人生没有彩排,每一天都是现场直播,所以每一刻都要活得精彩。
展开
-
Java图像编程之:Graphics2D
java.awt.Graphics2D 是 Java 编程语言中的一个类,它是java.awt.Graphics类的子类。它提供了一系列用于绘制图形和处理图形操作的方法。Graphics2D 类是 Java 2D API 的一部分,它允许开发人员在图形界面应用程序中创建复杂的图形和图像效果。Graphics2D 类提供了一些强大的绘图功能,如绘制线条、矩形、椭圆、多边形等。它还支持图像的平移、旋转、缩放和剪切等变换操作。原创 2023-11-13 18:15:35 · 4603 阅读 · 2 评论 -
Java图像编程之:Graphics
Graphics为Java提供了绘制图形和图像的功能。它是Abstract Window Toolkit(AWT)的一部分,用于创建基于图形的用户界面。通过使用Graphics类,您可以在屏幕上绘制直线、矩形、椭圆、多边形等基本形状,并填充它们的颜色。您还可以绘制图像、文本和其他复杂的图形。要使用Graphics类,您需要获取一个Graphics对象。原创 2023-11-12 22:56:18 · 4825 阅读 · 2 评论 -
Java IO常用操作详解(代码示例)
Java I/O操作指的是数据的输入/输出操作。Java的I/O操作类在java.io包中,主要分以下几种:1、基于字节操作的I/O接口: InputStream和OutputStream2、基于字符操作的I/O接口: Writer和Reader3、基于磁盘操作的I/O接口: File- 基于字节的I/O操作,核心是操作字节数组byte[],可以操作任何类型的流数据- 基于字符的I/O操作,核心是操作字符数组char[],只能操作字符类型的流数据,如果是非字符的流数据(如图片、视频等)会变成乱码原创 2023-04-11 19:39:36 · 934 阅读 · 0 评论 -
Java SPI机制详解
SPI全称Service Provider Interface,是Java提供的一种服务发现机制。实现服务接口和服务实现的解耦。Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制,实现不修改任何代码的情况下切换不同的实现。原创 2022-12-28 16:59:55 · 2921 阅读 · 1 评论 -
使用Http连接池发起远程调用
说明http请求是目前系统间接口调用最常用的一种方式。在java中,http请求有很多中方式,httpClient是目前比较常用的一种方式,使用起来也比较简单。但是,创建一个httpClient是比较耗时的过程。为提高性能,通常会使用http连接池,每次从连接池中获取httpClient对象。引入jar包<dependency> <groupId>org....原创 2020-02-10 11:19:43 · 740 阅读 · 0 评论 -
java对象引用类型有哪几种
引用类型对象引用类型分为强引用、软引用、弱引用和虚引用1、强引用就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收2、软引用软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。Obj原创 2020-10-31 16:13:40 · 1433 阅读 · 0 评论 -
JAVA内存调优
文章目录JAVA内存调优引用类型栈堆堆内存常用配置年轻代老年代永久代(JKD8以后废除)元空间(Metaspace)垃圾回收类型参考资料JAVA内存调优使用Java -XX:+PrintFlagsInitial命令查看本机的初始化参数引用类型对象引用类型分为强引用、软引用、弱引用和虚引用。强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收软引用:软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时原创 2020-10-31 15:42:07 · 645 阅读 · 2 评论 -
用Semaphore信号量控制线程执行
Semaphore重点语法availablePermits():判断是否有权限acquire():获得一个信号,阻塞线程,可被中断release():释放一个信号acquireUninterruptibly():获得一个信号,阻塞线程,不可被中断代码示例每次只允许2个线程执行public class SemaphoreThread { public static void main(String[] args) { Semaphore semaphore = ne原创 2020-05-30 13:48:25 · 318 阅读 · 0 评论 -
JAVA实现代理模式的3种方式
什么是代理模式代理模式是项目中常用的一种设计模式。提供了间接访问目标对象的一种方式;即通过代理对象访问目标对象。这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加额外的扩展功能。代理模式又分为静态代理、jdk动态代理、cglib动态代理三种实现方式。三种实现方式各有优点,以及适用的场景。一、静态代理被代理对象与代理对象需要实现相同的接口或者是继承相同父类,因此要定义一个接...原创 2020-01-17 19:22:52 · 602 阅读 · 1 评论 -
不使用临时变量交换两个整数变量
代码实例先看一下交换变量的常规方式:public static void swap1() { int i = 1, j = 5; System.out.println("i:" + i + ",j:" + j); int tmp=i; i = j; j = tmp; System.out.println("i:" + i + ",j:" + j);}输出:i:1,j:5i...原创 2019-12-02 17:01:23 · 647 阅读 · 0 评论 -
java线程池使用详解
创建线程是一个耗资源的过程。创建大连线程会导致系统内存溢出。所以为了更合理使用线程,通常我们使用线程池在解决一、简单使用jdk提供一个工具类Executors可以方便创建线程池//核心线程0,最新线程Integer.MAX_VALUE,空闲线程存活时间60sExecutorService threadPool1=Executors.newCachedThreadPool();//核心线...原创 2019-07-24 17:09:26 · 280 阅读 · 0 评论 -
CountDownLatch实现并发操作
CountDownLatch 介绍类似发令枪,CountDownLatch的构造函数可以传入一个数字,代表倒计时多少个数。主要方法:countDown:每调用一次countDown(),倒计时就会减少1,await:当倒计时到0时,await()方法就会停止阻塞示例代码public static void main(String[] args) throws Interrupted...原创 2019-04-13 22:33:17 · 1260 阅读 · 0 评论 -
Java泛型通配符extends与super
java 泛型关键字说明? 通配符类型&lt;? extends T&gt; 表示类型的上界,表示参数化类型的可能是T 或是 T的子类&lt;? super T&gt; 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Objectextends 示例static class Food{}static class Fruit e...原创 2018-11-06 18:15:01 · 339 阅读 · 0 评论 -
java前台线程和后台线程
前台线程定义:普通线程又可以称为用户线程,只完成用户自己想要完成的任务,不提供公共服务。通过new Thread()产生的线程默认都是前台线程。前台线程在程序执行完成后,才会自己退出,不会随着主线程的退出而退出。假设main线程已经退出了,但是该线程还未执行完成,还会继续执行直到线程自己退出。java线程池启动的是前台线程后台线程定义:指在程序运行的时候在后台提供一种通用服务的线程,并...原创 2018-11-08 17:47:47 · 269 阅读 · 0 评论 -
jdk8 Lambda 表达式详解
lambda表达式主要是用来替换匿名内部类。必须配合函数接口一起使用。JDK中大多数接口已经被声明为函数接口函数接口必须使用@FunctionalInterface声明,并且,接口中只能有一个抽象方法,可以有其他的默认方法(default)或静态方法(static)@FunctionalInterfacepublic interface Formula { //抽象方法 ...原创 2018-11-08 17:49:12 · 295 阅读 · 0 评论 -
ArrayList源码解读
本文基于jdk1.8解读ArrayList关键代码ArrayList是非线程安全的,在多线程环境下要使用CopyOnWriteArrayList存储结构ArrayList内部存储结构是数组,ArrayList的容量就是数组的长度/** * The array buffer into which the elements of the ArrayList are stored. * Th...原创 2018-11-14 11:21:47 · 148 阅读 · 0 评论 -
不用使用中间变量让两个int变量的值互换
不用使用中间变量让两个int变量的值互换这个问题在面试的时候出现概率很高,相信还有很多人不会在回答这个问题前,让我们先看看异或这个运算符什么是异或变量的值不同时结果为1,值相同时结果为0在java中异或的符号是 ^,具体运算结果看下表:ab值000011110101正确做法了解了什么是异或后,我们在看看看正确的做法,代码如...原创 2018-11-20 20:16:12 · 942 阅读 · 0 评论 -
多线程之Future使用详解
什么是FutureFuture是一个未来对象,里面保存这线程处理结果,它像一个提货凭证,拿着它你可以随时去提取结果什么时候使用在两种情况下,离开Future几乎很难办。一种情况是拆分订单,比如你的应用收到一个批量订单,此时如果要求最快的处理订单,那么需要并发处理,并发的结果如何收集,这个问题如果自己去编程将非常繁琐,此时可以使用CompletionService解决这个问题。Comple...原创 2018-11-22 16:03:28 · 7425 阅读 · 1 评论 -
如何对map进行排序
Map介绍常用的Map有HashMap,TreeMap,LinkedHashMapHashMap:最常用的Map,根据key的HashCode值来存储数据,根据key可以直接获取它的Value,具有很快的访问速度。HashMap最多只允许一条记录的key值为null(多条会覆盖);允许多条记录的Value为null。非线程安全TreeMap: 根据key排序,默认是按升序排序,也可以指定排序...原创 2018-11-22 16:05:40 · 40940 阅读 · 0 评论 -
HashMap源码解读(jdk1.8)
本文基于jdk1.8解读HashMap关键代码HashMap是非线程安全的,在多线程环境下要使用ConcurrentHashMap存储结构HashMap的存储结构是数组 + 链表 + 红黑树,当链表的长度大于等于8时,链接转成红黑树初始化HashMap初始容量是16,默认负载因子是0.75当然初始化的时候也可以传入指定容量大小。那么是不是传入多少,初始化的容量就是多少呢?/** ...原创 2018-11-29 10:17:45 · 175 阅读 · 0 评论 -
Lock和synchronized的区别和使用
Lock和synchronized的区别和使用同步的三个特性:原子性、可见性、有序性synchronized没办法手动释放锁,正因为这样,有可能会导致死锁加锁的三个位置:实例方法,以当前实例对象为锁静态方法,以当前class为锁代码块,指定锁对象java虚拟机对Synchronized的优化锁的状态分四种:无锁状态、偏向锁、轻量级锁、重量级锁随着锁的竞争,锁可以从偏向锁升级...原创 2018-11-06 17:37:56 · 284 阅读 · 0 评论