Sxf-Blog


  • 首页

  • 归档

GO-BACK

发表于 2019-12-20

String、StringBuffer 、StringBuilder

String

  • String 是字符串对象常量、对象一旦创建之后该对象的值不可更改:String s=”abce”是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径

  • StringBuilder、StringBuffer 对象是变量的、其对象可以更改或者是说其对应的值是可以更改的

    1 String str="abc";
    2 System.out.println(str);
    3 str=str+"de";
    4 System.out.println(str);
    
  • 如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢

  • String实现继承-最后到内部存储都是以char[]str来存储对应的文本内容

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence
    
  • StringBuffer 实现继承-CharSequence(有序队列char)

    public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
    
    .....
    //String方法    
    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
    
  • 其append方法都有synchronized 标志、顾当有多个线程调用相同对象进行添加时、其线程是安全的

  • toString():也验证了String内部存储转换:value:char[]

       @Override
    public synchronized String toString() {
        if (toStringCache == null) {
        toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, 0, count);
        }
    
  • StringBuilder -继承

    public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
    
    ....
    //方法--线程不安全的
     @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    
  • class 用final修饰、代表其无法实现被继承

equals、==

  • ==:== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
  • 1、比较的是操作符两端的操作数是否是同一个对象。
    2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
    3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为true,如:
    int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。

其实直接对应数值的比对也是进行地址的比对-地址指向的都是常量为10的堆地址

  •   equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

    //Object内部equals方法:其实内部就是进行的==判断、也就是地址指针的判断
      public boolean equals(Object obj) {
            return (this == obj);
        }
    
    //String内部的equals--先比较对象地址、然后比较长度、然后比较内部的char[]的数值
    
    public boolean equals(Object anObject) {
        if (this == anObject) {
        return true;
        }
        if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = length();
        if (n == anotherString.length()) {
            int i = 0;
            while (n-- != 0) {
                if (charAt(i) != anotherString.charAt(i))
                        return false;
                i++;
            }
            return true;
            }
        }
        return false;
    }
    
  • 经典案例

picture

  • 参考文献

equals和==的区别小结

Java中的String,StringBuilder,StringBuffer三者的区别

Git语法

发表于 2019-12-20

新建本地仓库

  • 在当前目录新建一个Git代码本地仓库

    git init

  • 添加指定文件到暂存区

    git add [file] [file] ....  
    
  • 提交文件到本地

    git commit [file] [file] ... -m[message]
    git commit -m[message]
    
  • 提交到远端

    git push
    
  • 删除工作区文件

    git rm [file] [file] ....
    
  • 提交显示时所有的diff信息

    git commit -v
    git status
    

    分支

  • git branch//查看本地分支
  • git branch -r//查看远程分支
  • git branch -a//查看本地和远程分支
  • git branch [branch-name]//创建新分支,但是仍然停留在改分支
  • git checkout [branch-name]//切换到当前分支—git checkout -b [branch-name]//也同样可以实现
  • git merge [branch]//合并指定分支(branch)到当前分支
  • git branch -d [branch-name]//删除本地分支
  • git branch -d origin [branch-name]//删除远程分支

创建Tag

  • git tag//列出所有tag
  • git tag [tag]//创建一个tag在本地
  • git push [remote] [tag]//提交tag到指定远端
  • git push [remote] --tags//提交所有tag到远端分支[origin]

删除远程分支和Tag

  • git push origin --delete <brancnName>
  • git push origin --delete tag <tagName>

    删除本地分支和tag

  • git tag -d [tag]
  • git branch -d [branch]

    删除掉不存在远程分支的本地分支

  • git fetch -p //会删除所有的没有跟远程分支对应上的本地分子
  • git checkout branchX //切换到不复合的本地分支 然后使用
    git remote prune origin可以清除对应的分支

    重命名远程分支

  • 在git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支
  • 先查看远程的分支

    git branch -a  
    
  • 删除远端分支

    git push --delete origin develop
    
  • 重命名本地分支(develop–>devel)

    git branch -m develop devel
    
  • 推送本地分支

    git push origin devel
    

