Java
Mlib
这个作者很懒,什么都没留下…
展开
-
【Java】反编译Mac版Charles,修改一些功能
目录反编译jar修改jar参考反编译jar修改jar如何修改jar包中的class文件参考Javassist 使用指南(一)如何把java App包装成Mac安装包 - How to create a macOS installer for a Java application (.jar)...原创 2019-11-18 14:34:34 · 801 阅读 · 0 评论 -
八大排序算法总结与java实现
原文链接: 八大排序算法总结与java实现 - iTimeTraveler概述因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结,强行学习。首先罗列一下常见的十大排序算法:直接插入排序希尔排序简单选择排序堆排序冒泡排序快速排序归并排序基数排序其中我们讨论的这八大排序算法的实现可以参考我的Github:SortAlgori原创 2017-07-30 15:22:36 · 14524 阅读 · 9 评论 -
【Java】HashMap源码分析(JDK1.8)
前言Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashM原创 2017-11-26 16:02:49 · 610 阅读 · 0 评论 -
【Java】生产者消费者模式的实现
前言生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。wait/notify方法首先,我们搞清楚Thread.sleep()方法和Object.wait()、Object.notify()方法的区别。根据这篇文章java原创 2017-11-16 19:39:49 · 41041 阅读 · 11 评论 -
【算法】10亿int型数,统计只出现一次的数
题目10亿int整型数,以及一台可用内存为1GB的机器,时间复杂度要求O(n),统计只出现一次的数?分析首先分析多大的内存能够表示10亿的数呢?一个int型占4字节,10亿就是40亿字节(很明显就是4GB),也就是如果完全读入内存需要占用4GB,而题目只给1GB内存,显然不可能将所有数据读入内存。我们先不考虑时间复杂度,仅考虑解决问题。那么接下来的思路一般有两种。位图法:用一个bit位来标识一个i原创 2017-07-14 10:10:23 · 13176 阅读 · 0 评论 -
【算法】无序数组中求中位数
问题 给定一个int数组A,为传入的数字序列,同时给定序列大小n,请返回一个int数组,代表每次传入后的中位数。保证n小于等于1000或者 求一个无序数组的中位数。 如:{2,5,4,9,3,6,8,7,1}的中位数为5。 要求:不能使用排序,时间复杂度O(n)。分析因为题目指定不能使用排序算法,而且要求时间复杂度O(n),也就是要求一次遍历就得给出结果。所以排序算法基本上没有用武之地。原创 2017-10-05 11:23:31 · 9994 阅读 · 4 评论 -
【Java】try-catch-finally语句中return的执行顺序思考
实验1、try中有return,finally中没有public class TryCatchTest { public static void main(String[] args) { System.out.println("test()函数返回:" + test()); } private static int test(){ int i =原创 2017-09-21 16:28:00 · 1285 阅读 · 0 评论 -
【算法】大数乘法问题及其高效算法
题目编写两个任意位数的大数相乘的程序,给出计算结果。比如: 题目描述: 输出两个不超过100位的大整数的乘积。 输入: 输入两个大整数,如1234567 和 123 输出: 输出乘积,如:151851741或者求 1234567891011121314151617181920 * 2019181716151413121110987654321 的乘积结果分析所谓大数相乘(M原创 2017-08-23 11:07:54 · 104230 阅读 · 17 评论 -
【算法】如何判断链表有环
如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现“环”,就像题图这样。如何用程序判断出这个链表是有环链表? 不允许修改链表结构。 时间复杂度O(n),空间复杂度O(1)。 方法一、穷举遍历方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新原创 2017-12-25 20:05:59 · 78863 阅读 · 22 评论 -
CPU Cache与缓存行
引言先看下面这两个循环遍历哪个快?int[][] array = new int[64 * 1024][1024];// 横向遍历for(int i = 0; i < 64 * 1024; i ++) for(int j = 0; j < 1024; j ++) array[i][j] ++;// 纵向遍历for(int i = ...原创 2018-09-14 16:13:06 · 12606 阅读 · 8 评论 -
【Java】J.U.C并发包 - AQS机制
简介Java并发包(java.util.concurrent)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrantLock、Semaphore,CountDownLatch,CyclicBarrier,它们的实现都用到了一个共同的基类 - AbstractQueuedSynchronizer,简称AQS。AQS提供了一种原子式管理同步状态、阻塞和唤醒线程功能以及队列...原创 2018-08-27 10:24:00 · 499 阅读 · 0 评论 -
【Android】动态链接库so的加载原理
前言最近开发的组件时常出现了运行时加载so库失败问题,每天都会有java.lang.UnsatisfiedLinkError的错误爆出来,而且线上总是偶然复现,很疑惑。所以本文将从AOSP源码简单跟踪Android中的动态链接库so的加载原理,试图找出一丝线索。加载入口首先我们知道在Android(Java)中加载一个动态链接库非常简单。就是我们日常调用的 System.load(...原创 2018-07-04 14:51:46 · 5472 阅读 · 0 评论 -
【Android】单元测试方法简介
前言基本单元测试框架Java单元测试框架:Junit、Mockito、Powermockito等;Android单元测试框架:Robolectric、AndroidJUnitRunner、Espresso等。最开始建议先学习Junit & Mockito。这两款框架是java领域应用非常普及,使用简单,官网的说明也很清晰。junit运行在jvm上,所以只能测试纯java...原创 2018-06-29 22:35:42 · 579 阅读 · 0 评论 -
【Java】使用Atomic变量实现锁
Atomic原子操作Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。在Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更...原创 2018-05-23 10:18:06 · 3650 阅读 · 0 评论 -
【Java】Thread类中的join()方法原理
简介join()是Thread类的一个方法。根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this thread to die.join()方法的作用,是等待这个线程结束;但显然,这样的定义并不清晰。个人认为”Java 7 Concurrency Cookbook”的定义较为...原创 2018-05-09 18:34:09 · 21277 阅读 · 39 评论 -
【Java】线程池ThreadPoolExecutor实现原理
引言线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。合理利用线程池能够带来三个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建...原创 2018-02-13 17:34:17 · 10443 阅读 · 4 评论 -
用Java实现断点续传 (HTTP)
断点续传的原理其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 www.sjtu.edu.cn,文件名为 down.zip。 GET /down.zip HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, i原创 2018-01-22 16:26:53 · 1317 阅读 · 0 评论 -
【算法】反转字符串
前言研究算法能提高我们的编程功底,更好地编写出高效稳健的代码。今天,我们研究的是 — 反转字符串。//输入一个字符串,输出它的倒序字符串input: Hellooutput: olleH解法反转字符串,确实没什么难度,但是我无意间搜索了一下,才发现这么一个看似简单的反转算法实现起来真可谓花样繁多。这里我们尽可能分别总结介绍一下。1、使用字符数组倒序输出最常规的解法,也是最容易想到的一种方法就是原创 2017-08-06 09:35:39 · 3459 阅读 · 0 评论 -
【算法】如何反转一个单链表?如何两两反转?
如何反转单链表?如何使用较少的遍历次数完成单链表的反转?问题一、反转单链表题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下,这里使用的是Java描述:public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}思路如何把一个单链表进行原创 2016-02-24 15:03:30 · 4115 阅读 · 0 评论 -
【面试题】Java String常量相等(==)问题
问题以下三个结果分别输出(true or false)?别小看它,很多程序员因为上面问题出过生产bugString s3 = "s";String s4 = "s";System.out.println(s3==s4);---String s5 = "hello";String s6 = "he"+"llo";System.out.println(s5==s6);---Integer原创 2017-06-12 18:37:10 · 1674 阅读 · 1 评论 -
【Java】内部类(Inner Class)如何创建(new)
简单来说,内部类(inner class)指那些类定义代码被置于其它类定义中的类;而对于一般的、类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类。对于一个内部类,包含其定义代码的类称为它的外部(outer)类。 那么对于内部类,该如何去使用呢?下面给出静态成员类(Static Member Class)和普通成员类(Member Class)使用的方式。package cuc;原创 2016-01-02 21:13:08 · 17921 阅读 · 0 评论 -
【Java】不用循环语句如何输入打印数组元素
Java中可以使用Arrays.toString()来输出数组,免了使用各种循环来挨个print的痛苦。原创 2015-12-09 13:58:05 · 7783 阅读 · 0 评论 -
【Java】函数中的参数传递是“引用传递”还是“值传递”?
问题引入:在一个快速排序的函数 private void quickSort(List intList, int left, int right) 中,传进去的参数intList是对象传递还是引用传递呢?先抛出结论:将对象(对象的引用)作为参数传递时传递的是引用(相当于指针)。也就是说函数内对参数所做的修改会影响原来的对象。当将基本类型或基本类型的包装集作为参数传递时,传递的是值。也就是说函数原创 2015-11-02 15:33:04 · 2003 阅读 · 0 评论 -
【Java】操作excel表,包括创建、读取、以及修改
作者的网站上对它的特征有如下描述: ● 支持Excel 95-2000的所有版本 ● 生成Excel 2000标准格式 ● 支持字体、数字、日期操作 ● 能够修饰单元格属性 ● 支持图像和图表 应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是转载 2013-08-01 12:31:58 · 2662 阅读 · 0 评论 -
【Java】HashMap 和 HashTable 的区别到底是什么?
第一、继承不同第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。public class HashMap<K, V> extends AbstractMap<K, V> implements Cloneable, Serializable {...}public class Hashtable<K, V>原创 2015-11-10 18:02:23 · 28081 阅读 · 2 评论 -
【面试题】N级台阶(比如100级),每次可走1步或者2步,求总共有多少种走法?
走台阶算法(本质上是斐波那契数列)在面试中常会遇到,描述就如题目那样:总共100级台阶(任意级都行),小明每次可选择走1步、2步或者3步,问走完这100级台阶总共有多少种走法?一、 题目分析这个问题本质上是斐波那契数列,假设只有一个台阶,那么只有一种跳法,那就是一次跳一级,f(1)=1;如果有两个台阶,那么有两种跳法,第一种跳法是一次跳一级,第二种跳法是一次跳两级,f(2)=2。如果有大于2级的n级原创 2016-01-05 15:31:10 · 57932 阅读 · 12 评论 -
Java访问权限修饰符的区别
Java有四种访问权限,其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符原创 2016-01-15 15:07:58 · 15328 阅读 · 2 评论 -
如何生成100个1-100以内的不重复的随机数
这是个经典的面试题目:生成长度为100的数组,插入1-100以内的但均不重复的随机数一、简单实现思路:(1) 把N个数放入Hashtable 或者arrayList 中.(2) 从上面的集合中随机抽取一个数放入int数组中.(3) 把取出的这个数从上面的集合中删除.(4) 循环 (2),(3) 步骤,直到int数组取满为止.这是一种比较简单的实现思路,实现代码如下:import java.util原创 2016-01-22 23:52:53 · 25279 阅读 · 1 评论 -
【Java】设计模式:深入理解单例模式
什么是设计模式?简单的理解就是前人留下来的一些经验总结而已,然后把这些经验起了个名字叫Design Pattern,翻译过来就是设计模式,通过使用设计模式可以让我们的代码复用性更高,可维护性更高,让你的代码写的更优雅。设计模式理论上有23种,今天就先来分享下最常用的单例模式。引言对于单例模式,有工作经验的人基本上都使用过。面试的时候提到设计模式基本上都会提到单例模式,但是很多人对单例模式也是一知半原创 2016-09-08 14:18:51 · 4070 阅读 · 1 评论 -
【Java】泛型详解
一. 为什么需要泛型?首先,我们看下下面这段简短的代码:public class GenericTest { public static void main(String[] args) { List list = new ArrayList(); list.add("qqyumidi"); list.add("corn"); l转载 2016-12-27 14:15:30 · 468 阅读 · 0 评论 -
【Java】Integer变量相等(==)比较问题
题目这是关于一段令人疑惑的Java代码:class TestIntegerCache { public static void main(String[] args){ Integer i3 = 100; Integer i4 = 100; System.out.println(i3 == i4); Integer i5 = 100原创 2017-07-11 12:50:47 · 2314 阅读 · 1 评论 -
详解Java类的生命周期
引言最近有位细心的朋友在阅读笔者的文章时,对Java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内Java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,转载 2017-06-02 11:29:09 · 409 阅读 · 0 评论 -
Java 8系列之重新认识HashMap
本文来自美团点评技术团队: Java 8系列之重新认识HashMap摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。简介Jav转载 2017-06-12 18:53:15 · 497 阅读 · 0 评论 -
Google 面试题 | 判断字符串是否可由重复子字符串组成
题目描述对于一个非空字符串,判断其是否可由一个子字符串重复多次组成。字符串只包含小写字母且长度不超过10000。样例1 输入: “abab” 输出: True 样例解释: 输入可由”ab”重复两次组成 样例 2 输入: “aba” 输出: False 样例 3 输入: “abcabcabcabc” 输出: True 样例解释:输入可由”a转载 2017-05-05 14:39:29 · 6780 阅读 · 9 评论 -
【Java】short、int、float、boolean与byte之间的转换工具类
import java.nio.ByteBuffer;/** * 各基础类型与byte之间的转换 **/public class Utility { /** * 将boolean转成byte[] * @param val * @return byte[] */ public static byte[] Boolean2By原创 2017-03-08 13:01:48 · 8095 阅读 · 0 评论 -
【Java】按位存储:使用int存储boolean数组
有一种场景,比如App设置页中会有一组开关选项,这个时候保存这些开关的状态,如果每个按钮都对应一个boolean值的话,太大材小用显得鸡肋,频繁读取SharedPreferences 存取效率自然快不过一次读取。首先,敲定每个boolean值存储的位置 private int mBroadcastCustomValue = 0; //用来存储的int值 public static原创 2016-07-06 12:13:00 · 3327 阅读 · 0 评论 -
【Android】RxJava 入门详解
本文转载自 给 Android 开发者的 RxJava 详解 —— by 扔物线前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 。而最近这几个月,我也发现国内越来越多的人开始提及 RxJava 。有人说『RxJava 真是太好用了』,有人说『RxJava 真转载 2016-12-20 11:02:40 · 722 阅读 · 0 评论 -
java中的封装、继承与多态
一、封装: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 封装的意义: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据原创 2016-01-15 15:43:26 · 1876 阅读 · 0 评论