Java
文章平均质量分 63
hudawei996
这个作者很懒,什么都没留下…
展开
-
找不到或无法加载主类 com.xxx.xxx.XXXKt原因
在Android 项目中,如果想随便弄一个main函数作为程序的运行入口,Java 的main()是不行的,因为Android程序中,只有Application才能成为程序的入口。如果在这种情况下,你运行fun main(){ },找不到编译后的Kt类,就很可能是你没有把kotlin的依赖引入到本工程中,导致不能在本项目中编译kotlin代码。原因: java.lang.ClassNotFoundException: com.xxx.xxx.XxxxKt。原创 2023-01-17 19:55:43 · 1497 阅读 · 0 评论 -
java集合中List,Set,Map的特点以及在工作中如何选型
提到java的数据结构我们首先想到的肯定是集合,什么map啦,list啦,set啦。下面我们就来说一说这些集合的特点以及特性。原创 2022-12-18 15:25:53 · 369 阅读 · 0 评论 -
彻底弄懂StringBuffer与StringBuilder的区别
彻底弄懂StringBuffer与StringBuilder的区别2、其append方法都是 super.append(str),调用了父类AbstractStringBuilder的append(String str)方法3、初始容量都是16和扩容机制都是"旧容量*2+2"4、底层都是用char[]字符数组实现,且字符数组都是可变的,这点不同于String4、由于StringBuilder没有考虑同步,在单线程情况下,StringBuilder的性能要原创 2022-12-07 18:04:29 · 3534 阅读 · 1 评论 -
Java中的String为什么要设计成不可变的?
Java中的String为什么要设计成不可变的原创 2022-12-07 17:58:08 · 1185 阅读 · 1 评论 -
一个线程可以有几个Looper?几个Handler?从Looper.prepare()来看看关于Looper的一些问题
之前我有篇文章里面写到了Android的消息机制,Handler发送消息的一些原理。从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)在消息机制里面,有一个非常重要的东西,那就是Looper,Looper的作用主要是从消息队列里面取出消息交给Handler处理。原创 2022-11-25 14:13:13 · 485 阅读 · 0 评论 -
关于ArrayList.clear()与=null以及new ArrayList<E>()
值得注意的是使用方法3需要进行如在内存中重新开辟内存空间等操作,开销较大,如果只是单纯的想要使用空的ArrayList对象,建议使用方法1,相对来说可尽量避免堆内存溢出问题。4.如果list变量的对象,有其他对象使用的时候,让它重新开辟空间,来重新赋值,比较合理。ArrayList对象内部维护一个对象数组elementData, 当执行clear()方法时, 会执行循环将elementData中每一个坐标都设置为为null, 并设置数组的size为0。1. 使用ArrayList的对象方法clear()原创 2022-10-18 17:18:51 · 730 阅读 · 0 评论 -
深入理解Java并发编程之把ThreadLocal扣烂
综上,我理解的使用ThreadLocalMap->Entry->key(即ThreadLocal)使用弱引用的原因是为了在用户没有进行手动的ThreadLocalMap::remove情况下,也能让系统有方法在set,get的时候进行部分的资源清理。从这个简单的访问过程我们看到正好这个 Session 是在处理一个用户会话过程中产生并使用的,如果单纯的理解一个用户的一次会话对应服务端一个独立的处理线程,那用 ThreadLocal 在存储 Session ,简直是再合适不过了。带来的二次寻址的循环。原创 2022-10-12 16:32:44 · 202 阅读 · 0 评论 -
Java 中动态代理(基于接口和基于子类)
所谓的动态代理,需要一个代理类,这个代理类是动态生成的,那么这个任务就需要交给Java虚拟机来做了,由Java虚拟机来去动态的生成代理类,也就是动态代理,动态代理分为:基于接口的动态代理和基于子类的动态代理。参数Callback:用于提供增强的代码,让开发人员写如何代理,一般都是写一个该接口的实现类,通常都是匿名内部类,此接口的实现类都是谁用谁写,一般都是该接口的子接口实现类:MethInterceptor。ClassLoader参数:类加载器,用于加载代理对象字节码和被代理对象使用相同的类加载器。原创 2022-10-06 00:33:19 · 725 阅读 · 0 评论 -
动态代理大揭秘,带你彻底弄清楚动态代理!
代理模式是一种设计模式,能够使得在不修改源目标的前提下,额外扩展源目标的功能。即通过访问源目标的代理类,再由代理类去访问源目标。这样一来,要扩展功能,就无需修改源目标的代码了。只需要在代理类上增加就可以了。其实代理模式的核心思想就是这么简单,在java中,代理又分静态代理和动态代理2种,其中动态代理根据不同实现又区分基于接口的的动态代理和基于子类的动态代理。原创 2022-10-03 12:01:22 · 5300 阅读 · 0 评论 -
Java多线程神器:join使用及原理
可以看出它是利用wait方法来实现的,上面的例子当main方法主线程调用线程t的时候,main方法获取到了t的对象锁,而t调用自身wait方法进行阻塞,只要当t结束或者到时间后才会退出,接着唤醒主线程继续执行。线程t开始后,接着加入t.join()方法,t线程里面程序在主线程end输出之前全部执行完了,说明t.join()阻塞了主线程直到t线程执行完毕。等待这个线程结束,也就是说当前线程等待这个线程结束后再继续执行,下面来看这个示例就明白了。如果没有t.join(),end可能会在0~5之间输出。原创 2022-09-28 12:53:52 · 196 阅读 · 0 评论 -
sleep( ) 和 wait( ) 的这 5 个区别,你知道几个?
sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。在之前的文章《》介绍了,它其实用的是 wait 实现的线程等待。原创 2022-09-28 12:54:54 · 192 阅读 · 0 评论 -
Java中的方法签名
由于重载方法之间的方法名是相同的,那么我们势必要从构成方法的其他几个要素中找到另一个要素与方法名组成能够唯一标示方法的签名,方法体当然不予考虑。那么就是形参列表和返回值了,但是由于对于调用方法的人来说,方法的形参数据类型列表的重要程度要远远高于返回值,所以方法签名就由方法名+形参列表构成,也就是说,方法名和形参数据类型列表可以唯一的确定一个方法,与方法的返回值一点关系都没有,这是判断重载重要依据,所以,以下的代码是不允许的。方法签名,顾名思义,方法的签名,来区分不同方法的标示符。原创 2022-09-26 16:49:03 · 1123 阅读 · 0 评论 -
什么?你还不知道字节码插桩!
ASM是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。原创 2022-09-26 16:18:17 · 742 阅读 · 0 评论 -
Java 动态代理详解
动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC远程调用、Java注解对象获取、日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。本文主要介绍Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理。由于Java动态代理与java反射机制关系紧密,请读者确保已经了解了Java反射机制,可参考上一篇文章《》原创 2022-09-26 14:15:08 · 824 阅读 · 0 评论 -
Kotlin协程的简单用法(GlobalScope、lifecycleScope、viewModelScope)
【代码】Kotlin协程的简单用法(GlobalScope、lifecycleScope、viewModelScope)原创 2022-09-21 00:32:41 · 1921 阅读 · 1 评论 -
java中static、final、static final的区别
方法参数中的final句柄,意味着在该方法内部,我们不能改变参数句柄指向的实际东西,也就是说在方法内部不能给形参句柄再另外赋值)。static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static修饰的属性、方法、代码段跟该类的具体对象无关,不创建对象也能调用static修饰的属性、方法等。final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。原创 2022-09-11 17:12:32 · 106 阅读 · 0 评论 -
Google Gson用法详解
Gson(又称GoogleGson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。gsonGson在默认序列化和反序列化方面提供了非常出色的功能。不过,我们可能会遇到默认和内置自定义选项无法解决我们问题的情况。在这种情况下,我们可以通过两个接口JsonSerializer和JsonDeserializer使用自定义序列化和反序列化。{}}{}}}{{{"id"{...原创 2022-07-25 17:12:13 · 1458 阅读 · 0 评论 -
Gson简单使用
Gson简单使用。原创 2022-07-19 16:43:52 · 112 阅读 · 0 评论 -
基础篇:带你从头到尾玩转注解
前面写了Android 开发:由模块化到组件化(一),很多小伙伴来问怎么没有Demo啊?之所以没有立刻放demo的原因在还有许多技术点没说完.今天我们就来细细评味Java当中Annotation,也就是我们常说的注解.本文按照以下顺序进行:元数据->元注解->运行时注解->编译时注解处理器.元数据由metadata译来,所谓的元数据就是“关于数据的数据”,更通俗的说就是描述数据的数据,对数据及信息资源的描述性信息.比如说一个文本文件,有创建时间,创建人,文件大小等数据,这都可以理解为是元数据.在java中,原创 2022-07-07 00:31:17 · 238 阅读 · 0 评论 -
在 Android Studio 上运行 Java 的 main 函数
下班临时有个小的功能,也都算不上功能。在 Android Studio 中运行 Java 的 main 函数,想想好像也是没有问题的,毕竟也是使用 Java 来实现的 app。想着应该不难,但是还是被打脸了,run 的时候提示了下面的错误,从提示来看,还依赖了 gradle* What went wrong:A problem occurred configuring project ':app'.> Could not create task ':app:MainJava.main()'. >原创 2022-07-06 15:33:34 · 1490 阅读 · 0 评论 -
Android使用Java编译时注解处理器(Annotation Processor)详解
Android 中使用Java注解处理器原创 2022-07-05 17:41:52 · 1551 阅读 · 0 评论 -
Java AbstractProcessor不生效问题
我出现的问题:1,日志没有打印2,编译没有生成Processor的Java文件,没有编译解决办法:1,参看别人的项目,他们是怎么写的具体解决方案:1,日志没有打印:2,没有编译,2.1,引入processlib//错误写法// implementation project(path: ':myprocessor')//错误写法// apt project(path: ':myprocessor')//正确写法 annotationProcessor project(path: ':原创 2022-06-27 18:45:07 · 1666 阅读 · 0 评论 -
annotation lib 和 processor lib如何引用
annotation lib 和 processor lib如何引用原创 2022-06-24 18:28:33 · 341 阅读 · 0 评论 -
自定义注解之编译时注解(RetentionPolicy.CLASS)
关联内容:java注解基础概念总结自定义注解之运行时注解(RetentionPolicy.RUNTIME)自定义注解之源码注解(RetentionPolicy.SOURCE)说到编译时注解(RetentionPolicy.CLASS)都要和注解处理器(Annotation Processor) 扯上关系,因为这里是真正体现编译时注解价值的地方。需要注意的一点是,运行时注解(RetentionPolicy.RUNTIME)和源码注解(RetentionPolicy.SOURCE)也可以在注解处理器进行处理,不原创 2022-06-24 16:21:19 · 403 阅读 · 0 评论 -
java注解之编译时注解RetentionPolicy.CLASS 基本用法
1 前言我们知道,在日常开发中我们常用的两种注解是运行时注解和编译时注解,运行时注解是通过反射来实现注解处理器的,对性能稍微有一点损耗,而编译时注解是在程序编译期间生成相应的代理类,替我们完成某些功能。今天我们来讲解一下编译时注解以及写一个小例子,以便加深对编译时注解的理解。2 编译时注解编译时注解(RetentionPolicy.CLASS),指@Retention(RetentionPolicy.CLASS)作用域class字节码上,生命周期只有在编译器间有效。编译时注解注解处理器的实现主要依赖于A原创 2022-06-24 15:42:30 · 1279 阅读 · 0 评论 -
Java多线程sleep和wait的区别
java sleep和wait方法的异同原创 2022-06-13 11:16:06 · 178 阅读 · 0 评论 -
二分查找算法(Java版)
二分查找Java实现原创 2022-06-01 16:35:16 · 2375 阅读 · 0 评论 -
sleep( ) 和 wait( ) 的这 5 个区别,你知道几个?
sleep(休眠) 和 wait(等待) 方法是 Java 多线程中常用的两个方法,它们有什么区别及一些该注意的地方有哪些呢?下面给大家一一分解。在之前的文章《Java多线程神器:join使用及原理》介绍了,它其实用的是 wait 实现的线程等待。区别1:使用限制使用 sleep 方法可以让让当前线程休眠,时间一到当前线程继续往下执行,在任何地方都能使用,但需要捕获 InterruptedException 异常。try { Thread.sleep(3000L);} catch原创 2022-05-25 11:21:37 · 815 阅读 · 0 评论 -
UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
由于用的少,老是忘记这些箭头的作用,在看一些类图的时候,有点懵。其实总的来看下,要表达的意思还是很简单的。1,继承(三角头+实线)被指向的是父类2,实现(虚继承,我自己取的名字,便于和继承对比区别)(三角头+虚线)(虚线表示继承虚)被指向的是接口类3, 依赖(箭头+虚线)(虚线表示依赖弱)类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B.原创 2022-02-18 11:35:58 · 4248 阅读 · 0 评论 -
wait, notify 和 notifyAll区别
今天正好碰到这个问题,也疑惑了好久。看了一圈知乎上的答案,感觉没说到根上。所以自己又好好Google了一下,终于找到了让自己信服的解释。先说两个概念:锁池和等待池锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchroni...原创 2022-02-18 00:36:18 · 609 阅读 · 0 评论 -
IoC Inervsion of Control的理解
IoC Inervsion of Control (控制反转):其实她就是一种是思想,以前是调用程序自己控制需要实例化什么类,现在是容器来帮你实例化类,你只需要告诉我,类的一些描述信息,容器帮你去找,容器控制实例化哪个类。以前是你控制,现在是容器控制,站在人和机器的立场上,可不就是反转了吗。...原创 2022-02-16 16:45:30 · 253 阅读 · 0 评论 -
kotlin,java接口大乱调
1,Java 接口类 :JavaCallback.javapublic interface JavaCallback { void show(String info);}java 接口使用类:public class JavaManager { public void setCallback(JavaCallback javaCallback){ javaCallback.show("info"); }}2,Kotlin接口类:KTCallba原创 2021-08-19 14:30:03 · 286 阅读 · 0 评论 -
kotlin,Java大乱调
1,JavaStudent.javapublic class JavaStudent { public static String in = "INNNNNN"; public String getString(){// return "goals"; return null; }}2,KtStudent.ktclass KtStudent {//in,when和kt中关键字冲突,所以需要``包裹 companion原创 2021-08-19 13:43:13 · 142 阅读 · 0 评论 -
Java调KT类
1,MyUtuils.kt将被调用的文件class MyUtils { fun show(info:String){ println(info) }}fun show(info:String){ println(info)}2,Java文件调用该类,ClientJava.javapublic class ClientJava { public static void main(String[] args) { /**原创 2021-08-19 11:20:26 · 1674 阅读 · 0 评论 -
kotlin object单例在kt 和Java中调用的异同
1,kotlin object 单例类:LoadingDialog2.ktobject LoadingDialog1 { fun a(){ } //添加注释变成真正的静态方法 @JvmStatic fun b(){ }}2,Java文件调用这个类:ClientJava.javapublic class ClientJava { void test(){ LoadingDialog1.INSTANCE.a()..原创 2021-08-19 10:59:05 · 1763 阅读 · 0 评论 -
kotlin文件查看编译后的Java文件
原创 2021-08-19 10:57:11 · 541 阅读 · 0 评论 -
String[]和List<String>区别
[]数组:是线性存储,只便于查找和修改,不便于增删,所以这种类型的只适合作为接受参数展示一下。list列表:是链式存储,Java已经包装好方法,便于增删改查。================================================================String[]和List<String>的互换String[]转List:List list = Arrays.asList(arr);List转String[]:String[]原创 2021-08-12 11:38:51 · 5397 阅读 · 1 评论 -
聊聊Android切线程
线程(英语:thread)是操作系统能够进行运算调度的最小单位。线程如何切换,什么时间片执行哪个线程完全有CPU控制,一般大家写代码也很少涉及到这个层面的设置。但是在Android中很多提到,从主线程切到网络io线程,然后从网络线程切到主线程去修改UI。个人认为从中文角度上来说,切,这个词就是我本来在做A事情,然后突然保存现场去做B事情,两者有个唯一性。从CPU角度,是唯一执行的,某个时间片只有一个线程被执行。...原创 2021-06-29 17:40:22 · 270 阅读 · 1 评论 -
java 的init方法与clinit方法
jvm加载过程加载=》验证=》准备=》解析=》初始化=》使用=》卸载一 clinit初始化/静态方法类型初始化方法主要是对static变量进行初始化操作,对static域和static代码块初始化的逻辑全部封装在方法中。java.lang.Class.forName(String name, boolean initialize,ClassLoader loader),其中第二个参数就是是否需要初始化。Java类型初始化过程中对static变量的初始化操作依赖于static域和...原创 2021-06-25 15:29:54 · 1438 阅读 · 1 评论 -
Java 对象句柄
每种编程语言都有自己的数据处理方式。有些时候,程序员必须时刻留意准备处理的是什么类型。您曾利用一些特殊语法直接操作过对象,或处理过一些间接表示的对象吗(C或C++里的指针)? 所有这些在Java里都得到了简化,任何东西都可看作对象。因此,我们可采用一种统一的语法,任何地方均可照搬不误。但要注意,尽管将一切都“看作”对 象,但操纵的标识符实际是指向一个对象的“句柄”(Handle,也就是包装类的申明)。在其他Java参考书里,还可看到有的人将其称作一个“引用”, 甚至一个“指针”。可将这一情形想象...原创 2020-06-12 15:53:58 · 584 阅读 · 1 评论