多分支并行开发(都是以develop为基准分支)

  • 正常逻辑

    git branch native;//创建本地分支
    git checkout native;//切换到native分支,前提是需要将develop的代码进行提交后再切换
    ... ... native分支一顿修改
    此时如果 git checkout develop
    develop上会有native分支上边的修改
    但是其实修改还是算native分支上边的修改,并不是develop分支上的
    
  • 方案一:将native分支推送到远端origin

    git push origin native
    //切换分支前将native内容提交到远端然后再切换
    git commit -xxx
    git push
    git checkout develop
    
  • 方案二:只是小功能点不需要提交到远端

    native分支修改后进行commit,然后再切换
    git commit -xxx
    git checkout develop//这时develop上就不会有native分支新增内容,跟方案一是一样的
    
  • 方案三:可以不commit的话可以用stash

    切换到native分支后一顿修改,然后可以
    git stash//将修改的内容暂时先存储在git的栈中
    //等你下次切回来后
    git stash pop //会提取出你之前存储的最新一次的记录
    
    git stash save "messageTxt" //暂存代码添加备注信息
    
    git stash list //查看暂存区间列表
    
    git stash show //显示暂存区间第一个0 的修改文件
    
    git stash show stash@{$number} //比如第二个就是git stash show stasg@{$1}
    
    git stash pop   //取出暂存区某个暂存,并删除 stash@{$number}
    
    git stash apply  //取出暂存区某个暂存,不删除存储空间里的存储  stash@{$number}
    
    git stash clear;        //删除所有缓存的stash
    
  • 值得注意的是:

    • 不过这种一般会用在develop修改,然后还没改好,需要切换到native分支上,这时会用到,因为不提交的话是切换不到native分支的,,子分支可以不提交直接切父分支,父分支不可以不提交直接切子分支,,正常子分支是建立在父分支的基租上创建的,所以正常是子分支代码量是大于父分支的
  • des

    • native修改后忘记commit,然后遗忘,在master上继续修改,切换到native上commit后,在切换develop,develop上就没有对应的修改了
    • 大概意思就是不管你在哪个分支修改,最终commit的分支为最终分支的提交,之前其他分支修改没有提交的都会还原到上一次提交的最新状态
  • git cherry-pick

    git cherry-pick "commit_id"  //合并另一个分支的某个提交到当前分支,当然前提是当前分支需要pull最新代码,如果成功,会在当前分支本地有一条提交记录
    
    //遇见冲突、解决冲突
    git status //查看冲突文件
    git add .//解决完添加
    git commit "新的commitIdMessage"
    
    git cherry-pick --continue //继续执行其他cherry-pick
    
    git cherry-pick --quite //cherry-pick 退出本次cherrypick
    
    git cherry-pick --abort //cherry-pick 回退本次 cherry-pick
    
    git cherry-pick branchName  //将该branchName分支最新一条的commit 合并过来
    
git pull --rebase ;//基于当前分支拉取代码        

git rebase --continue;//当拉取代码冲突后--需执行

git log //显示提交的信息

git reset "commitId" //回退到当前提交--前提是没有push

git commit --amend;//提交当前内容到临近的上一次提交,也就是将这次提交合并到上一次提价,减少commit的记录,前提是上一次commit还没有push

git push 仓库地址 HEAD:refs/for/分支%r=代码审核人git用户名,r=代码审核人2,r=xxx   //提交添加审核人

git branch hear//操作 git 命令有时候 as 编译git命令 环境 编译格式会有问题

参考文章

  • http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
  • https://blog.zengrong.net/post/1746.html

待续

  • 总归一句话:操作分支:git branch ..
  • 操作tag:git tag …
  • 操作远程提交tag/branch:git push origin 2.0—-//或者git push –tags(省略origin远程 )
  • 操作远程删除tag/branch:git push origin -d 2.0
  • 远程代码提交:git push 就可以了

Enum&RGB

发表于 2019-12-20

枚举

public enum EnumBean {
//这些类别每个都是一个该EnumBean的类、也就是多个EnumBean的对象、只是这些枚举定义的方式有点不同、类似于EnumBean enumbean;只不过枚举调用是直接可以点出来的,也就是类似于static的
    TAB01(0, "随性一笔"),
    TAB02(1, "SeekBar"),
    TAB03(2, "PopWindow-List"),
    TAB04(3, "gson/fastJson-特殊字符转译"),
    TAB05(4, "Rxjava-请求示例"),

    TAB06(5, "Pic选择"),

    TAB07(6, "DialogFragment"),

    TAB08(7, "跳转App"),

    TAB09(8, "事件分析"),

    TAB10(9, "重定项-URL2JS"),

    TAB11(10, "方法作用域");

        private String enumName;
    private int enumPosition;

    EnumBean(int position, String tab01) {
    enumName = tab01;
    enumPosition = position;
    }

    @Override
    public String toString() {
        EnumBean[] values = EnumBean.values();
        for (EnumBean enumBean : values) {
            if (enumBean.getEnumPosition() == 10) {
                return enumBean.getEnumName();
            }
        }
        return "";
    }


    public String getEnumName() {
        return enumName;
    }

    public void setEnumName(String enumName) {
        this.enumName = enumName;
    }

    public int getEnumPosition() {
        return enumPosition;
    }

