- 博客(646)
- 资源 (1)
- 问答 (2)
- 收藏
- 关注
原创 排序算法-堆排序
堆排序的基本思路是什么?将待排序序列构造成一个大顶堆(任意节点都大于它的所有孩子),此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。堆排序具体是怎么回事?如下图:再看下面这个动图,就明白多了。如何用数组表示一个堆?从上图可以看出,堆是一颗完全二叉树,对于任意一个父节点的序号n来说(这里n从0算),它的子节点的序号一定是2n+1,2n+2,所以对于上图
2022-03-02 01:29:55 1595 4
原创 如何查看http版本是1.1还是2.0
FireFox浏览器地址栏输入:https://www.baidu.com/按F12,选择网络,再点击重新载入如下图:单击某一条http请求,在右侧会显示Http版本,如下图:IE浏览器IE浏览器比较直接,按F12,选择“网络”,就能看到。Edge浏览器按F12,取消勾选“已阻止Cookie",然后刷新一次。右键某一个http请求,选择”标题选项“,勾选“协议”,就可以看到了。Google浏览器谷歌浏览器网上介绍很多了,参考:https://www.zhihu.
2022-01-22 16:48:52 19850
原创 简述:如何解决HashMap线程不安全的问题?
jdk1.8中HashMap为什么线程不安全?会出现数据覆盖。JDK1.7和JDK1.8中HashMap为什么是线程不安全的?怎么解决HashMap线程不安全的问题?1.使用HashTable替代HashMapHashTable的put操作,有synchronized关键字修饰。2.使用Map map = Collections.synchronizedMap(new HashMap());这个方法实际上返回了一个SynchronizedMap。SynchronizedMap 实
2021-11-14 10:01:56 6167
原创 平衡二叉搜索树查找的时间复杂度为什么是O(log n)?
二叉搜索树的搜索的时间复杂度,会因为具体结构不同而不同,只有右子树的情况下,时间复杂度是O(n)。平衡的情况下,时间复杂度是O(logn)。这个O(logn)是怎么来的?n个结点的二叉搜索树的高度是多少?只有1个根节点的二叉搜索树,高度为1。log2(1)=0,0+1=1;2,3个结点的二叉搜索树,高度为2。log2(2)=1,1+1=2;4,5,6,7个结点的二叉搜索树,高度为3。log2(7) < 3,log2(7)取整+1为3。N个结点的二叉搜索树,高度是[log2(N)]+1.
2021-11-09 23:18:11 7357 2
原创 @Documented注解的作用
许多注解头部都有@Documented注解,例如jdk中自带的@Deprecated注解,路径是:java/lang/Deprecated.java,头部就含有这个注解。@Documented@Retention(RetentionPolicy.RUNTIME)@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})public @interface Deprecated {}那么
2021-10-10 16:16:19 47089 1
原创 EditText系列:android:editable=“false“弃用怎么办?
android:editable="false"弃用,如下图:解决办法:android:cursorVisible="false" android:focusable="false"原理分析在目录:D:\androidSDK\platforms\android-31\data\res\values\attrs.xml中确实看到@deprecated注解。注释中讲用inputType替代editable。inputType中使用“none”表示不可编辑。实测发现,即使使用androi.
2021-06-08 10:34:01 2355
原创 ViewPager系列:解决ViewPager内部,Fragment设置高度不起作用(二)
先上效果自定义ViewPager,CustomViewPager代码如下。public class CustomViewPager extends ViewPager { public CustomViewPager(Context context) { super(context); } public CustomViewPager(Context context, AttributeSet attrs) { s..
2021-04-12 20:35:49 2099 6
原创 解决Android studio 模拟器闪烁黑屏问题
首先,必须感谢csdn大神给我的启示,但是原文并没有解决我的问题。我在看《第一行代码》的时候,跟着郭霖大神的思路,想利用cmd命令查看虚拟机中的.db文件中的数据表。因为真机需要root才能查看系统内部文件,这时我用cmd 连接模拟器,执行命令:adb devices ,逍遥模拟器断线了,我用的是逍遥模拟器(国内的其他模拟器都不如逍遥稳定),很着急。无奈我就使用android studio自带...
2019-02-16 18:31:31 13432 8
原创 byte的范围为何是-128~127,而不是-127~128?
一、计算机该怎么做减法? 比如2-1=1,1-1=0.由于种种原因(精力有限,暂不深究),加法电路难度和成本已经很高了,当时的条件下,再去设计一个减法电路,费力又费钱,前辈们想用加法电路来解决减法运算问题。思路如下,熟悉的可以跳过。 假设当前时针指向8点,而准确时间是5点,调整时间可有以下两种拨法: 一是倒拨3小时:8-3=5 二是顺拨9小时:8+9=...
2018-07-29 20:26:36 10477 15
原创 android:gravity=“bottom|center_horizontal“的妙用
今天,上java课时,老师讲“|”表示短路或,我联想到Android布局中常见的 android:gravity="bottom|center_horizontal",根本就不是“或”的意思,于是仔细研究了一番,果然有了很大收获。 在这个语句中|不表示或,而是多选。即gravity的属性是可以多选的。与之相似的layout_gravity也是可以多选的,但是几乎没用,因为假
2016-09-02 10:47:43 8768 1
原创 leetcode二叉树相关题目
在leetcode94题中,上图用数组表示为[1,null,2,3],这种表示是不严谨的。不必要纠结这个点,理解根据数组创建二叉树的原理,能自己创建二叉树就好。要考虑某个节点为空的情况,如下图,数组表示为[1,null,2,null,null,3,null],就要使用Object数组。下面只是一个简单的示例,没考虑某个子树为空的情况。把{1, 2, 3, 21, 22, 31, 32} 转变为一个二叉树。
2024-03-30 17:12:15 456
原创 Leetcode链表相关题目
方法一:把第一个值最小的链表,当作被插入的链表,再把另外一个链表插入到这个链表。先看下面这个过渡解法,不完美,但是好理解。利用前后指针,前后指针的间隔就是n。方法二:新建一个链表,从两个链表中取值,谁小用谁的。
2024-02-29 14:20:59 398
原创 事件分发机制:从OnTouchListener开始,按钮变色的Demo
负责点击后执行的逻辑,无法响应按下、移动、抬起手指的具体变化,要想根据按下、移动、抬起、取消等信号,做出不同的效果,就要使用。可以看到,OnTouchListener就是View类中的一个public接口,接口里面只有一个。正常开发,我们一般用selector加载设计师给的图片。这里只是个简单的demo,就直接用。这个方法有什么用了?我们写一个有按压效果的Button,体验一下。方法复现子View点击不起作用的现象。要彻底弄清楚事件分发机制,先要明白。
2024-02-02 23:16:28 320
原创 事件分发机制:demo复现子View的点击事件不起作用
可以看到,只执行了onTouch方法,没有执行button的onClick方法。自定义一个MyLayout,继承自LinearLayout,重写。测试机系统是Android 7.1.2,api 25。相关疑问,我们后续博客再讲。demo使用的sdk是32。方法,返回true。
2024-02-02 20:09:12 331
原创 解决Android Studio gradle下载超时和缓慢问题(win10)
一般配置阿里云代理就可以解决。具体配置方法,参考:https://blog.csdn.net/zhangjin1120/article/details/121739782。
2024-01-24 22:00:00 1279 1
原创 免费旋转视频
平时解bug,测试同事拍的视频,方向可能是倒着的。怎么把视频旋转到正确的方向了?分享一种免费的方法。,打开,选择左上方的"开始“,找到”向左旋转“,直接播放就好了。(windows应用商店又卡又慢还打不开)如果想保存旋转后的视频,按Ctrl+S。分享了几个免费的视频链接。
2023-10-21 13:56:26 1549
原创 设计模式8:代理模式-动态代理
动态代理的核心优势就在于,一个代理类,可以代理多个接口。动态代理只能把代理对象,赋值给接口,如上面的例子。不能把代理对象直接赋值一个普通类。而Cglib代理可以做到。具体怎么做的,下篇文章再讲。,其实就是用java或kotlin代码申请权限,而不是在AndroidManifest.xml文件里面。,静态代理中一个代理类只能代理一个接口,其他不同的接口,就需要再手写不同的代理类,这就很。都是我们手写的代理类。动态代理可以自动生成代理类。动态代理类似于在安卓里面,我们常说的。动态代理需要jdk中提供的两个类。
2023-09-04 00:22:27 2019
原创 设计模式8:代理模式-静态代理
我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。
2023-08-20 23:15:17 1187
原创 C++中箭头运算符->的用法
也称为类成员访问运算符,是两个不同运算符的组合,即减号运算符 (-) 和大于运算符 (>)。它用于在指针变量的帮助下访问类、结构或联合成员的公共成员。C++中有不同类型的运算符,例如赋值运算符、算术运算符、关系运算符、逻辑运算符、按位运算符和许多其他运算符。
2023-08-15 23:02:29 375
原创 ipconfig显示的内容分析(二)子网掩码
路由器使用最长掩码匹配来确定最具体的路由表条目。它会与目标IP地址进行比较,选择最长掩码的ip地址。例如,如果目标IP地址是, 路由表中有两个ip地址:和,那么路由器将选择具有最长掩码的作为匹配项。
2023-08-12 12:14:23 398
原创 Android Studio下载
因为每个项目使用的gradle插件版本,是在根目录的build.gralde文件中统一定义的,这个文件在添加第三方库(例如GreenDao,Arouter等)或者远程仓库(例如jitpack.io)时,会修改,所以必须提交同步的。Android studio的版本要和项目正在使用的gradle插件版本匹配。如果确定不了具体版本,那就用最新版本,因为最新版本支持的gradle范围最广。支持的最高版本的gradle插件是7.1。每个Android studio的版本支持的gradle插件版本都有一个范围。
2023-07-23 09:47:55 325
原创 Mac OS装Windows系统开启虚拟化
这将你的EFI目录结构映射到G盘,g也可以改成别的未使用盘符,这个盘在文件管理器里是找不到的,但可以在命令行里进入。先进入到windows系统,下面的步骤都是在windows系统下面进行的。就可以支持虚拟化了,但是这样麻烦,要同时装两个系统,并且每次都需要先进入。需要开启虚拟化,而有些苹果笔记本虚拟化是关闭的,需要手动开启,我们知道。需要对应你的电脑,不过几乎都是这个,然后重启电脑即可。输入账户的密码即可,然后重启电脑即可打开虚拟化。要开启虚拟化,首先需要查看电脑是否支持虚拟化。
2023-07-09 19:17:37 2227
原创 String的hashCode为什么选择31作为乘子?
因为101^5 = 10,510,100,501。这个计算结果太大了。如果用 int 类型表示哈希值,结果会溢出。单字节的话,最大值是255。unicode在BMP范围内采用双字节。数值是19968 到 40891。先看下String类的源码,31出现在hashCode()方法中。中已经明确,java中的char可以表示中文。31^5 = 28629151,不大不小。有讲,下面的内容我只是转述,没有验证过。31是实验得到的一个最优解之一。那到底为什么用31了?
2023-07-08 01:20:53 134
原创 彻底搞懂:java中的char能表示中文吗?
Basic Multilingual Plane 基本多语言平面。它的码点范围是即0x0000-0xFFFF,包含了世界上最常用的字符。
2023-07-07 03:21:47 915
原创 《疯狂Android讲义》第2版 第3.5.2节关于Handler的代码
【代码】《疯狂Android讲义》第2版 第3.5.2节关于Handler的代码。
2023-07-06 17:57:38 117
原创 设计模式7:装饰者模式
个人理解:原始接口功能不足,需要添加新方法,但是别的地方已经实现了原始接口,所以原始接口又不能直接添加方法。这时候可以采用持有原始类对象,并且添加新方法的方式,实现新功能。并且继承原始类或者实现原始接口,达到可替换原始类的目的。官方说法:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。例如原始类有裤子,但是没有鞋子,这个时候用装饰器模式。原始类有鞋子,但是鞋码大了,不合适,这个时候用适配器模式。适配器模式解决的是原始类有这个功能,但是功能不匹配的问题。
2023-07-06 12:57:34 407
原创 ThreadLocal是如何实现线程隔离的?
程序有三个线程main,tA,tB,三个线程都修改了sharedName和sharedId(后面简称name和id),但是main线程设置的name和id,tA和tB并没有读取到,ta和tB一开始读取的是null。
2023-06-30 10:52:50 223
原创 Looper对象为什么要通过ThreadLocal来保存?
Thread+ThreadLocal+ThreadLocalMap是JDK提供的一种实现线程隔离的方式(具体怎么实现的,后面的博客会讲)。开发者也可以用别的方式实现线程隔离。有些博客讲,looper对象通过ThreadLocal存储是为了线程安全,个人认为这里并没有什么安不安全的问题,每个线程都有自己的Looper,线程不会去使用和修改别的线程的Looper,没有必要也没有意义。Looper对象,通过ThreadLocal来保存,是线程隔离的实现方式,最终达到一个线程只有一个Looper的目的。
2023-06-30 09:31:20 137
原创 MessageQueue中Message入队采用的是头插法还是尾插法?
MessageQueue内部实现,其实是一个单链表。从Message.java的源码中,可以看到类中有一个的成员变量,说明Message是单链表的一个节点。既然MessageQueue是由单链表实现的,那MessageQueue中的Message入队采用的是头插法还是尾插法?先说结论:有用到头插和尾插,但不是所有Message入队都用的头插法,也不是所有的Message入队都用尾插法。是根据成员变量when的数值大小来排序,找到合适的位置插入。
2023-06-29 13:12:53 129
原创 设计模式3:单例模式:volatile关键字能不能解决多线程计数问题?
先说结论不能:执行环境:jdk1.8.0_372 CPU:intel i7-4960 2.6GHz。
2023-06-28 11:50:14 491
《Software Architecture Design Patterns in Java》原版PDF 下载
2017-12-08
在公司做android源码开发,怎么解决编译一次耗时,太久的问题?
2018-11-01
Android:逐帧动画里面,能不能使图片的位置移动?
2016-08-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人