java对象四大引用

强引用、软引用、弱引用、虚引用总结

总结:
  1. 强引用(StrongReference):普通new对象的引用
    Person person  = new Person();
    JVM宁愿抛出OutOfMenory异常也不会去回收该对象。
    
  2. 软引用(SoftReference):
    SoftReference引用的装饰对象,该对象的强引用应该赋值空
    这里配合SoftReferenceQueue使用(也可以配合),因为SoftRefereceQueue本身也是new了一个对象,当它把别人的问题解决掉以后,也需要自己的问题解决,所有jvm把软引用对象回收后,就会把自己的对象引用放到这个队列中,我们可以通过队列的poll()方法查看,如果存在该ReferenceQueue引用也赋值为空,等待被jvm回收。注意:软引用对象在jvm内存不够的时候才会被回收,我们调用system.gc方法只是起通知作用,jvm什么时候扫描回收对象,是jvm自己的状态决定的。就算扫描到软引用对象也不一定回收。只有内存不够的时候才会回收
    ReferenceQueue queue = new ReferenceQueue();
    Person person = new Person();
    SoftReference soft = new SoftReference(person,queue);
    user = null;
  3. 弱引用(WeakReference):弱引用也是用描述非必需对象的,当jvm进行垃圾回收时,只要扫描到,无论内存是否充足(与软引用的区别),都会回收弱引用关联的对象。在java中,用java.lang.ref.WeakReference类表示
    WeakReference weak = new WeakRefence(new Person());
    System.out.println(weak.get());
    System.gc();//通知jvm的gc进行垃圾回收
    System.out.println(weak.get());
  4. 虚引用(PhantomReference):
    虚引用和前面的软引用,弱引用不同,它并不影响对象的生命周期。
    在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。要注意的是,虚引用必须和引用队列关联使用,当垃圾回收准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入引用队列,那么就可以在所引用的对象内存被回收之前采取必要的行动。
    ReferenceQueue queue = new ReferenceQueue();
    PhantomReference prf = new PhantomReference(new Person(),queue);
    System.out.print(prf.get());
    http://www.cnblogs.com/dolphin0520/p/3741519.html
    http://www.cnblogs.com/dolphin0520/p/3749259.html

android 正则表达式

android正则表达式及Pattern Matcher使用

// 反斜杠
/t 间隔 ('/u0009')
/n 换行 ('/u000A')
/r 回车 ('/u000D')
/d 数字 等价于[0-9]
/D 非数字 等价于[^0-9]
/s 空白符号 [/t/n/x0B/f/r]
/S 非空白符号 [^/t/n/x0B/f/r]
/w 单独字符 [a-zA-Z_0-9]
/W 非单独字符 [^a-zA-Z_0-9]
/f 换页符
/e Escape
/b 一个单词的边界
/B 一个非单词的边界
/G 前一个匹配的结束

^为限制开头
^java     条件限制为以Java为开头字符
$为限制结尾
java$     条件限制为以java为结尾字符
.  条件限制除/n以外任意一个单独字符
java..     条件限制为java后除换行外任意两个字符


