自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 线程安全和锁安全

所以完全忽略了同步问题,让这个线程一直持有这个锁,哪怕退出了锁住的代码块也不解锁,减少了每次加锁、解锁带来的开销。自旋锁是指当一个线程无法得到锁的时候会执行检查锁状态的操作等待得到锁,而不是进入睡眠等待锁,这种检查锁状态虽然减少了挂起恢复消耗的性能,但是本身检查的过程也在消耗CPU。轻量级锁是指当一个线程获取到锁后,有其他的锁想要得到这个锁,不会马上让它进入阻塞,会使其自旋等待。锁粗化的核心思想是将多个细粒度的锁合并成一个更粗粒度的锁,以减少锁的获取和释放次数。

2024-09-18 19:19:49 813

原创 java的内存模型和线程调度

计算机同时处理多个任务,一方面是因为计算机的运算能力强大,另一方面,也有计算机运算速度和它存储与通信子系统是速度差距太大的原因,很多时间浪费在了IO读取,网络通信等任务上,如果无法并发将会浪费许多的运算资源。虽然高速缓存解决了处理器和内存速度的问题,但是多个处理器,每一个处理器都有自己的高速缓存,但是他们都共享同一内存,如果多个处理器处理同一块内存上的数据可能导致出现同步问题,为了保证一致性,计算机设置了缓存一致性协议,通过协议保证数据的同步。

2024-09-18 19:18:49 1324

原创 java类加载机制

并设置类变量初始值的阶段从概念上讲,这些变量所使用的内存都应当在方法区中进行分配(JDK8过后将类变量放到了堆中)这里注意设置初始值不光是实例变量设置初始值,包括一些数据类型的零值,比如int在这里插入图片描述。

2024-09-16 16:39:51 979

原创 java中Class文件的文件格式

还是这张图一个Class文件首先是四个字节的一个魔数用来表示是否可以被虚拟机接收,然后是版本号,次级版本号,然后是常量池中存储我们需要使用的数据,不光是编译前的数据还包括编译时的数据比如接口限定名等,在这里首先会使用一个u2的大小记录常量池大小然后在根据不同记录常量,在常量记录完毕之后是访问标识是一些类的访问信息,然后是类索引父类索引等,接下来是接口索引记录接口数量,然后会有一个接口池记录接口信息,接口记录完毕后面就是字段表,方法表,属性表的记录,这些表都有一个计数器记录大小魔数版本,次版本。

2024-09-16 16:36:14 927

原创 java的内存分配和回收机制

哪些内存需要回收?什么时候回收?如何回收?Java 内存运行时区域中程序计数器****、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出 栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,在这几个区域 内就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随着 回收了。Java 堆和方法区这两个区域则有着很显著的不确定性。

2024-09-15 17:00:41 1619

原创 java内存概述

字节码的行号指示器,明确下一步命令执行什么,每个线程独立java虚拟机栈:存放java方法,当一个方法开始执行创建栈帧,执行结束栈帧出栈局部变量表中以局部变量槽为对象存储数据,线程独立本地方法区:和上面类似,不过是处理本地方法存放对象实例,所有线程共享方法区:存储已经加载的类型信息,常量,静态变量,代码缓存等信息,所有线程共享。

2024-09-15 16:54:55 1529

原创 Android 设计模式

单例模式:核心在于一个类创建一个实例,这里除了饿汉式(线程不安全),其他五种方式全部是线程安全的简单工厂模式:这里模式核心在于创建了一个工厂,这个工厂可以根据参数不同返回不同类的实例,这些实例具有同一个父类工厂方法模式:核心在于定义一个创建对象的接口,但让实现该接口的类来决定实例化哪一个类将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。主要用于需要生成的对象具有复杂的内部结构,这些对象的生成过程需要独立于构件的创建过程和组合方式。

2024-09-11 16:56:11 1913

原创 Android相关线程基础

阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。一个线程可以从队列中获取元素,如果队列为空,那么线程会阻塞直到队列中有元素;同样地,一个线程可以向队列中插入元素,如果队列已满,那么该线程会阻塞直到队列中有空间。

2024-09-11 16:52:42 1505

原创 理解Window和WIndowManager

Window表示一个窗口的概念,在日常开发中直接接触Window的机会并不多,但是在某些特殊时候我们需要在桌面上显示一个类似悬浮窗的东西,那么这种效果就需要用到Window来实现。Window是一个抽象类,它的具体实现是PhoneWindow。创建一个Window是很简单的事,只需要通过WindowManager即可完成。

