4、字符串

字符串

此处需要理解JVM逻辑内存模型:
参考http://www.haonanji.cn/408.html
http://www.cnblogs.com/dingyingsi/p/3760447.html
http://my.oschina.net/u/248570/blog/50920
http://lavasoft.blog.51cto.com/62575/80034/
这里写图片描述
1、程序计数器:用于控制代码执行次序,称为行号指示器。由于多线程开发中每条线程都需纪录各自的状态,因此每个线程都有一个程序计数器,称为”线程私有”;
2、java虚拟机栈(stack):为虚拟机执行java(字节码)服务。线程私有。速度仅次于寄存器,位于RAM中。里面有局部变量表,存放基本类型数据,以及对象,数组,接口的引用。局部变量存储在栈中。栈分配的内存在编译期已经完成分配,若超出栈深度则抛出StackOverflowError。但目前有一些支持动态扩展,若无法申请到更多内存则抛出OutOfMemoryError。
3、本地方法栈:为虚拟机执行Native方法服务。同样会抛出异常。
4、java堆(heap):位于RAM中。内存最大的一块。可以被所有线程共享数据,在虚拟机创建时生成。成员变量存储在堆中。所有的对象实例都在这里申请空间。会抛出OutOfMemoryError。
5、方法区:所有线程共享。为class在内存中存放的位置。它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。会抛出OutOfMemoryError。
方法区中包括运行时常量池,class中的字面量和符号引用会在编译期存储到运行时常量池中。运行过程中可以继续往常量池中增加数据,如String的intern()方法,并会返回常量池中的地址。常量池内存不足会抛出OutOfMemoryError。
方法区中还包括静态区,主要存储static类数据。
6、直接内存:调用Native时直接分配堆外内存。

String创建:
String s1 = “abc”,jvm会先去String池中寻找,如果有abc则将s1栈中引用指向他,如果没有则在String池中创建abc再将引用指向他。
String s2 = new String(”abc”);使用new创建时,jvm会先去String池中寻找,如果有abc则在堆中生成一个新对象并会拷贝一份值,同时s1栈中引用指向新对象,如果没有则在String池中创建abc,在堆中生成一个新对象并会拷贝一份值,同时s1栈中引用指向新对象。

由于String不可变,则会产生许多中间变量:”a”+”b”=”ab”,而StringBuffer和StringBuilder可变。
StringBuffer 支持多线程 线程安全
StringBuilder 支持单线程 线程不安全

而对于基本数据类型,如int i = 3;会先在栈中查找是否有3这个字面值,如果有,则将i的引用指向他,如果没有,则在栈中为3重新申请内存,并将i的引用指向他。而对于包装类Integer,系统会自动配有-128-127的缓存地址。如果两个Integer在范围内则相等,如果不在里面,则会new一个新的Integer对象

正则表达式:

元字符写法意义
.“.”任意一个字符
\d“\d”0-9中一个数字
\D“\D”非数字字符
\s“\s”空格类
\S“\S”非空格类
\p{Lower}“\p{Lower}”小写
\p{Uper}“\p{Uper}”大写
\p{其他}“\p{其他}”其他

语法:
[abc] 代表abc中任意一个字符。
[^abc]代表除abc外任意一个字符。
[a-zA-Z]代表任意英文字符。
[a-d]代表abcd中任意一个字符。
中括号嵌套:
并:[a-d[m-p]];
交:[a-z&&[def]];
差:[a-z&&[^def]];
字符限定符:

写法意义
X?0或1次
X*0或多次
X+1或多次
X{n}刚好n次
X{n,}至少n次
X{n,m}n到m次

x*为贪婪模式,X*?为非贪婪模式
如:aabab:
a.*b结果为aabab;
a.*?b结果为aab;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值