![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
小北的博客
八年 Android 开发经验,熟练掌握 Android 的 Framework, 精通 Android 上层 App 开发。
展开
-
Java 设计模式-策略模式
策略模式 策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。UML 图如下策略模式的三个角色: 环境(Context)角色:持有一个Strategy的引用。原创 2016-03-29 20:14:00 · 277 阅读 · 0 评论 -
Java 反射机制
反射就是在运行时可以获取任意 Class 或 Object 内部所有的成员变量、成员方法、构造函数和 Annotation。本文中用到的类:StaticMethod@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})public @interface StaticMethod {}UserInfopublic clas原创 2017-05-05 17:45:18 · 454 阅读 · 0 评论 -
源码分析 - String对象真的不可变吗?
什么是不可变对象?如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。String对象为什么不可变吗?JDK1.7中String类的源码:public final class String implements Serializ原创 2017-04-26 19:31:02 · 815 阅读 · 0 评论 -
插入-排序原理及Java 实现
基本思想通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。对于给定的一组记录,初始时假定第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直到最后一个记录插到有序序列中为止。算法描述:假定Lenght是数组A的长度,首先假设第一个元素被放置在正确的位置上,这样仅需从1到Lenght-1范原创 2017-08-16 20:06:09 · 386 阅读 · 0 评论 -
浅析Java 字节码
第一个问题:为什么Java 为什么可以跨平台?和C++ 相比,很重要的一点就是:C++ 编译生成的是纯二进制的机器指令,而Java 通过编译器编译生成的是非纯二进制的字节码(.class文件)。而这种基于Unicode的字节码是不依赖于特定的计算机硬件架构而存在的——这就意味着只要有JVM环境,你的字节码就可以在任何平台上运行。其次,Java字节码的二进制数据以固定的格式进行存储和传输,消除了字节顺原创 2017-07-27 21:10:13 · 1284 阅读 · 0 评论 -
源码分析- Java 1.8 HashMap
HashMap介绍1、介绍HashMap容器类是Java开发人员使用频率较高的用于映射(键值对”KEY”-“VALUE”)处理的数据类型。HashMap是基于Hasing技术(Hasing),Hasing就是将很大的字符串或者任何对象转换成一个用来代表它们的很小的值,这些更短的值就可以很方便的用来方便索引、加快搜索。JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优原创 2017-08-14 17:11:53 · 315 阅读 · 0 评论 -
Java 对象克隆(clone)
基本数据类型(boolean,char,byte,short,float,double,long)的复制很简单,比如:int width = 5;int height = width;基本数据类型进行这样复制是没有问题的。按照上面的方法进行对象的复制,首先自定义一个汽车类,该类有一个color 属性,然后新建一个汽车实例car,然后将car 赋值给car1 即car1= car; 代码和结果如原创 2017-08-22 10:12:08 · 4996 阅读 · 1 评论 -
Android多线程断点续传原理解析
在下载大文件的时候,我们往往要使用多线程断点续传,保证数据的完整性,首先说多线程,我们要多线程下载一个大文件,就有开启多个线程,多个connection,既然是一个文件分开几个线程来下载,那肯定就是一个线程下载一个部分,如果文件的大小是200M, 使用两个线程下载, 第一个线程下载1-100M, 第二个线程下载101-200M。 我们在请求的header里面设置conn.setRequestPro原创 2017-08-29 21:28:52 · 2374 阅读 · 0 评论 -
Java 源码解析-ThreadLocal
ThreadLocal相当于提供了一种线程隔离,将变量与线程相绑定,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同,而同一个线程在任何时候访问这个本地变量的结果都是一致的。当此线程结束生命周期时,所有的线程本地实例都会被GC。ThreadLocal 的基本用法public class ThreadLocal { private static java.l原创 2017-09-12 17:37:20 · 351 阅读 · 0 评论 -
有状态对象和无状态对象
1、进程与线程的关系进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 进程有独立的地址空间进程有单独的地址空间,包括文本区域(text region原创 2017-10-27 18:47:32 · 781 阅读 · 0 评论 -
Android 源码解析-LruCache 缓存工具类
关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存。这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻底理解Android中的缓存机制。1、LruCache的介绍LruCache是Android API 12以后提供的一个缓存工具类,采用了最近最少使用算法。它把最近使用的对象用“强引用”存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值原创 2017-10-25 16:37:35 · 518 阅读 · 0 评论 -
设计模式-建造者模式
定义官方定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,通俗的说就是:建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品特点建造者模式是一种创建型模式,适用于那些流程固定,建造的目标对象会有所改变这种场景,还有一种场景是代替多参数构造器作用1、用户不知道对象的建造过程和细节就可以创建出复杂的对象「屏蔽了建造的具体细节」 2、用户原创 2017-12-20 19:28:54 · 275 阅读 · 0 评论 -
Java 内存模型
第一部分 内存模型我们常说Java内存模型(Java Memory Model, JMM)指的是Java运行时(Java runtime)内存模型,Java源码通过javac 翻译成字节码,由即时编译器(JIT)编译执行。因为字节码是静态代码,需要加载到内存才能成为可以动态运行的对象。运行时内存数据区大体上被分为5个区域、两大类型, 如下图。线程私有(隔离)数据区1、程序计数...原创 2017-12-15 14:44:15 · 407 阅读 · 0 评论 -
Android 动画 一篇就够
动画实际上就是在指定的时间段内持续修改某个属性的值, 使得该值在指定取值范围内平滑过渡。 动画可以分为三大类, 帧动画(Frame Animation)、补间动画(Tweened Animation)、属性动画(Android 3.0 之后增加的属性动画)帧动画帧动画是最容易实现的一种动画,这种动画更多的依赖于完善的UI资源, 原理是一定的时间段内切换多张有细微差异的图片从而在视觉上原创 2018-01-11 11:38:32 · 296 阅读 · 0 评论 -
最小堆解决TopK 问题 - Java代码实现
TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据。解决方法一、对源数据中所有数据进行排序,取出前K个数据,就是TopK。解决方法二维护一个K长度的数组a[],先读取源数据中的前K个放入数组,对该数组进行升序排序,再依次读取源数据第K个以后的数据,和数组中最小的元素(a[0])比较,如果小于a[0]直接pass,大于的话,就丢弃最小的元素a[0],利用二分法找到其位原创 2018-01-11 20:11:07 · 1579 阅读 · 0 评论 -
Java并发:volatile解析
一、Java 内存模型Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。二、并发编程中的三个概念1、原子性一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。...原创 2018-03-01 16:04:12 · 350 阅读 · 0 评论 -
最长递增子序列-Java 实现
1、Θ(n2) 打表实现初始化对角线为 1; 对每一个 i,遍历 j(0 到 i-1): 若A[i] <= A[j],置 1。 若A[i] > A[j],取第 j 行的最大值加 1。private static int getLargestLen(int[] array) { int[] max = new int[array.length]; fo...原创 2018-03-06 11:50:42 · 4853 阅读 · 1 评论 -
Java 用正则表达式判断输入的字符串是否为手机号码
使用到正则表达式判断用户输入的手机号码是否正确,以后出现了新的格式修改一下正则表达式的规则就行。介绍下正则表达式: ^匹配输入字符串开始的位置, $匹配输入字符串结尾的位置, [xyz] 字符集。匹配包含的任一字符 [^xyz]反向字符集。匹配未包含的任何字符, \d数字字符匹配public class CheckPhoneFormatUtils { /** 正则表达 *原创 2017-05-03 19:18:48 · 11544 阅读 · 0 评论 -
限制固定长度的队列结构
在一个固定长度的集合里,当收到新的数据时自动丢掉最旧的数据。/** * Created by Owen Chan * On 2017-05-10. */public class LimitQueue<E> { private int limitedSize; private LinkedList<E> linkedList = new LinkedList<>(); pub原创 2017-05-10 20:07:12 · 2614 阅读 · 0 评论 -
Java 递归算法解迷宫问题
上图是一个迷宫的图,0表示可以通过,1表示不可以通过,只能往上下左右走,左上角进去从右下角出去。 可以用一个二维数组来定义迷宫的初始状态,然后从左上角开始,不停的去试探所有可行的路线,碰到1就结束,然后继续探索其他的方向,为了防止在两个可行的格子之间来回走,我们需要标记一下已经走的路线。直到走到右下角出口为止,算找到了一个正确路径。 具体程序实现:public class MyClas原创 2017-04-06 09:04:41 · 3704 阅读 · 5 评论 -
Java 递归与非递归实现快速排序
快速排序算法工作之前一直不懂快速排序算法,今天看了下快速排序算法,跟大家分享下,如果有不妥之处还请建议。 快速排序是对冒泡排序的一种改进,由C.R.A.Hoare于1962年提出,它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。基本思想:1.先从数列中取出一个数作为控制字。如数组 [K 1 ,K 2 ,…,K n ],以第一个...原创 2016-02-25 20:58:44 · 1145 阅读 · 2 评论 -
Java 设计模式-工厂模式
Java 设计模式-工厂模式工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。工厂模式在《Java与模式》中分为三类: 1)简单工厂模式(Simple Factory): 2)工厂方法模式(Factory Method): 3)抽象工厂模式(Abstract Factory):简单工厂模式简单工厂模式又称静态工厂方法模式。定义一个用于创建对象的接原创 2016-03-22 20:19:11 · 299 阅读 · 0 评论 -
Android DatagramSocket error message: EADDRINUSE (Address already in use)
Android DatagramSocket error message: EADDRINUSE (Address already in use)java.net.BindException: bind failed: EADDRINUSE (Address already in use)at libcore.io.IoBridge.bind(IoBridge.java:89)at java.n原创 2016-03-11 16:06:20 · 1946 阅读 · 0 评论 -
Java 设计模式-观察者模式
观察者模式是对象的行为模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。典型的观察者模式有如下四个部分组成:抽象主题(Subject)类:抽象主题为具体的主题角色提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。具体主题(ConcreteSubj原创 2016-03-24 09:39:40 · 319 阅读 · 0 评论 -
Java 设计模式-单例模式
单例模式是一种对象创建模式,确保系统中一个类只有一个实例。单例模式如下特点: 1、单例类只能有一个实例。 2、单例类必须自己自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 采用这种设计模式有两大好处: 1.对于频繁使用的对象,可以省略创建对象所花费的时间; 2.由于new操作的次数减少,对于系统内存的使用频率降低,这样减少GC的压力,缩短GC停顿的时间。单例模式有五原创 2016-03-24 20:07:22 · 392 阅读 · 0 评论 -
Java 多线程同步与锁
线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。例如一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。如果取钱线程和存钱线程同时发生,就会出现异常。因此多线程同步就是要解决这个问题,如下面的代码package com.example;/** * Created by Owen Chan on 16/3/14. * Copyright © 2016 Owen原创 2016-03-14 18:23:53 · 563 阅读 · 0 评论 -
Java 设计模式-适配器模式
一、概述适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并包含有被适配者的引用。二、适配器模式的结构Java适配器模式的结构中包括三种角色:目标(Target):目标是一个接口,该接口是客户想使用的接口。 被适配者(Adaptee):被适配者是一个已经存在的接口或抽象原创 2016-03-28 19:49:12 · 291 阅读 · 0 评论 -
Java 设计模式-享元模式
Java中的String类型在JAVA语言中,String类型就是使用了享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝。String a=”abc”,其中”abc”就是一个字符串常量。public class Test { public static void main(Stri原创 2016-04-27 16:09:16 · 280 阅读 · 0 评论 -
Java 设计模式-原型模式
原型模式定义用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式主要用于对象的复制,Prototype类需要具备以下两个条件: 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotS原创 2016-04-27 18:05:58 · 299 阅读 · 0 评论 -
Java 设计模式- 外观模式
外观模式(Facade):是为了解决类与类之间的依赖关系的,像spring一样,可以将类与类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类与类之间的耦合度,该模式中没有涉及到接口。UML图:代码如下:public class Client { public static void main(String[] args) { Facade f原创 2016-04-27 18:49:24 · 487 阅读 · 0 评论 -
Java 中equal() 方法与==的区别以及 equals()与 hashCode()方法重写
本篇文章主要讲述 hashCode和equals方法 以及他们的重写,主要分以下几点进行讲述:1、”==” 与 equals() 的区别2、hashCode()和equals()的用法 “==” 与 equals() 的区别java中的数据类型,可分为两类: 基本数据类型与符合数据类型 1、基本数据类型,。byte,short,char,int,long,float,double,boolean原创 2016-04-11 19:49:34 · 768 阅读 · 0 评论 -
Java 设计模式-组合模式
组合模式使用面向对象的思想来实现树形结构的构建与处理,描述了如何将容器对象和叶子对象进行递归组合,实现简单,灵活性好。由于在软件开发中存在大量的树形结构,因此组合模式是一种使用频率较高的结构型设计模式,Java SE 中的 AWT 和 Swing 包的设计就基于组合模式,在这些界面包中为用户提供了大量的容器构件(如 Container)和成员构件(如 Checkbox、Button 和 TextCo原创 2016-04-18 16:02:06 · 357 阅读 · 0 评论 -
Java 设计模式 - 桥接模式
Bridge 模式又叫做桥接模式,是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。UML 图:代码:public class Client { public static v原创 2016-05-04 17:19:08 · 307 阅读 · 0 评论 -
Java 判断汉字以及大小写字母
代码如下:public class MainActivity extends AppCompatActivity { EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);原创 2016-10-27 19:51:41 · 1682 阅读 · 0 评论 -
Java类中的初始化顺序
根据《Thinking in Java》相关章节及自己的理解举例来说明类初始化顺序。public class InitialOrder { private static String staticField = "Static Field Initial"; private String field = "Field Initial"; static { Syste原创 2016-10-21 09:17:03 · 3602 阅读 · 0 评论 -
设计模式系列: OOP(Object-Oriented Programming)设计六大设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。查看Apache和Sun的开放源代码能帮助你发现其他Java设计原则在这些代码中的实际运用。六点设计原则如下:一、Open Close Principle (开闭原则)OCP(Open Clo原创 2017-03-04 12:20:10 · 660 阅读 · 0 评论