- 博客(84)
- 资源 (14)
- 收藏
- 关注
原创 java算法总结之二分查找法
前提:要实现二分查找法的前提是有序的顺序存储结构.思想:二分查找法的实现思想是:将有序的集合分成三部分,前半部分,中间点,后半部分,首先用要查找的数据与中间点索引处的数据做比较,如果比中间点索引处的数据小,就从前半部分查找,在前半部分得到新的中间点比较…以此类推,直到找到为止。如果比中间点索引处的数据大,就从后半部分查找。实现方式分为迭代和循环两种方法。迭代实现private void binary
2017-12-26 10:38:54
372
原创 java集合之LinkList解析
LinkeList是基于双向链表的实现,同时它也实现了Queue队列,Deque栈的实现,使得我们可以进行双向队列的实现,上一节java集合之ArrayList解析中说过ArrayList查询效率比较高,添加和删除集合中的元素效率比较低,而LinkList正好相反.LinkList组织结构图 LinkList继承自AbstractSequentialList(ArrayList继承Abstract
2017-09-13 17:36:58
2253
原创 java集合之ArrayList解析
ArrayList是基于动态数组实现增删改查操作,进行顺序存储的,在内存中各个元素的地 址是连续的.ArrayList组织结构图:根据上面的结构图知道ArrayList继承AbstractList并实现了RandomAccess,Cloneable,Serializable这三个标记接口,所以AbstractList具有如下特性:AbstractList:实现了增删改查的集合操作,并可以对
2017-09-13 15:05:34
730
原创 java中cloneable的使用
什么是java中的浅克隆和深克隆?浅克隆:克隆对象中的变量与之前对象的值相同,并且对象中的引用类型变量仍然指向原来对象引用类型变量的地址.深克隆:克隆对象中的变量与之前对象的值相同,并且对象中的引用类型变量指向了新的对象的引用变量的地址.要想实现克隆,只需定义的类声明下cloneable这个标记性接口,并且衍生重写Object类中就有的clone()方法即可.为什么类要首先声明cloneab
2017-09-12 15:33:40
2350
原创 java中Serializable与Parcelable的使用
java序列化:保存内存对象的状态,包括对象的属性值,但不包括方法和static变量(因为static修饰的变量是属于类而不隶属于对象),以及用transient关键字修饰的变量(transient是禁止序列化的标识,效果等同于static修饰的变量).java反序列化:是与java序列化相对的,表示从磁盘或者其他介质中读取序列化对象的内容.java序列化的应用场景:内存中的对象保存到磁盘文件中
2017-09-08 15:58:20
3116
1
原创 java中数据结构(二)双链表总结
上面文章介绍了单链表的总结java中数据结构(一)单链表总结,双链表在单链表结构的基础上增加了一个指向前驱节点的元素地址,它的优点根据一个节点很容易就可以得到前后节点的数据元素,而不再向单链表一样每次从头节点开始查找才可以,缺点是相对单链表增加了内存开销。下面的代码实现了双链表的增删改查:双链表中的Node节点public class Node<E> {//双链表节点 public E dat
2017-09-08 09:35:49
362
原创 java中数据结构(一)单链表总结
单链表是用若干在地址上面分散内存单元存储数据元素的,在逻辑上面相邻的元素在物理上不一定相邻.因此对于每个数据元素除了存储自身的元素数据以外,还要存储指向下个数据元素的地址。数据元素结构如下:上面包含了自身元素数据data和指向下个数据元素地址的next.数据元素存储结构: 单链表是顺序存储结构,不是随机存储结构,因此查询节点的时候每次都是从头节点开始查找,因此对于select和updata操作性能
2017-09-07 11:15:05
1529
原创 java多线程(5)之线程池概念理解
Executor说明Executor接口,是从JDK1.5开始就有的,里面只有一个接收参数为runnable的execute方法,若runnable为null,该方法回抛出NullPointerException,若这个任务无法被执行就会抛出RejectedExecutionException异常,execute方法可以在一个新线程,也可以在调用者线程中执行。* @since 1.5public
2017-09-02 20:53:49
353
原创 java多线程之LockSupport及ReentrantLock
目前java语言层面能够实现线程的阻塞与唤醒,主要包含两个组合对wait/notify以及park/unpark。wait/notify这组组合中wait必须发生在notify前面,否则很可能造成线程会一直阻塞,而park与unpark则不必,但是如果unpark先执行,后面执行park操作将不会阻塞。JDK并发中的AQS框架使用的就是LockSupport中的park/unpark操作,实际上调用
2017-09-02 10:27:10
1543
原创 java中的线程及interrupt操作后状态的变化
java中线程的状态包括“新建状态”,”就绪状态”,”运行状态”,”阻塞状态”以及”死亡状态”.下面是java的状态变化图1.新建状态:线程被创建后进进入了新建状态Thread t=new Thread().2.就绪状态:线程调用start()方法启动线程就进入了就绪状态,又被称为可执行状态.3.运行状态:线程获取CPU执行,就由就绪状态进入了运行状态。4.阻塞状态:因某些原因造成线程放弃cpu执行
2017-09-01 17:30:58
2200
原创 java多线程(4)之FutureTask
java多线程(4)之FutureTaskFutureTask是一个执行异步任务并可以取消及获得任务结果的实现类,类关系如下:public class FutureTask<V> implements RunnableFuture<V>{...}public interface RunnableFuture<V> extends Runnable, Future<V> { void run(
2017-08-31 17:57:37
399
原创 简单从Android源码的角度分析下SharePreference
获取SharePreference对象的途径 Context的实例方法 @Override public SharedPreferences getSharedPreferences(String name, int mode) { return mBase.getSharedPreferences(name, mode); } Activity的
2017-08-30 17:15:46
449
原创 java多线程(3)之join与countDownLatch
join是Thread中的类,一般用于一个A线程需要等到另一个B线程的结果才可以继续执行的情形, 这是一种有序的执行方式,比如说主线程需要等到子线程返回的结果后才可以继续执行. eg.public class TestThread extends Thread { public TestThread(String name) { super(name); } @
2017-08-30 14:18:32
409
原创 java多线程(2)之CAS操作
CAS:Compare and Swap即比较交换技术,它在高并发开发中是很重要的技术,在了解什么是CAS操作之前我们首先需要简单了解下sun.misc.UnSafe类。UnSafe类中的很多方法都是Native方法,没法直接调用,只能通过JNI操作调用本地方法,这里列举个里面的本地方法:public native long objectFieldOffset(Field var1);获取对象中给
2017-08-29 17:03:20
389
原创 java中多线程(1)之sleep与wait的区别
sleep是Thread中的函数,JDK中对应的源码如下:public static void sleep(long millis) throws InterruptedException { Thread.sleep(millis, 0); }public static void sleep(long millis, int nanos) throws Interr
2017-08-25 17:31:12
297
原创 你真的理解了compileSdkVersion,minSdkVersion,targetSdkVersion含义了吗?
我们在使用AS开发中,会经常看到module的gradle会有如下的配置android { **(1) compileSdkVersion 25** buildToolsVersion "26.0.0" defaultConfig { applicationId "com.test.unittestapplication" **(2) minSdkVer
2017-08-25 10:51:26
4469
2
原创 Android手机设置中的清除App数据选项的思考?
今天读到SharedPreferences源码的时候,一时突发奇想手机设置中的真对单个app清除数据的时候会清除哪些数据,虽然之前一直都知道SharedPreferences这样的数据会被清除掉,但是一直没有实践过,因此做了个测试用来验证这个结论。 测试如下:public final String TAG = MainActivity.class.getSimpleName(); priva
2017-08-24 16:26:44
4520
原创 add Shell命令中提示opendir failed, Permission denied解决方法
今天想看看App中SharedPreference中的内容,验证下自己的猜测结论,通过adb shell命令进入手机data目录后就出现了一些问题,在这里总结下,便于日后查看. 问题显示如下: 提示:opendir failed, Permission denied查阅了一些资料,尝试了一些办法最终如愿解决了。解决办法如下:1.在data目录下执行命令:run-as yourpackagenam
2017-08-24 15:50:21
4459
原创 final修饰符
final修饰符final修饰符可以修饰类,方法,成员变量: 修饰类 修饰方法 修饰成员变量 表示类不可以被继承 表示方法不可以被重写 表示是常量,只可以被赋值一次,此后不允许更改1.final修饰类表示类不可以被继承,比如String,Math等系统类,不允许子类去继承,默认情况下final类中的方法都是final方法。2.final修饰方法表示方法不可以被覆盖,如果一个方
2017-06-29 11:44:54
323
转载 java中的浅拷贝和深拷贝
java中的浅拷贝和深拷贝转载自:浅拷贝和深拷贝(谈谈java中的clone)clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1. 使用new操作符创建一个对象2. 使用clone方法复制一个对象那么这两种方式有什么相同和不同
2017-03-17 10:31:13
265
转载 多线程安全(二)之单例模式
多线程安全(二)之单例模式转载自单例这种设计模式随着我们编写代码的深入,我们或多或少都会接触到设计模式,其中单例(Singleton)模式应该是我们耳熟能详的一种模式。本文将比较特别的介绍一下Java设计模式中的单例模式。概念单例模式,又称单件模式或者单子模式,指的是一个类只有一个实例,并且提供一个全局访问点实现思路1.在单例的类中设置一个private静态变量sInstance,sInstance
2017-03-16 19:01:59
301
转载 多线程安全(-)之正确使用_volatile_变量
多线程安全(-)之正确使用 Volatile 变量volatile 变量使用指南本篇文章转载自:Java 理论与实践: 正确使用 Volatile 变量Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 Java 理论
2017-03-16 17:56:52
1186
转载 android_apk安全之运行时签名校验
android_apk安全之运行时签名校验有时候我们为了防止自己的应用被反编译后重新打包,不得不采取运行时进行签名校验的方式。因为会经常用到,所以在这里整理了一下校验方式。代码当中的注释很详细,故不再多做说明了。public class AppSignCheck { private Context context; private String cer = null; priv
2017-03-14 15:40:18
3914
转载 android_apk安全之完整性校验
android apk安全之完整性校验最近项目中在做安全监测,介于这个原因调查了一些第三方的加固防编译平台和自己使用中的心得,总结了apk安全的完整性校验的监测.完整性校验原理完整性校验就是我们用各种算法来计算一个文件的完整性,防止这个文件被修改。其中常用的方法就是计算一个文件的CRC32的值或者计算一个文件的哈希值。我们在防止apk被反编译的方法中也可以采用这种方法。我们知道apk生成的class
2017-03-14 14:55:07
9209
1
原创 mac下获取文件的md5与sha1值
Mac下获取文件的MD5与sha1值打开 Terminal,即Mac 的命令行 MD5——md5;SHA1——shasum终端下输入:1.md5 filepath 就会输出对应的MD5值2. shasum filepath 就会输出对应的sha1值,并且shasum 命令默认检测 SHA1 值,而通过参数 -a 可以修改为 224、256、384 或 512
2017-03-14 13:25:59
13358
转载 jvm中如何判定对象需要回收?
jvm中如何判定对象需要回收?引用计数法每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,对象B由于没有被引用,没有路径可以达到对象B,对象B的引用计数就就是0,对象B就会被回收。 但是这个算法有明显的缺陷,对于循环引用的情况下,
2017-03-13 19:33:55
2697
转载 jvm运行时的数据区
JVM运行时的数据区以下内容转载自JVM运行时的数据区.理解JVM运行时的数据区是Java编程中的进阶部分。我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机制,那么前面的问题就会迎刃而解。在这片文章中,我们将简单了解JVM中有哪些运行时数据区以及这些数据区的工作机制。JVM运行时数据区分类1.程序计数
2017-03-13 17:58:45
222
原创 java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用。在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。强引用只要引用存在,垃圾回收器永远不会
2017-03-13 16:41:04
304
原创 java中的静态内部类与非静态内部类的联系
java中的静态内部类与非静态内部类的联系区别1. 从使用上说:静态内部类中才能有静态属性和静态方法,非静态内部类中不能有静态属性和静态方法。2. 从生命周期上说:静态内部随着外部类的加载而加载,不是伴随着外部类的对象产生而产生的。外部类的实例与静态内部类的实例没有任何关系的。而非静态内部类的实例是需要依赖外部类实例才能创建的。换句话说非静态内部类是附属在外部类实例基础之上的,需要先创建一个外部类的
2017-03-08 16:07:06
1040
1
原创 java中是值传递还是引用传递?
java中是值传递还是引用传递?最近无意中看到了一篇博客对这个命题进行了阐述,但是讲解的有不少问题,没有从本质上抓住问题所在,所以就写了这篇文章.java中方法参数传递方式是按值传递。如果参数是基本类型,传递的是基本类型的字面量值的拷贝。 如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。参数是基本类型解析: @Test public void test2(){
2017-03-07 21:17:36
350
原创 java中关于string的理解
java中关于String的理解前言这是一个老生常谈的问题了,也是技术面试中针对初学者经常被问到的问题,这里就根据自己的理解做下规整,希望可以帮助更多的人,如果觉得哪里说得不对,请在下方留言,验证问题后我会及时更正。String的特征在讲解String特征之前,需要介绍一下关于String至关重要的概念:字符串常量池。 在上篇的文章中讲述了java中的数据存储结构,不明白的童鞋可以看下: java
2017-03-07 19:45:07
544
转载 java中的堆和栈的区别
Java中的堆和栈的区别转载自:http://droidyue.com/blog/2014/12/07/differences-between-stack-and-heap-in-java/当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last
2017-03-07 17:30:43
278
原创 java中的数据存储结构
java中的数据存储结构在java中数据的存储结构可以分为六种:寄存器存储区堆栈区堆区静态存储区常量存储区非RAM数据存储区 寄存器存储区由于位于处理器cpu的内部,所以其是最快的存储区,然而寄存器的空间极其珍贵有限,所以程序开发者无法直接控制寄存器空间的分配,它的分配工作是由编译器自行分配的.特点:最快的存储区, 由编译器根据需求进行分配,开发者在程序中无法进行控制.堆栈存储区位于通用
2017-03-07 17:14:52
5584
原创 java中int和Integer的理解
前言java中的数据类型分为基本数据类型和复杂数据类型.int是基本数据类型,Integer是复杂数据类型.所以int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。java中为什么要引入Integer?个人认为很多java api的调用包括方法的传旨或者范型的使用都是基于Object的,所以引入了Integer,引入
2017-03-06 17:25:26
519
原创 android获取应用程序签名
系统环境:MAC/LINUX1.获取debug应用程序包签名:keytool -exportcert -list -v \-alias androiddebugkey -keystore ~/.android/debug.keystore输入的密钥库口令是:android2.获取Release应用程序包签名:keytool -exportcert -list -v \-alias <your-k
2017-03-02 13:26:12
683
1
转载 Android中startActivity中的permission检测与UID机制
我们经常在一个activity中去start另一个activity,或者与另一个acitivity的结果进行交互(startActivityForResult)。但有没有想过可能会出现的permission问题呢?如果你遇到了permission denial的Exception,那么你需要读读这篇文章啦。 我们在同一个application内部,可以随意的startActivity from Ac
2017-03-01 11:27:08
288
转载 Android中startActivity中的permission检测与UID机制
我们经常在一个activity中去start另一个activity,或者与另一个acitivity的结果进行交互(startActivityForResult)。但有没有想过可能会出现的permission问题呢?如果你遇到了permission denial的Exception,那么你需要读读这篇文章啦。 我们在同一个application内部,可以随意的startActivity from Ac
2017-03-01 11:26:22
358
转载 Android Permission 机制
AndroidManifest.xml里面的sharedUserID能够让不同的apk运行在同一个进程里,分享里面的数据,比如Contacts等,当然这个sharedUserID可以设置成“android.uid.system”就可以运行在系统进程中,有权修改系统数据。 但仅仅有着一个sharedUserID并不能够保证你的apk一定能运行成功,怎么办?签名啊。如果你有Android的源码就比较方便
2017-03-01 11:24:03
234
转载 梆梆SDKs详细分析 – 防界面劫持SDK
梆梆SDKs详细分析(1) – 防界面劫持SDK梆梆SDKs详细分析(2) – 安全键盘SDK揭秘DroidSec.cnANDROID安全中文站 Activity劫持实例与防护手段
2017-02-27 17:01:09
1218
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人