加入特定限制条件「[]」
[a-z]     条件限制在小写a to z范围中一个字符
[A-Z]     条件限制在大写A to Z范围中一个字符
[a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符
[0-9]     条件限制在小写0 to 9范围中一个字符
[0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符
[0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集)

[]中加入^后加再次限制条件「[^]」
[^a-z]     条件限制在非小写a to z范围中一个字符
[^A-Z]     条件限制在非大写A to Z范围中一个字符
[^a-zA-Z] 条件限制在非小写a to z或大写A to Z范围中一个字符
[^0-9]     条件限制在非小写0 to 9范围中一个字符
[^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符
[^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)

在限制条件为特定字符出现0次以上时,可以使用「*」
J*     0个以上J
.*     0个以上任意字符
J.*D     J与D之间0个以上任意字符

在限制条件为特定字符出现1次以上时,可以使用「+」
J+     1个以上J
.+     1个以上任意字符
J.+D     J与D之间1个以上任意字符

在限制条件为特定字符出现有0或1次以上时,可以使用「?」JA? J或者JA出现

限制为连续出现指定次数字符「{a}」
J{2}     JJ
J{3}     JJJ
文字a个以上,并且「{a,}」
J{3,}     JJJ,JJJJ,JJJJJ,???(3次以上J并存)
文字个以上,b个以下「{a,b}」
J{3,5}     JJJ或JJJJ或JJJJJ
两者取一「|」
J|A     J或A
Java|Hello     Java或Hello

比如,在字符串包含验证时

//查找以Java开头,任意结尾的字符串
Pattern pattern  = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("Java棒棒的");
boolean bool = matcher.matches();
System.out.println(bool); //true

//以多条件分割字符串时
Pattern pattern = Pattern.compile("[,|]+");
String[] strs = pattern.split("Java Hello World  Java,Hello,,World|Sun");
for (int i=0;i<strs.length;i++) {  
 System.out.println(strs[i]);  
 //Java Hello World  Java
//Hello
//World
//Sun
}  

//文字替换(首次出现字符)
Pattern pattern = Pattern.compile("正则表达式");  
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello       World");  
//替换第一个符合正则的数据  
System.out.println(matcher.replaceFirst("Java"));  
//Java Hello World,正则表达式 Hello

//文字替换(全部)
Pattern pattern = Pattern.compile("正则表达式");  
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello       World");  
//替换第一个符合正则的数据  
System.out.println(matcher.replaceAll("Java"));  
//Java Hello World,Java Hello


//◆文字替换(置换字符)
 Pattern pattern = Pattern.compile("正则表达式");
 Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World ");
 StringBuffer sbr = new StringBuffer();
 while (matcher.find()) {
        matcher.appendReplacement(sbr, "Java");
 }
 matcher.appendTail(sbr);
 System.out.println(sbr.toString());
 //Java Hello World,Java Hello World 


 //验证是否为邮箱地址
 String str="ceponline@yahoo.com.cn";  
 Pattern pattern =  
 Pattern.compile("[//w//.//-]+@([//w//-]+//.)+[//w//-]+",Pattern.CASE_INSENSI
 TIVE);  
 Matcher matcher = pattern.matcher(str);
 System.out.println(matcher.matches());  //true

//去除html标记
 Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL);  
 Matcher matcher = pattern.matcher("<a href=/"index.html/">主页</a>");  
 String string = matcher.replaceAll("");  
 System.out.println(string); //主页

//查找html中对应条件字符串
Pattern pattern = Pattern.compile("href=\"(.+?)\"");
Matcher matcher = pattern.matcher("<a href=\"index.html\">主页</a>");
if(matcher.find())
System.out.println(matcher.group(1));//index.html

//截取http://地址
Pattern pattern = Pattern.compile("(http://|https://){1}[//w//.//-/:]+");  
Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");  
StringBuffer buffer = new StringBuffer();  
while(matcher.find()){                
buffer.append(matcher.group());          
buffer.append("/r/n");                
System.out.println(buffer.toString());  
}  

//替换指定{}中文字
String str = "Java目前的发展史是由{0}年-{1}年";  
String[][] object={new String[]{"//{0//}","1995"},new 
String[]{"//{1//}","2007"}};  
System.out.println(replace(str,object));  
public static String replace(final String sourceString,Object[] object) {  
        String temp=sourceString;      
        for(int i=0;i<object.length;i++){  
                  String[] result=(String[])object[i];  
           Pattern    pattern = Pattern.compile(result[0]);  
           Matcher matcher = pattern.matcher(temp);  
           temp=matcher.replaceAll(result[1]);  
        }  
        return temp;  
        }  //Java目前的发展史是由1995年-2007年

git基础学习二

git常用命令

1) 远程仓库相关命令

检出仓库:$ git clone git://github.com/jquery/jquery.git
查看远程仓库:$ git remote -v
添加远程仓库:$ git remote add [name] [url]
删除远程仓库:$ git remote rm [name]
修改远程仓库:$ git remote set-url –push[name][newUrl]
拉取远程仓库:$ git pull [remoteName] [localBranchName]
推送远程仓库:$ git push [remoteName] [localBranchName]

2)分支(branch)操作相关命令

查看本地分支:$ git branch
查看远程分支:$ git branch -r
创建本地分支:$ git branch [name] —-注意新分支创建后不会自动切换为当前分支
切换分支:$ git checkout [name]
创建新分支并立即切换到新分支:$ git checkout -b [name]
删除分支:$ git branch -d [name] —- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$ git merge [name] —-将名称为[name]的分支与当前分支合并
创建远程分支(本地分支push到远程):$ git push origin [name]
删除远程分支:$ git push origin :heads/[name]
我从master分支创建了一个issue5560分支,做了一些修改后,使用git push origin master提交,但是显示的结果却是’Everything up-to-date’,发生问题的原因是git push origin master 在没有track远程分支的本地分支中默认提交的master分支,因为master分支默认指向了origin master 分支,这里要使用git push origin issue5560:master 就可以把issue5560推送到远程的master分支了。
如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,那么可以这么做。