    public void setEnumPosition(int enumPosition) {
        this.enumPosition = enumPosition;
    }

}
  • 枚举唯一和对象不同的一点是存储的方式:其就类似于对象可以设置属性、但是其也可以拿来比较,例如switch比对

  • switch语句只支持int,char,enum类型–所以这点尤为重要

    enum Signal {  
        GREEN, YELLOW, RED  
    }  
    public class TrafficLight {  
        Signal color = Signal.RED;  
        public void change() {  
            switch (color) {  
            case RED:  
                color = Signal.GREEN;  
                break;  
            case YELLOW:  
                color = Signal.RED;  
                break;  
            case GREEN:  
                color = Signal.YELLOW;  
                break;  
            }  
        }  
    }  
    
  • 直接获取对应的EnumBean的对象
    EnumBean tab01 = EnumBean.TAB01;

  • 通过对应的对象命名获取对应的EnumBean的对象
    EnumBean enumBean = EnumBean.valueOf("TAB01");

  • 获取EnumBean的对象集合
    EnumBean[] values = EnumBean.values();

RGB

public static final Bitmap.Config ALPHA_8
public static final Bitmap.Config ARGB_4444
public static final Bitmap.Config ARGB_8888
public static final Bitmap.Config RGB_565
  • 其实这都是色彩的存储方法:我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值
  • 说白了其实就是:

    ALPHA_8就是Alpha由8位组成
    
    ARGB_4444就是由4个4位组成即16位,
    
    ARGB_8888就是由4个8位组成即32位,
    
    RGB_565就是R为5位,G为6位,B为5位共16位        
    
  • 由此可见:

    ALPHA_8 代表8位Alpha位图
    
    ARGB_4444 代表16位ARGB位图
    
    ARGB_8888 代表24位ARGB位图
    
    RGB_565 代表16位RGB位图
    

位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真。

ps: 这里像素点大小(每个像素点占用内存的大小)以 4B 来计算是因为,当没有特别指定时,系统默认为 ARGB_8888 作为像素点的数据格式,其他的格式如下:

    ALPHA_8 -- (1B)
    RGB_565 -- (2B)
    ARGB_4444 -- (2B)
    ARGB_8888 -- (4B)
    RGBA_F16 -- (8B)
  • 正常的颜色FFEECC:其也是由 FF\EE\CC :256、256、256 所以正常是44 44 4*4等24位二进制数值组成

  • 一切都源于二进制最后都会归于二进制:Android 内部资源文件id也是内部对应R对象内部的二进制值转换成16进制存储,,内部规则也是根据二进制转换;

参考

图片压缩质量参数Bitmap.Config RGB_565

Java枚举7种用法

数据结构(表)和算法

发表于 2019-12-20

概述

数据结构

  • 就是以某种形式将数据存储在一起的集合,它不仅存储数据,而且还支持查找访问,删除,添加,数据处理等操作。

算法

  • 是为了求解一个问题需要循环的,被清楚指定的简单的指令集合,也就是代码算法规则,为了更简洁方便的解决复杂的循环查找遍历等问题

数据表之数据结构体现方式

线性表-线性存储结构

  • 是最常用最简单的一种数据结构,它是n个数据元素的有限序列,这种是针对正常的线性表结构如:数组;其在创建的时候就需要指定该数组的长度;

  • 代码中使用的体现方式

    • 数组 :最常见和最基本的线性结构存储方式
    • ArrayList: 也就是可增加的动态数组
  • 优势:可以通过下标进行数据的查找,访问和修改该对象元素,比较搞笑

  • 缺点:插入删除花费开销大,比如,当在第一个位置插入数据的时候,首先需要把所有的数据往后移动一个位置,然后在进行插入处理,比较耗时,为了提高插入删除处理的效率可以用链式结构来实现线性表

链表-链式存储结构

  • 链表是物理存储单元上非连续、非顺序的存储结构,是由一系列“节点”组成,这些节点不必在内存中相连,其逻辑顺序是根据链表中的指针链接顺序来决定的,也就是根据指针来寻找自己指向的下一个节点

  • 节点:是由数据部分:Data和链接部分指针Next组成,Next指向下一个节点,这样在添加删除数据时只需要改变指定的数据的Next的指向就可以了。

  • LinkedList: 双向链表结构,也就数有两个指针,一个指向上一个节点,一个指向下一个节点

  • 其是数据单元在内存中存储的方式是没必要相连有序的存储类似于线性存储那样,并不是针对ArrayList使用时打印出来的就是有序的,LinkedList就是无需的,其只是内存中的存储,真正使用的时候,其遍历取值的时候也是经过转换有序的输出的,可能LinkedList查找更慢一点添加更快一点,ArrayList查找更快一点,添加更慢一点;

  • 针对链式结构存储,所有的查找都是通过指针的,找到对应的指针,其实对应的指针就是下一个对象的索引对象(指向地址)

特殊线性表-栈和队列存储结构

  • 栈 :是限制插入和删除只能在一个位置上进行的表,该位置就是表的末端,就是栈顶;保持先进后出的数据存储方式,LIFO:last in first out,常见的运用存储是Activity的存储

  • 队列:只能在表头进行数据的删除,在表尾部进行数据的添加;常见的运用是Handler的Message队列MessageQueen

