自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构-二叉查找树

前面介绍了树和二叉树的基本概念以及存储。今天再来学习一下一种特殊的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。散列表也是支持这些操作的,并且散列表更加的高效,时间复杂度是O(1)。既然有了这么高效的散列表,为什么还需要二叉查找树呢?使用二叉树的地方是不是都可以替换成散列表呢?有没有哪些地方是散列表做不了,必须要用二叉树来做的呢?1.二叉查找...

2019-07-20 23:28:01 339

原创 数据结构-树

今天来说一下树,树是一种非线性结构,比线性结构复杂得多。树(Tree)什么是树?通过上图,我们发现,树这种存储结构很像我们生活中的树,每个元素我们称为节点,用来连线相邻节点之间的关系,称为父子关系。如下图,A节点就是B节点的父节点,B节点是A节点的子节点。B、C、D这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫作根节点,也就是图中的节点E。...

2019-07-20 20:40:02 212

原创 数据结构-散列表

什么是散列表?散列表其实就是我们平常说的哈希表或者hash表,散列表采用的是数组支持下标随机访问数据的特性,所以散列表也是数组的一种拓展,由数组演化而来。散列表其核心思想就是通过散列函数计算出散列值,然后通过散列值获取到位置对元素实现增删等操作。散列函数散列函数是散列表中的核心,顾名思义,散列函数是一个函数,我们可以把它定义为hash(key),其中key表示元素的键值,hash(ke...

2019-07-20 15:28:34 495

原创 数据结构-队列

1,队列的概念队列这个概念非常好理解。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”我们知道,栈只支持两个操作,push(入栈)和pop(出栈),队列跟栈很像,同样也只支持两个操作,enqueue(入队)和dequeue(出队)。2,队列的实现队列可以用数组实现,也可以用链表实现。用数组实现的队列称为顺序队列,用链表实现的队列...

2019-07-14 17:31:05 186

原创 数据结构-栈

1,栈的定义栈是限制插入和删除都只能在一个位置上进行的表,该位置是表末端,叫做栈的顶。对栈的基本操作有push(进栈)和pop(出栈),栈的特点就是后进先出。二、为什么需要栈?1.栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。2.但,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。3.所以,...

2019-07-14 16:11:10 194

原创 数据结构-链表

1,链表结构相比与数组,链表是稍微复杂一点的数据结构,这两个数据结构经常会放到一起来对比,所以我们先来看下这两者有什么区别。先从底层存储结构看看:数组:数组需要一块连续的空间来存储,对内存的要求比较高。如果我们申请一个50mb大小的内存,当内存中没有足够大的连续内存空间时,即使可用内存大于50mb,仍然会申请失败。链表,结构如下:链表不需要申请一块连续的内存,它通过指针将...

2019-07-14 11:19:32 268

原创 数据结构-数组

数组是我们开发中最常用的数据结构之一,在大部分编程语言中数组的下标都是从0开始的,为什么不是从1开始呢?1,数组如何实现随机访问? 首先说下数组的定义:数组是一种线性的数据结构,它用一组连续的内存来存储相同类型的数据。 数据的定义涉及到两个关键字,线性结构和连续内存,下面分析下这两个关键字 1.1 线性结构 线性结构就是数据排成像一条线一样的数据结构,...

2019-07-13 14:23:08 212

原创 JVM-垃圾回收机制

垃圾回收主要发生在堆内存,从以下三个方面入手:1,哪些内存需要回收?2,什么时候回收?3,如何回收?首先先说下堆内存分配:主要分为新生代和老年代:新生代分为:Eden(8)区,from survivor(1)区,to survivor(1)区,进行minor gc的时候会在两个survivor左右复制,因此会有一个survivor区域的空间总是空置的。老年代:主要...

2019-07-13 13:07:10 225

原创 JVM-线程安全以及锁优化

1,线程安全的定义定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的。如果将线程安全的“安全程度”由强至弱来排序,那么可以分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容以及线程对立。1.1,不可变不可变的对象一定是线程...

2019-07-13 13:03:09 191

原创 JVM-java线程实现

线程的实现线程是cpu最小的调度单位。线程实现的方式主要有:1,使用内核线程实现;2,使用用户线程实现;3,使用用户线程和轻量级进程实现;使用内核线程实现内核线程就是直接由操作系统内核支持的线程,这种进程由内核来完成进程切换,内核通过调度器对线程进行调度,并负责将线程的任务映射的处理器上。每个内核线程可以看作为内核的一个分身。程序一般不会直接使用内核线程,而是去使用...

2019-07-13 12:55:51 228

原创 JVM-内存模型

java的内存模型,简称JMM什么是java的内存模型? java的内存模型就是一种符合内存规范的,屏蔽了各种硬件和操作系统的访问差异,保证了java程序在各种平台下对内存的访问都能保证效果一致的机制和规范。java内存模型的主要目的是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出这个变量的内存细节。JMM规定了所有变量都存储在主内存中,每个线程还有自己...

2019-07-13 12:14:38 139

原创 JVM-类的加载机制

要想真正理解java类的加载机制,分三个步骤去理解:1,类什么时候加载2,类的加载过程3,用什么去加载类以下分三部分去介绍java类的加载时机、类的加载过程、加载器。1,类的加载过程类的加载过程主要分为七个阶段,但主要的过程是加载、验证、准备、解析、初始化。1.1,加载在加载阶段,虚拟机需要完成的三件事:1,通过一个类的全限定名来获取该类的二进制字节流;...

2019-07-13 12:08:12 159

原创 JVM-对象创建过程

对象的创建: 当虚拟机遇到一条new指令时,首先会去检查这个指令的参数是否能在常量池中定位到 一个类的符号引用,并检查这个符号引用代表的类是否已经被加载、解析、初始化过。 如果没有,那必须先执行类的加载过程。 在类加载检查通过后,接下来虚拟机将为新对象分配内存。对象所需的内存大小,在类 加载完成后就可以完全确定。 分配内存的两种方式: ...

2019-07-13 11:12:57 138

原创 JVM-内存区域划分

java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域。 1. 程序计数器 程序计数器是一块比较小的区域,它可以看作为当前线程所执行的字节码的行号指示 器。字节码解析器工作时就是通过改变程序计数器的来选取下一条需要执行的字节码 指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖程序计数器去完 成。 ...

2019-07-13 11:09:23 136

原创 性能优化之减少apk包大小

首先先说下Apk包大小优化的好处:1,减少app内存使用2,用户在应用市场下载安装时,往往会将apk的大小作为一个考虑因素下面分享我以往的优化经验:1,使用svg使用svg可以减少少量包体积,使用Android studio 可以直接导入svg文件,需要注意的是:PSD不支持渐变和透明度批量导入svg:svg2vector.jar将svg图片生成为指定维度的png图...

2019-07-13 11:02:40 353

原创 屏幕刷新机制

我们一般衡量流畅度都是以16ms为标准的,那么这个16ms是怎么来的呢?先了解一个概念,刷新率:至的是一秒内刷新屏幕的次数,一般都是60hz;1000ms / 60 约等于 16ms一帧。ui的刷新过程大概如下:1,display 代表显示器或者屏幕2,cpu负责计算数据,然后将数据交给gpu,gpu对图像的数据进行渲染,再把渲染好的数据放到buffer里面,显示器或者屏幕...

2019-07-13 10:44:19 1215 1

原创 简单实现RecyclerView 头部尾部

先看效果:效果大概就这个样子了,没做什么效果,有点丑。实现方法:参照listview源码实现,静态代理。重写RecyclerView 的setAdapter,如果有头部或者尾部就将RecyclerView本来的adapter再封装一层,由其adapterde包装类去处理头部尾部和本身的body部分;RecyclerView重写源码如下:public class WrapperRecylerView...

2018-03-31 12:18:56 224

原创 深入分析ConcurrentHashMap

HashMap:        线程不安全,支持空键以及空值。HashTable:        线程安全,在遇到null时,会抛出NullPointerException异常。HashTable使用ynchronized来保证线程安全,但是在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时候,其他线程访问HashTable的同步方法时,可能会...

2018-03-28 11:04:21 197

空空如也

空空如也

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

TA关注的人

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