$ git push origin test:master // 提交本地test分支作为远程的master分支 //好像只写这一句,远程的github就会自动创建一个test分支
$ git push origin test:test // 提交本地test分支作为远程的test分支

如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。

$ git push origin :test // 刚提交到远程的test将被删除,但是本地还会保存的,不用担心

3)版本(tag)操作相关命令

查看版本:$ git tag
创建版本:$ git tag [name]
删除版本:$ git tag -d [name]
查看远程版本:$ git tag -r
创建远程版本(本地版本push到远程):$ git push origin [name]
删除远程版本:$ git push origin :refs/tags/[name]
推送所有tag: git push origin –tags

tag迁出branch:
git checkout tagname
git checkout -b new_branch_name

4)git stash暂存相关命令

git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

5)git rebase 使用

当前分支问题develop,从master拉取最新代码
git pull –rebase origin master 或者 git rebase develop
先将develop分支的代码checkout出来,作为工作目录
然后将master分支从develop分支创建起的所有改变的补丁,依次打上。如果打补丁的过程没问题,rebase就搞定了
如果打补丁的时候出现了问题,就会提示你处理冲突。处理好了,可以运行git rebase –continue继续直到完成
如果你不想处理,你还是有两个选择,一个是放弃rebase过程(运行git rebase –abort),另一个是直接用test分支的取代当前分支的(git rebase –skip)。

6) 工具

SourceTree & git bash

git进阶
进阶链接

团队合作git
rxjava进阶教程

git基础学习一

git常用命令

  1. git mkdir xx(创建xx文件夹) cd xx(切换到xx文件夹)
  2. touch a.md(新建a.md文件)
  3. gitstatus (查看git文件内容状态)
  4. git init(初始化仓库)
  5. git add xx(添加xx文件到暂存区) git add . (添加所有文件到暂存区)
  6. git commit -m”content”(content 提交内容留言)
  7. git log (查看日志)
  8. git branch (查看分支,* master是默认分支)
  9. git branch a (新建名为a的分支)
  10. git checkout a (切换到名为a的分支 快捷方式 git checkout -b a 新建a分支并切换到该分支)
  11. git merge (分支合并 切换到主分支 再执行 git merge a 将a分支合并到主分支上)
  12. git branch -d a (删除a分支)
  13. git branch -D a (执行 branch -d a 删除失败,比如a分支未合并到主分支上,git branch -D a就是执行强制删除)
  14. git tag v1.0(创建标签v1.0版本。标签,用于标记版本。切换某版本 git checkout v1.0)

PUSH&PUll

  1. git push origin master (推代码到远程仓库)
  2. git pull origin master (拉代码到本地)
  3. git clone git@github.com:mccapp/test.git (将远程代码复制到本地)
  4. git remote add origin git@github.com:mccapp/test.git (将本地项目与github上的项目进行关联)
  5. git remote -v (查看有那些远程仓库)
  6. git config –blobal user.name “mccapp” (设置github用户名)
  7. git config –blobal user.email “rsinn@sina.com”(设置邮箱)

git进阶
进阶链接

团队合作git
rxjava进阶教程

resume2

姓名
170 7777 7777 | xxx@gmail.com | github.com/xx | www.xx.com

个人经历
20xx/xx—至今
codeKK2 公司 | Android 资深开发
工作描述:带领移动团队负责 xx,取得了什么成绩

20xx/xx—20xx/xx
codeKK1 公司 | Android 高级开发
工作描述:负责 xx 产品,取得了什么成绩

20xx/xx—20xx/xx
XXX 学校 | XX 专业 | 本科
专业排名:x/xxx GPA:

专业技能
x 年团队管理经验,x 年开发经验,x 年移动开发经验
开源 xx 项目,用于 xx,多少 Star,多少 Contributors
博客主要分享 xx xx
熟悉 Android 应用框架设计,熟悉 Android 高性能编程及调优
熟悉xx 技术点,xx 技术点,xx 技术点

项目经验

  1. 20xx/xx—至今 | codeKK2 公司 | XX 项目
    项目简介:
    职责:

  2. 20xx/xx—20xx/xx | codeKK2 公司 | XX 项目
    项目简介:
    职责:

  3. 20xx/xx—20xx/xx | codeKK2 公司 | XX 项目
    项目简介:
    职责:
  4. 20xx/xx—20xx/xx | codeKK1 公司 | XX 项目
    项目简介:
    职责:

  5. 20xx/xx—20xx/xx | codeKK1 公司 | XX 项目
    项目简介:
    职责:

在校经历
XX大赛 XX 奖
XX 系统设计、开发
XXX 奖学金