![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 61
wings专栏
程序亦非猿
展开
-
JavaPoet使用详解
JavaPoet 是用于生成 .java 源文件的 Java API。在执行诸如注释处理或与元数据文件(例如,数据库模式、协议格式)交互等操作时,源文件生成非常有用。通过生成代码,您无需编写样板,同时还为元数据保留了单一的真实来源。例子这是一个(无聊的)HelloWorld 类:package com.example.helloworld;public final class HelloWorld { public static void main(String[] args) {翻译 2021-11-23 23:25:19 · 5593 阅读 · 0 评论 -
Android实现可以上下滑动的panel
背景用过美团和滴滴的朋友都知道,他们都有一个可以上下滑动的面板,能够实现上滑,下拉和悬停,那么要怎么实现呢,下面我们就来简单探讨下。使用ViewDragHelper实现思路:这是一个底部抽屉,它可以悬停在中间,随着滑动自然过渡到全屏。它是仿照DrawLayout设计实现的,只不过是竖直方向的,内部通过ViewDragHelper实现,具体参照以下实现Android 简易悬停抽屉控件 —— 仿知乎收藏夹 fashare2015 /HoverView umano /AndroidSliding原创 2021-10-07 22:26:06 · 1822 阅读 · 0 评论 -
java 传递参数的两种方式
Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。a.传递值的数据类转载 2021-05-25 01:12:32 · 2669 阅读 · 0 评论 -
Android获取View宽高的常见方式
背景有时我们会有基于这样的需求,当Activity创建时,调用View.getWidth、View.getHeight()、View.getMeasuredWidth() 、View.getgetMeasuredHeight()来获得某个view的宽度或高度,然后进行相应的操作,但是我们在onCreate()、onStart()、onResume()中获取View的大小,获取到的值都是0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的v原创 2021-02-01 18:09:30 · 11859 阅读 · 0 评论 -
Java或者Python搭建简单HttpServer
java搭建简单HttpServerjava构建简单的HTTP服务器Java 实现简单的Http服务器搭建简单的HTTP服务器用Java编写你自己的简单HTTP服务器Python搭建简单的HttpServer在Windows 7/10或Ubuntu上可以通过python2.x或python3.x来快速搭建一个简单的HTTP服务器。如果python为2.x,则可执行:$ python -m SimpleHTTPServer 或 $ python2 -m SimpleHTTPServe原创 2021-02-21 16:13:18 · 257 阅读 · 0 评论 -
AspectJ学习
Android AOP面向切面编程详解深入理解Android之AOP原创 2021-01-02 18:51:10 · 94 阅读 · 0 评论 -
ArrayList什么情况会抛出ConcurrentModificationException
背景近日,在看ArrayList的源码实现,发现很多情况会抛出ConcurrentModificationException。下面总结一下大致发生的情况。 首先,ArrayList不是线程安全的。 首先来看一个例子:public static void main(String[] args){ List<Integer> aList = new ArrayList<Integer>(); aList.add(1); aList.原创 2020-12-01 20:45:58 · 481 阅读 · 0 评论 -
Java 内存模型与线程
Java 内存模型一词翻译自 Java Memory Model,简称 JMM,它所描述的是多线程并发、CPU 缓存等方面的内容什么是Java内存模型上图描述的意思是,在每一个线程中,都会有一块内部的工作内存(working memory)。这块工作内存保存了主内存共享数据的拷贝副本。虚拟机栈和线程的工作内存并不是一个概念。在 Java 线程中并不存在所谓的工作内存(working memory),它只是对 CPU 寄存器和高速缓存的抽象描述。CPU 普及作为一个程序员,尤其是 Java 程序员,原创 2020-11-02 13:45:15 · 129 阅读 · 0 评论 -
Synchronized与 ReentrantLock
synchronizedsynchronized 可以用来修饰以下 3 个层面:修饰实例方法;修饰静态类方法;修饰代码块。synchronized 修饰实例方法这种情况下的锁对象是当前实例对象,因此只有同一个实例对象调用此方法才会产生互斥效果,不同实例对象之间不会有互斥效果。比如如下代码:上述代码,在不同的线程中调用的是不同对象的 printLog 方法,因此彼此之间不会有排斥。运行效果如下:可以看出,两个线程是交互执行的。如果将代码进行如下修改,两个线程调用同一个对象的 print原创 2020-10-08 22:46:18 · 686 阅读 · 0 评论 -
GC 回收机制与分代回收策略
Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,这几个区域内不需要过多考虑回收的问题。而堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的就是这部分内存。什么是垃圾所谓垃圾就是内存中已经没有用的对象。 既然是”垃圾回收"原创 2020-10-06 20:47:37 · 279 阅读 · 0 评论 -
Java程序运行时,内存到底是如何进行分配的?
Java 的内存区域划分:Java 虚拟机在执行 Java 程序的过程中,会把它所管理的内存划分为不同的数据区域。下面这张图描述了一个 HelloWorld.java 文件被 JVM 加载到内存中的过程:HelloWorld.java 文件首先需要经过编译器编译,生成 HelloWorld.class 字节码文件。Java 程序中访问HelloWorld这个类时,需要通过 ClassLoader(类加载器)将HelloWorld.class 加载到JVM 的内存中。JVM 中的内存可以原创 2020-10-05 20:18:21 · 1441 阅读 · 0 评论 -
工厂模式
工厂方法模式抽象接口/** * 发型接口 */public interface HairInterface { /** * 实现了发型 */ public void draw();}接口实现类1public class LeftHair implements HairInterface{ @Override public void draw() { System.out.println("LeftHair");原创 2020-10-03 19:57:11 · 74 阅读 · 0 评论 -
详解原型模式的clone方法
Java中对象的创建clone就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1 使用new操作符创建一个对象2 使用clone方法复制一个对象那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造转载 2020-10-03 18:56:06 · 661 阅读 · 0 评论 -
Java线程池详解
背景Java 中线程的创建以及上下文切换是比消耗性能的,因此引入了偏向锁、轻量级锁等优化技术,目的就是减少用户态和核心态之间的切换频率。但是在这些优化基础之上,创建和销毁线程非常损耗性能,那有没有可能复用一些已经被创建好的线程呢?答案是肯定的,那就是线程池。另外,线程的创建需要开辟虚拟机栈、本地方法栈、程序计数器等线程私有的内存空间,在线程销毁时需要回收这些系统资源,频繁地创建销毁线程会浪费大量资源,而通过复用已有线程可以更好地管理和协调线程的工作。线程池主要解决两个问题:当执行大量异步任务时线程原创 2020-10-02 23:58:08 · 167 阅读 · 0 评论 -
Android Https的详解
Https的通信过程两种加密加密方式分两种,对称加密和非对称加密。这两种方式都有自己的优劣势, https中这两种方式都采用了。 我们约定S是服务端,C是客户端,客户端需要从服务端获取信息;对称加密这种加密方式比较简单,就是双方都持有密匙。S和C都持有密匙, S通过密匙加密明文传递给C,C获取加密后的信息,用密匙解密信息。优势: 加密速度快劣势: 密匙的传递是个问题,容易被截取,密匙一旦被截取后, 就能轻易破解信息。常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5原创 2020-09-20 16:45:04 · 4057 阅读 · 0 评论 -
Javassit学习
动态字节码生成技术Javassist使用方法总结Javassist 使用指南(一)Javassist 使用指南原创 2020-07-26 19:53:09 · 122 阅读 · 0 评论 -
Android编译时注解处理器
Java注解处理器Android 如何编写基于编译时注解的项目Java编译时注解处理器(APT)详解原创 2020-04-05 23:10:14 · 212 阅读 · 0 评论 -
设计模式之代理模式
概述1、代理模式简介代理模式是客户端不直接调用实际对象,而是通过调用代理对象来间接调用使用实际对象。在代理模式中有如下角色:ISubject: 抽象主题类,声明真实主题与代理的共同接口方法。RealSubject:真实主题类,代理类所代表的真实主题。客户端通过代理类间接地调用真实主题类的方法。Proxy:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口...原创 2020-04-01 13:07:33 · 121 阅读 · 0 评论 -
CountDownLatch详解
概述CountDownLatch中count down是倒数的意思,在构造CountDownLatch的时候需要传入一个整数n,在这个整数“倒数”到0之前,主线程需要等待,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。总结来说,CountDownLatch的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,然后主线程才继续往下执行。...转载 2020-03-03 00:36:46 · 1118 阅读 · 0 评论 -
Java并发编程-原子性变量
原子性布尔 AtomicBooleanAtomicBoolean 类为我们提供了一个可以用原子方式进行读和写的布尔值,它还拥有一些先进的原子性操作,比如 compareAndSet()。AtomicBoolean 类位于 java.util.concurrent.atomic 包,完整类名是为 java.util.concurrent.atomic.AtomicBoolean。1、创建一个 A...转载 2020-02-28 17:43:01 · 572 阅读 · 0 评论 -
不使用synchronized和lock,如何实现一个线程安全的单例?
背景单例,大家肯定都不陌生,这是Java中很重要的一个设计模式。稍微了解一点单例的朋友也都知道实现单例是要考虑并发问题的,一般情况下,我们都会使用synchronized来保证线程安全。那么,如果有这样一道面试题:不使用synchronized和lock,如何实现一个线程安全的单例?你该如何回答?实现C类应聘者:可以使用饿汉模式实现单例public class Singleton { ...转载 2020-02-28 12:02:32 · 204 阅读 · 0 评论 -
生产者消费者问题
问题描述线程模型中的经典问题生产者和消费者分别为两个线程(或进程),共享一个固定大小的缓冲区(存储空间),生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。生产者制造数据并且在缓冲区未满时写入,否则等待;在缓冲区为空的情况下写入数据并唤醒消费者读取数据;消费者在缓冲区不为空时读出数据,否则等待;在缓冲区满的情况...原创 2020-02-27 20:01:26 · 424 阅读 · 0 评论