- 博客(53)
- 收藏
- 关注
原创 Java中的集合相关知识汇总
Java集合 从数据结构可以分为:数组、Set、Map、队列、栈;从多线程安全可以分为线程安全与非线程安全的集合点线框表示接口;折线框表示抽象类;实线框表示实现类;
2024-07-28 22:33:12
299
原创 Service学习笔记02-实战 startService 与bindService
启动服务通过绑定服务的方式可以在客户端获取对应Service的引用,从而完成与Service的交互。主要过程如下图所示:首先,在继承Service的自定义服务中新建一个继承自IBinder的内部类,在IBinder中获取myService的引用在服务的onBinder()方法中将Service中的IBinder对象注入(这个方法会在绑定服务成功的时候被调用,客户端可以通过这个方法获得IBinder对象,进而获取Service的引用)在客户端声明一个ServiceConnection 对象,在Ser
2022-06-05 12:14:50
732
原创 adb 命令学习笔记
01 获取系统版本adb shell getprop ro.build.version.release02 获取SDK版本号adb shell getprop ro.build.version.sdk
2022-05-29 11:24:51
199
原创 Android Handler消息机制03-Message源码学习
0. 系列文章汇总Android Handler消息机制01-Message源码学习Android Handler消息机制02-Looper源码学习[Android Handler消息机制03-Message源码学习](https://editor.youkuaiyun.com/md/?articleId=1247885441.关键机制说明1.1分发机制分发是在Looper.loop()会在for循环中不停地从Message Queue中取出消息,并调用消息对应的Handler对象的dispatchMe
2022-05-21 23:18:25
371
原创 Android Handler消息机制02-Looper源码学习
1.源码本文主要是对Looper类的源码进行解析学习,用于更深入的理解Handler消息机制Looper的源码路径为:android.os.Looper1.2 典型案例如下展示了一个源码中提供的典型实例class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler()
2022-05-11 23:35:39
770
翻译 【转载】ProGuard
目的目的是为了将部分频繁一起调用类指定为同一个包名,目的为是减少.dex mmap的大小依据来源是:根据对Dex数据的观察,我们发现Dex文件中数据基本是按类名的字母顺序进行排列的,这样同样包名的类会排在一起。但在实际程序执行中,同一个package下的类并不会全部一起调用,而是和很多其他package下的类进行交互,但mmap加载了整个页面(4K),可能会有很多无用数据。为了减少这样的情况,我们在生成文件时要尽量将使用到的数据内容排布在一起。在APK的编译流程中,Proguard混淆工具正好是能够
2022-04-08 00:02:53
228
原创 【学习笔记】Android进程调度及优化
ADJ算法如何查询应用当前adj值应用进程生命周期与ADJADJ级别ADJ级别定义在com.android.server.am.ProcessList.java中,oom_adj划分为16级,分别如下所示(Android 11)在AndroidADJ级别Android 以上取值android以下取值解释UNKNOWN_ADJ100116一般指将要会缓存进程,无法获取确定值CACHED_APP_MAX_ADJ99915不可见进程的adj最大值CACH
2022-04-05 22:14:23
946
原创 【Android 内存优化】dumpsys meminfo PID 查看单进程内存信息详解
【Android 内存优化】dumpsys meminfo PID 查看单进程内存信息详解
2022-04-05 21:56:18
11012
1
原创 Android Handler消息机制01-Message源码学习
1. 背景背景是在实际开发中,有一个Message消息在主线程接收到了后,将Message切换到子 线程去处理,但是出现了Message.obj被串改或者被置空,导致出现NullPointException或者ClassCastException,此时正好从源码分析下出现的原因和优化方法。2. Message几个关键点2.1 recycle什么时候会被调用recycle被调用也即意味着这个消息对象会清空,并重新加入到消息池中等待调用。这就意味着某个Message对象在回收之后再使用此消息会出现空指针
2022-03-27 23:19:08
2050
原创 Java内存学习笔记05-内存分配与回收策略
内存分配与回收策略对象优先在Eden分配前面已经提到过,在新生代,Eden和Survivor区域的容量比值,比值为8,在大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。Minor GC和Full GC的区别新代代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象 大多都具有 朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。老年代GC (Majar GC、Full GC)指发生在老年代的
2022-02-27 18:30:56
563
原创 Java内存学习笔记04-垃圾收集算法与垃圾收集器
1.垃圾收集算法1.1 标记-清除算法最基础的收集算法是“标记-清除”(Mark-sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另一个是空间问题,标记清除之后会产生大量的不连续的内存碎片,空间碎片可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一
2022-01-12 22:32:07
273
原创 Java内存学习笔记03-判断对象是否存活
1.前言Javam内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈本个区域随着线程而生,随线程而灭; 栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由JIT编译期进行一些优化,但在本章基于概念模型的讨论中,大体可以认为是编译期可知的),因此这几个区域的内存分配和回收都具备确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了,而Java堆和方法区则不一样,一个
2022-01-03 12:26:04
445
原创 Java内存学习笔记02-对象访问
对象访问在Java语言中,即使是最简单的访问,也会涉及Java栈,Java堆、方法区这三个最重要的内存区域之间的关联关系,如下面这句代码:Object obj = new Object();假设这句代码出现在方法体中,那Object obj这部分的语义将会反映到Java栈的本地变量表中,作为一个reference类型数据出现。而new Object()这部分的语义将会反映到Java堆中,形成一块存储了Object类型所有实例数据值(Instance Data,对象中各个实例字段的数据)的结构化内存。
2022-01-03 11:38:22
156
原创 Java内存学习笔记01-运行时数据区域划分
运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域,如下所示:1. 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。程序计
2022-01-03 10:58:12
568
原创 设计模式-观察者模式
1.定义1.1抽象定义报社的业务是出版报纸向某家报社订阅报纸,只要他们有新报纸出版,就会向你送来,要是你是他们的订户,你就会一直收到他们的报纸。当你不想再看报纸的时候,取消订阅,他们就会不再送报纸来。相当于出版者+订阅者= 观察者模式,出版者改为为“主题”(subject),订阅者改称为“观察者”(Observer)。1.2 标准定义观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都你会收到通知并自动更新。观察者模式定义了一系列对象之间的一对多关系。当
2021-12-19 22:29:09
101
原创 Android学习笔记-Broadcast01-详解广播机制
前言广播是一个消息通知机制,Android提供了一套完整的API,允许应用程序自由地发送和接收广播。就是我们常说的Android 四大组件之一的广播接收器(Broadcast Receiver).广播机制说明广播类型广播常分为两种类型,标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都在会同一时间收到这条广播消息,之间也没有任何先后顺序可言,并且也无法被截断。有序广播(Ordered broadcasts)则是一个同步执行的广播,在广播
2021-07-18 22:05:10
256
原创 Android-View是否可见设置
三种模式VISIBLE三种状态的定义都是在android.view.View中定义的,VISIBLE 说明View是可见的可以通过代码中setVisibility(View.VISIBLE)来设置或者通过layout中通过android:visibility来设置INVISIBLE表示View不可见,但是依然占用了视图的布局空间GONE表示View不可见,并且不占用视图的布局空间,一般来说,不可见采用这种...
2021-07-13 08:42:40
1426
原创 Java Exception相关问题总结
疑问及解答在方法中throw 异常,一定在方法上声明吗?什么场景下不需要声明这个问题出现的问题是,我实现的一个方法是耗时操作,所以限制在UI主线程中操作,避免出现ANR,所以在方法中,如果判断当前是主线程,则直接抛出IllegalThreadStateException,但是review 代码的时候,Commiter 要求我在方法声明的后面加上throws IllegalThreadStateException的声明,所以我重新分析和验证了下其中的必要性,结果是:不必要 if (Lo
2021-06-15 00:11:24
1249
4
原创 AsyncTask学习与实战
前言Android 系统默认会在主线程(UI 线程)执行任务,但是如果有耗时程序就会阻塞 UI 线程,导致页面卡顿。这时候我们通常会将耗时任务放在独立的线程,然后通过 Handler 等线程间通信机制完成 UI 的刷新。很多时候我们也许只是想执行一个简单的任务,为此写一套 Handler 线程通信就会显得比较复杂,不用担心,Android 系统为我们提供了一个专门用于执行异步任务的工具——AsyncTask在Android的android.os.AsyncTask的类前注释(2021-05),对Asyn
2021-05-23 21:21:59
837
6
原创 设计模式-单例模式-场景说明与Java三种实现方法
单例的定义与特点单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自动创建这个实例的一种模式。 在计算机系统中,Windows的回收站,操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web应用的配置对象,应用程序中的对话框、系统中的缓存等都属于单例场景应用场景对于Java来说,单例模式可以保证在一个JVM只存在一个单一实例,单例模式的应用场景主要有以下
2021-01-03 12:18:34
225
2
原创 【RandomAccessFile类多线程场景踩坑】
背景本来是想开发一个满足多线程场景需求的对指定内容写入log文件的工具类,同时拥有缓存机制,只有待写入内容超过缓存空间大小时才会进行写入。但是在多线程测试时却发现,在多线程场景下,会存在文件内容与写入内容混乱的问题如下:85列nnnn后面会写入tttt。核心实现方法//将指定内容写入指定文件,同时支持内容缓存,减少文件读写操作public class FileUtil { public final static String filePath = "D:/TestFile/";
2020-12-18 20:28:30
1521
原创 使用IDEA community快速创建Springboot项目
背景在家中使用的IDEA 的社区版,无法通过New Project->Spring Initializer来快速创建一个Springboot项目,所以我可以通过在其官网下载demo来快速SpringBoot项目操作进入官网然后选择自己的配置Project 类型,Maven or GradleLanguage ,一般默认选择JavaSpringBoot的版本,一般选择最新的稳定版本即可Project MetaData 项目元数据;一般填写Group 和Artifact即可。然后Pack
2020-12-06 13:00:00
1785
原创 Python读写文件的推荐写法-try-open
Python读写文件的推荐写法-try-openpython读写文件存在种写法,下面介绍最常见的两种,然后再我觉得比较规范和完整的一种写法直接通过open来打开文件并读写文件open的语法格式如下:def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)modet 文本模式 (默认)。x 写模式,新建一个文件,如果该文件已存在则会报错。b 二进制模式
2020-11-15 22:14:58
2183
原创 MySQL-查询表结构的两种常用方式
常用的两种方式1 desc tableName当然你也可以用describe tableName来查询,结果与desc是一样的,查询的内容有字段名称、类型、是否可为空、键类型、默认值、是否自增等信息。1.1样例mysql> desc users;+---------------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Defaul
2020-08-30 23:53:47
886
原创 Java-Arrays.copyOf和System.arraycopy()的关联与区别
Array.copyof源码/*Array.copyof()实现会调用System.arraycopy()的方法 *original :原数组,int newLength:新数组的长度 * 返回值:拷贝的新数组,属于深拷贝 */public static <T> T[] copyOf(T[] original, int newLength) { retu...
2020-04-12 12:42:49
288
转载 MySQL 的limit 和offset 的说明和使用
一、limit在SELECT语句中使用LIMIT子句来约束结果集中的行数。LIMIT子句接受一个或两个参数。两个参数的值必须为零或正整数。1.1两个参数的LIMIT子句语法:SELECT column1,column2,...FROM tableLIMIT offsetV , countV;SQL我们来查看LIMIT子句参数:offset参数指定要...
2020-02-23 19:26:23
2098
原创 JDK 8在Windows 10安装与环境配置,以及在IDEA中的配置
前言在2019年11月,JAVA在ORACLE的官方版本已经升级到JAVA 13了,但是目前基本上商用的java web服务基本上还是用JDK 8作为自己JAVA项目的运行环境,如下源引国外一家的机构的调查结果,所以本文还是以JAVA8作为安装的例子。java 8的下载与安装我们可以在Oracle的官网上直接进行下载,但是好像需要注册并登录才能下载。下载链接:https://w...
2019-11-03 22:21:13
1008
原创 【转载】MySQL在Windows下的安装方法
我主要是参考菜鸟教程上的安装方法进行安装,但是MySQL WorkBeach和MySQL是两个不同的产品,如果我们需要在电脑构建本地数据库需要在电脑上安装MySQL。参考链接https://www.runoob.com/mysql/mysql-install.html遇到的问题记录1、在安装完Mysql后,安装路径下需要添加一个my.ini文件,我们添加的my.ini文件与如上...
2019-10-26 00:15:41
129
原创 Java与Javascript的foreach循环的区别
Java中的 foreach循环是对变量进行循环。而Javascript是对对象的下标进行循环也就是说,在Javascript中,你无法在foreach循环中直接访问变量,需要借助下标来访问实际的对象。举例说明。Java的foreach循环样例public class Main{ public static void main(String[] args){ ...
2019-10-21 23:33:09
320
原创 Compareble和Comparator的比较
Comparable接口Comparable是java.lang包下的一个接口,源码如下:只有一个方法compareTo,Comparable/** @param <T> the type of objects that this object may be compared to* @author Josh Bloch* @see java.util.Compa...
2019-09-25 00:17:16
424
转载 【转载】MySQL 和MySQL workbeach安装教程
本博客转载如下链接的博客https://blog.youkuaiyun.com/yangwei234/article/details/89028314
2019-09-15 18:57:17
731
原创 Java的重写与重载
Overriding:方法重写、覆盖;子类保证原有方法的返回值,方法名,参数列表一致的前提下,在子类中将函数重新实现一遍。Overloading:方法重载;同一类中,返回值和方法名相同,参数列表不同的函数实现两者都是Java多态性的体现,方法重写是父类与子类之间多态性的体现,而方法重载主要是类内部多态性的体现,也就是说重载是编译时多态,因为在编译期间就已经决定了用哪个重载方法...
2019-08-25 15:39:50
164
转载 C++数据类型
使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当创建一个变量时,就会在内存中保留一些空间。在编程过程中,可能需要存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等)信息,操作系统会根据变量的数据类型,来分配内存和决定在保存内存中存储什么。基本的内置类型,C++提供了七种基本的C++数据类型:类型 ...
2019-07-13 17:48:07
147
原创 C++在Windows的环境搭建(Clion+MinGW)
C++是属于静态语言,需要先编译再运行,所以我们需要一个编辑器来对代码进行编写,以及一个编译器对我们编写的C++代码 进行编译,编译成电脑能运行的二进制文件。(现在成熟、商业的的IDE都集成了编辑器、编译器以及其他功能。能完成代码编写、调试、编译等功能)简单介绍Clion关于开发的IDE我比较比较推荐JetBrains公司的产品,包括Java,Python,C++等都可以利用这家公司的...
2019-07-13 16:33:37
2570
原创 HTTP状态码
前言HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。例如:状态行由HTTP版本号、状态码和原因短语组成。1 状态码的类别状态码如200 OK,以3位数字和原因短语组成。数字中的第一位指定了响应类别,后两位无分类。响应类别有以下5种 类别 原因短语 1XX informational(信息状态码...
2019-05-16 21:36:50
310
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人