2024-09-10 21:37:41 1491

原创 View动画介绍

派生一种新动画只需要继承 Animation这个抽象类,然后重写它的initialize和applyTransformation方法,在initialize方法中做一些初始化工作,在applyTransformation中进行相应的矩阵变换即可,很多时候需要采用Camera来简化矩阵变换的过程。是因为自定义View动画的过程主要是矩阵变换的过程,而矩阵变换是数学上的概念在实际开发中很少用到自定义View动画。这里提供一个自定义View动画的例子,/**otherwise*/

2024-09-10 21:12:43 1385

原创 View的基础认识了解

所以说,View是一种界面层的控件的一种抽象,它代表了一个控件。除了View,还有ViewGroup,从名字来看,它可以被翻译为控件组,言外之意是ViewGroup内部包含了许多个控件,即一组View。在Android的设计中ViewGroup也继承了View,这就意味着 View本身就可以是单个控件也可以是由多个控件组成的一组控件,通过这种关系就形成了View树的结构,这和Web前端中的DOM树的概念是相似的。

2024-09-09 11:56:24 1906

原创 Activity的生命周期和启动模式

1,onCreate : 表示正在Activity创建2,onRestart: 表示Activity正在重新启动,比如打开新的Activity返回到本Activity中时(由不可见变为可见状态时会调用)3,onStart : 表示Activity正在启动,即创建后开始启动(此时活动不一定可见)4,onResume : 表示Activity已经可见,可以在前台发生活动。

2024-09-09 11:51:44 1689

原创 Retrofit源码解析

serviceMethodCache是Retrofit2的一个缓存机制(实际上是Map),用于缓存已经解析的ServiceMethod对象,ServiceMethod 对象代表了一个被注解修饰的接口方法,在Retrofit中,当你定义了一个接口用于发起网络请求时,每个接口方法背后都会对应一个。所以我们只需要看真正的实现,真正干事的部分,即代理实例调用方法的部分的invoke()里,在实际操作里,会执行对应Retrofit生成的动态代理类的invocationHandler.invoke()

2024-05-24 21:37:52 900 2

原创 EventBus使用以及源码处理

这部分之前学习过了,这里贴了我之前写的博客。

2024-05-24 21:21:19 741

原创 Okhttp简单使用与源码思路处理

前面大概解释了三个核心类的大概作用,现在详细介绍一下他们各种的作用。

2024-05-18 21:17:43 977

原创 NavigationView实现抽屉布局

他在里面放置了俩个直接子控件,第一个控件是FrameLayout,用于作为主屏幕中显示的内容,第二个控件是TextView,用于作为菜单中显示的内容,第二个子控件需要注意,他的layout_gravity这个属性是必须指定的,该属性可以指定滑动菜单是在屏幕的左边还是右边。上面我们制作了菜单,但是他需要更多布局来美化,这个过程Google提供了更好的方法,就是这里的NavigationView,他侧面划出可能不太方便,这里直接为他设置一个按键,点击按钮就会弹出菜单。第一步导入库导入依赖。

2024-05-07 20:58:58 638

原创 EventBus的使用以及注意事项

Android系统中的事件通信是 handler (消息机制) 和 BroadCastReceiver (广播机制), 通过它们可以实现组件之间的事件通讯。缺点在于,代码量多、组件之易产生藕合引用。这时候EventBus就展示出了他的优点EventBus 是一种在软件开发中使用的发布/订阅(Pub/Sub)事件通信机制假设你是一个读者,你对多个报纸感兴趣,但你并不想每天亲自去买每一份报纸。这时,你可以选择订阅报纸的服务。

2023-12-07 20:32:13 982

原创 ARouter由入门到使用,理论和范例

Route作用:用于标记目标页面,即Android组件,如Activity或Fragment等,以便ARouter能够找到并跳转到这些组件。属性path(必须):指定了跳转的路径,这个路径需要在当前项目中唯一,通常遵循/模块名/页面名的格式。group(可选):用于分组,可以按照模块划分,方便管理,如果不指定,ARouter会根据路径自动生成。

2023-12-05 21:07:07 306 1

原创 组件化入门到使用(1)及其详细一步一步入门学习

