4、字符串
2016-07-24 09:32
363 查看
字符串
此处需要理解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次 |
如:aabab:
a.*b结果为aabab;
a.*?b结果为aab;
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树