对字符串的一些操作一直很搞不懂
比如创建的字符串什么时候相等 常量池是啥东西?
String和其他类型的转换?
StringBuffer StringBuilder都是干啥的?
一直想彻底搞明白,但是总是拖着,最近去官网看了看说明文档,感觉豁然开朗。
明明是很简单的事情,千万不要拖。
分享一下整理的文档,希望可以帮到你。
String的常量特性
Because String objects are immutable they can be shared.
String是常量,他们可以被共享。
String可以被存储到两个地方:字符串常量池 ,堆内存。
- 双引号创建的字符串对象,在字符串常量池中存储同一个。
- java存在编译优化机制,程序在编译时
"a"+"b"+"c"
会转化成"abc"
,编译完后的class文件里面直接变成“abc”。 - 通过new构造器创建的字符串对象,在堆内存中分开存储。
- 通过运算产生的字符串也会新开辟内存。
String str = "abc"; String str1 = "a"+"b"+"c"; //相同 char data[] = {'a', 'b', 'c'}; String str2 = new String(data); //不同 new了一个新对象
编译完后的class文件里面直接变成“abc”。
String常用API
直接将两个字符串比较,比较的是地址,比如s1==s2;
若比较内容应该用String提供的API
public boolean equals(Object anObject); //比较内容 public boolean equalsIgnoreCase(String anotherString); // 忽略大小写 比较字符串
public int length(); //返回此字符串的长度 public char charAt(int index); //获取某个索引位置处的字符 public char[] toCharArray(); //将当前字符串转换成字符数组 public String subString(int beginIndex, int endIndex); //根据开始和结束的索引 截取字符串 public String subString(int beginIndex); //从beginIndex截取到末尾 public String replace(CharSequence target, CharSequence replacement); //使用新值替换旧值 public String[] split(String regex); //根据传入的规则切割字符串,得到字符串数组返回
String与其他类型的转换
数据类型 | 字符串转换为其他数据类型的方法 | 其他数据类型转换为字符串的方法 |
boolean | Boolean.getBoolean(str) | String.valueOf([boolean] b) |
int | Integer.parseInt(str) | String.valueOf([int] i) |
long | Long.parseLong(str) | String.valueOf([long] l) |
float | Float.parseFloat(str) | String.valueOf([float] f) |
double | double.parseFloat(str) | String.valueOf([double] d) |
char[] 数组 String str; char[] chars; | chars=str.toCharArray(); | String str1 = new String(chars); String str2 = String.valueOf(chars); |
Object 类中有个方法 toString(); 所以所有的类都可以转换成String;
String 类有个方法 valueOf(); 所有类都可以转换成String;
主要就是char[]数组 要单独写出来;
Stringbuffer
Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings.
- 因为String是常量,一旦创建 值无法被修改。而String buffer支持可变字符串。所以当我们对字符串操作时常常使用Stringbuffer。
- Stringbuffer是线程安全的
- 他的核心操作就是append 和insert,一个在末尾加,一个在中间指定位置插入。
- 每个字符串缓冲区都有容量。只要字符串缓冲区中包含的字符序列的长度不超过容量,就没有必要分配新的内部缓冲区数组。如果内部缓冲区溢出,它会自动变大。
- 从JDK 5版开始,这个类增加了一个为单线程设计的等价类,StringBuilder。通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。
Constructor 构造器
StringBuffer(); StringBuffer(String str); //传入一个String StringBuffer(int capacity); //固定好容量 StringBuffer(CharSequence seq); //可以传入SB和String
Method
sb.append(); //在sb末尾加东西 StringBuffer insert(int offset, Object obj); //在offset位置插入 void setCharAt(int index, char ch); //设置index处的字符为ch StringBuffer delete(int start, int end); StringBuffer deleteCharAt(int index); int indexOf(String str); //返回sb中与string匹配的第一个index StringBuffer reverse(); //翻转sb String substring(int start, int end); //裁剪
StringBuilder
多个线程使用StringBuilder的实例是不安全的。如果需要这样的同步,那么建议使用StringBuffer。
其他和StringBuffer完全一样。
CharSequence 接口
就是String,SB的父接口,
接口有这些方法 charAt, chars, codePoints, isEmpty, length, subSequence, toString
All Known Implementing Classes:
CharBuffer, Segment, String, StringBuffer, StringBuilder
Method:
char charAt(int index); //返回索引处的字符char static int compare(CharSequence cs1, CharSequence cs2); //按照字典顺序比较两个字符串 default boolean isEmpty(); //是否为空 int length(); //返回长度 CharSequence subSequence(int start, int end); //截取一节子串 String toString(); //转换成String
这说明了 StringBuffer ,StringBuilder,String 都有这几个方法,
并且SB可以toString转化为String。