在上面讲述了组件化的好处,但是只是单纯的知道了组件化是将一个项目分为多个小组件但是并不了解什么是组件化,这里开始正式介绍组件化组件化是一种软件架构设计方法,它将整个软件系统划分为多个独立的功能模块,每个模块都被作为一个单独的组件进行开发、测试和部署。这些组件可以是独立的可执行文件、动态链接库、静态库、甚至是服务或微服务,它们之间通过明确的接口和协议进行通信。

2023-12-05 20:33:17 341 1

原创 浅析MVC,MVP,MVVM与其联系

当从MVC(Model-View-Controller)演变到MVP(Model-View-Presenter),再到MVVM(Model-View-ViewModel)时,是一个逐步将逻辑与视图分离的过程。在MVC中,模型(Model)负责存储数据和业务逻辑,视图(View)负责用户界面的展示,控制器(Controller)充当模型和视图之间的协调者。但是,视图和控制器之间的关系紧密耦合,导致视图难以独立测试和重用。为了解决这个问题,MVP模式引入了Presenter层。

2023-11-26 22:41:36 123 3

原创 Intent详细解释,复杂数据类型传递

当我们需要在Intent中携带自定义的对象(基本数据类型在底层封装类中都已经实现过了)时,这些对象需要实现 Serializable 或 Parcelable 接口,以便能够在不同组件之间进行序列化和反序列化。序列化指的是将对象转换为可存储或可传输的格式,例如字节流或者JSON字符串。而反序列化则是将存储或传输的数据重新转换为对象。在Android中,当我们在Intent中传递自定义对象时,系统需要将这些对象序列化为字节流,以便在不同组件之间传输或存储;

2023-11-12 21:56:31 526

原创 Fragment的俩种跳转方式,有理论有范例

现在的很多软件都要涉及多个页面的切换,这里就可以使用Fragment来做到,若使用Fragment来实现这个效果就会有一个问题,那就如何做到多个Fragment的切换,这里介绍一下Fragment的俩种切换方式,在Android中,Fragment的切换主要有两种方式:使用replace方法和使用hide/show方法。

2023-11-12 21:50:19 2671

原创 浅谈CoordinatorLayout

CoordinatorLayout 是一个增强版的 FrameLayout,它扩展了 FrameLayout 的功能,使得子视图可以更好地进行协调和交互。它是通过使用一些特殊的 Behavior 对象来实现的,这些 Behavior 对象定义了子视图之间的交互规则,单指没有太大的作用,重要的是配合behavior来使用!

2023-11-12 21:42:19 660

原创 BottomSheet 的使用介绍(BottomSheetBeahvior,BottomSheetDialog,BottomSheetDialogFragment)

BottomSheet是一种从屏幕底部向上滑出一个对话框的效果,可以用来显示内容或者提供与用户相关的操作,在开发过程中十分常见,Bottom Sheet 具体实现主要包含:BottomSheetBeahvior 、BottomSheetDialog、BottomSheetDialogFragment,这三个组件均可以实现半屏弹出效果,区别点在于接入和使用方式上的差异三个组件的概述。

2023-11-12 21:37:19 3126 1

原创 Retrofit

在注解指定的接口地址中使用了一个{page}的占位符,然后又在getData()方法中添加了一个page参数,并使用@Path(“page”)这个注解来申明这个参数,这样在调用getData方法进行申请的时候Retrofit就会自动把page参数的值替换到占位符的位置。这里ResponseBody,除了EGT其他的更多是操作服务器上的数据,而不是获取服务器上的数据所以他对服务器响应的数据并不关心,这时候ResponseBody表示可以接收任意类型的数据,并不会对响应数据进行解析。接口的匿名类的实例。

2023-11-02 21:45:58 71

原创 安卓 java完成天气预报,如果你刚刚开始完全不知道怎么写,可以进来看看

自己仿写了一个小项目,在里面有一些新的东西需要学习,并且整体思路整理一下,这里从头开始一点点讲解这个项目,会尽量细一点起初是根据第一行代码第三版写的,不过这里使用的语言是java,在第一行语言中他将其整体分为了三个部分(三个功能),书上使用了MVVM框架,他把数据和UI分割开来,然后有一个连接二者的桥梁,一共三个部分,这里先根据他的思路讲解,注意这里我使用的不是书上的彩云天气,而是和风天气,所以后面的数据导入会和书上不同使用MVVM框架,因为找不到在ViewModel层开始就不和Activity直接联系所以

2023-11-02 21:10:10 213