树与二叉树存储结构

  • 树: 是由n(n>=1)个有限节点组成一个具有层次关系的集合。它具有以下特点:每个节点有零个或多个子节点;没有父节点的节点称为 根 节点;每一个非根节点有且只有一个 父节点 ;除了根节点外,每个子节点可以分为多个不相交的子树。:也就是每个节点可以有多个分支树
  • 二叉树:是每个节点最多有两棵子树的树结构。通常子树被称作“左子树”和“右子树”。二叉树常被用于实现二叉查找树和二叉堆。:也就是每个节点只有最多有两个分支树
  • 二叉树遍历

    picture

参考文献

常见的数据结构和算法整理

图片质量、尺寸压缩

发表于 2019-12-20

图片尺寸压缩处理

  • 所有的操作都是通过流完成的、转换成流后进行处理压缩、然后在吧处理好的流转换成Bitmap

  • 尺寸压缩修改,只是修改该图片的宽高。并不是对该图片进行裁剪

  • file文件获取图片资源

    picture

  • Bitmap直接压缩处理

    picture

图片质量压缩处理

  • 所有的操作都是通过流完成的、转换成流后进行处理压缩、然后在吧处理好的流转换成Bitmap

    picture

对图片进行裁剪

picture

  • 这种需要图片自动延伸扩展的一般用 scaleType来实现
    • centerCrop 会随着ImageView的宽高,自动进行图片的等比缩放,然后展示,当缩放后图片大于ImageView的话会进行自动裁剪显示图片中间区域
    • fitXY 充满ImageView的大小,不会考虑图片本身的宽高比例
    • 其他的自行百度

Bitmap的常见方法介绍

  • 解析流

    Bitmap bitmap=BitmapFactory.decodeStream(InputStream is, Rect outPadding, Options opts)
    
  • 压缩Bitmap转换成输出流

    bitmap.compress(CompressFormat format, int quality, OutputStream stream);//100表示不压缩,质量最好
    
  • 裁剪Bitmap

    Bitmap.createBitmap(@NonNull Bitmap source, int x, int y, int width, int height,@Nullable Matrix m, boolean filter)
    

Android应用浮窗按钮&自定义音频通知栏

发表于 2019-12-20

Android 应用悬浮按钮

*

Android抓包调试

发表于 2019-12-20

Stetho

参考: github 地址:https://github.com/facebook/stetho

  • app_gradle 添加依赖
api 'com.facebook.stetho:stetho:1.5.0'
api 'com.facebook.stetho:stetho-okhttp3:1.5.0'
  • Application 初始化

    if(BuildConfig.DEBUG){
        Stetho.initializeWithDefaults(this);
    }
    
  • OkHttp添加网络拦截器

    OkHttpClient.Builder builder = new OkHttpClient.Builder()
    .addNetworkInterceptor(new StethoInterceptor()
    
    • 顺便提一下OkHttp添加请求Head头

      public class OkHttpRequestHeadIntercepter implements Interceptor {
          @Override
      public Response intercept(Chain chain) throws IOException {
      Request.Builder builder = chain.request().newBuilder()
          .addHeader("gg-version", BuildConfig.VERSION_NAME);
      if (UserUtils.isLogin()) {
          builder.addHeader("gg-token", UserUtils.getToken());
      }
          Request request = builder.build();
          return chain.proceed(request);
              }
      }
      

      picture

Fidder抓包来了

  • 下载地址:

    https://www.telerik.com/download/fiddler
    
  • 配置步骤参考

    https://blog.csdn.net/shimengran107/article/details/78644862
    
  • Fidder 过滤条件参考

    https://www.cnblogs.com/sjl179947253/p/7627250.html
    
  • 抓包工具有很多,但原理大体就是根据wifi代理进行url截取处理,Wind启动Fiddler后,其内部就相当于一个虚拟的跟你电脑IP一样的代理服务区,这是你会发现Chrome网页打不开,不安全,是因为证书问题,需要把Fiddler的安全证书加到Chrome证书列表里!!!手机WiFi连接代理后,其浏览器打不开网页,输入:ip:post端口 下载证书安装!!!(所谓的代理,也就类似于访问的是你设置代理的服务器,,相当于Shadowsock代理服务器翻墙一样)

  • Fiddler 抓包好像只能抓Debug的包,Release(签名)的Url数据抓不到,包括从应用市场下载的Apk

  • 又用到了之前的Chrome的SwitchyOmega插件—为了是防止代理翻墙网络有限,有些不用翻墙的用外网浪费,这个是自动内外网切换!!!

未完待续…反编译

12
Sxf

Sxf

Nothing to say

17 日志
© 2020 Sxf
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4