原创 androidstudio学习有关UI的部分内容

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uK903oQC-1690111407236)(E:\笔记\笔记内图片\QQ截图20230718163634.png)]我们使用的所有是控件都是继承于View的,所有的布局都是继承于ViewGroup。引入布局的技巧确实解决了重复编写布局代码的问题,但是如果布局中有一些控件要求 能够响应事件,我们还是需要在每个活动中为这些控件单独编写一次事件注册的代码。

2023-07-23 19:23:42 424 2

原创 collection集合

​ //add有返回类型,为boolean类型,list类型一定返回true,set若添加数据之前不存在则返回true,表示添加成功,若 已经存在则返回false。​ boolean hasNext() 判断当前位置是否有元素,有元素返回true ,没有元素则返回false。E set (int index ,E element) 修改指定位置处的元素,返回被修改的元素。

2023-06-04 17:29:56 62 1

原创 常用类(Math,Object,Runtime,System,BigInteger,BigDecimal)

用于数学计算的工具类,abs(int a) 绝对值ceil (double ) 向上取整floor (double a) 向下取整round (float a) 四舍五入max(int a,int b)获取俩个int 值中的较大值pow (double a,double b) 返回a的b次幂sqrt(double a) 开方cbrt(double a) 开立方random() 返回随机值,范围为(0,1)

2023-05-28 16:59:20 67 1

原创 接口和抽象类

/没有{}public abstract class 类名 {1.接口的定义利用关键字interface定义public interface 接口名 {2.接口不能实例化3.接口和类是实现关系,通过implements关键字表示(可以多实现)(可以让一个类在继承一个类的同时 实现多个接口)public class 类名 implements 接口名 {public class 类名 implements 接口 1 , 接口 2 {

2023-05-21 15:43:08 60 1

原创 树的简单入门

二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。如果某个结点有俩个以上子树则他不是二叉树例如上图中D有三个子树则其不是二叉树[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-deXK0J5Q-1684047713011)(E:\笔记\笔记内图片\QQ截图20230513115804.png)]这个就是一个二叉树。

2023-05-14 15:07:44 72

原创 Arrylist集合的初步使用

/基本数据类型运用类除了char和int 外其他为首字母大写如:short->Short,long->Long。//char 为Character,int 为integer。储存数据,较数组的优点为长度可变,添加元素,集合会自动扩容。//泛型:限定集合中储存数据类型对象即。输出时会打印集合中的储存内容而不是地址。输出时会自带[ ]包裹。

2023-05-07 19:22:10 73

原创 KMP算法的大致思路

作用:处理字符串匹配的问题,比正常遍历要快,时间复杂度为O(n)

2023-04-25 19:24:31 83

原创 栈和队列及相关习题

int head;int tail;} a;初始化a.tail=0;a.head=0;(1~n)实际存储个数为n-1;留一个位置判断队满或者队空限定在表尾进行插入删除操作的线性表//数据类型可自己选择 int top;//栈顶 } zan。

2023-04-23 17:37:51 64 1

原创 算法入门——哈希表

看不懂,问题不大哈希表主要是以空间换时间在查找元素时比数组遍历快很多哈希:就是将有效的字符转换成有限或者固定的数字,不过哈希与加密不同,;哈希表:哈希表与数组不同但是有些地方相似,如数组利用索引确定数据位置,但是哈希表不再直接使用索引而是使用键值对进行表示 ,哈希表很像一种高级数组,但是数组的索引值一定是一个整数,通过这个整数找到对应内存地址,,运算就是哈希函数,哈希函数后面有解释。

2023-04-07 22:29:40 246 1

原创 算法入门---位运算

位运算有逻辑运算符和位移运算符俩种,俩种运算符都是二进制运算符,都将数据在二进制下进行处理。

2023-04-05 21:08:39 82 1

原创 笔记 队列 栈

队列定义 一种线性数据结构 只允许在头部删除,叫做出队,尾部插入,叫做入队,当无元素时叫做空队列(即head==tail)使用 :利用一个一维数组 和 一个栈顶变量实现栈 ,利用栈顶变量(top)实现对栈的插入和删除。例题 给定9个数据,将其第一个数据丢掉,将第二个数据补到队尾,重复,直到全部数据删除·栈 定义:是只允许在一端进行插入或删除的。使用: 一般将其封装为一个结构体类型。例题 判断一个字符串是否为回文字符。总结一下队列先入先出。

2023-03-27 21:33:13 46

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除