字符串
1 字符串概述
2 ==
3 字符串方法
字符串截取
字符串转换
字符串的切分
4 字符串在内存中存储图示
5 字符串比较
equals 为什么要把常量写在前面?这样写有什么好处?
"abc".equals(strData)
如果 strData=null;
那么 strData.equals("abc");就会抛出异常。
而 "abc".equals(strData);则是false
6 字符串的遍历
7 字符串拼接
8 StringBuffer
- 线程安全,可变的字符序列。 字符串缓冲区就像一个
String
,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。
StringBuffer的主要
StringBuffer
是append
和insert
方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符附加或插入到字符串缓冲区。append
方法总是在缓冲区的末尾添加这些字符;insert
方法将insert
添加到指定点。
线程安全与不安全的区别
线程安全与线程不安全
安全的话效率低,不安全效率低。
StringBuffer与String的区别
SpringBuffer的详解
只创建一次
其实上面的结果显示只创建一次,接下来的每一次都对同一对象进行操作
字符串反转
9 StringBuilder
StringBuffer与StringBuilder里面的方法是一模一样的
String和StringBuffer分别作为参数传递
10 String,StringBuilder,StringBuffer三者的区别
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
(1)首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
(2)再来说线程安全
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
(3)总结一下
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
11数组字符串互转
StringBuffer()不会产生垃圾。
Arrays
12 关于Java中length、length()、size()的区别
首先区分一下length和length();
length不是方法,是属性,数组的属性;
public static void main(String[] args) {
int[] intArray = {1,2,3};
System.out.println("这个数组的长度为:" + intArray.length);
}
length()是字符串String的一个方法;
public static void main(String[] args) {
String str = "HelloWorld";
System.out.println("这个字符串的长度为:" + str.length());
}
进入length()方法看一下实现
private final char value[];
public int length() {
return value.length;
}
@return the length of the sequence of characters represented by this object.
即由该对象所代表的字符序列的长度,所以归根结底最后要找的还是length这个底层的属性;
size()方法,是List集合的一个方法;
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
System.out.println("这个list的长度为:" + list.size());
}
在List的方法中,是没有length()方法的;
也看一段ArrayList的源码
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
public int size() {
return a.length;
}
由这段就可以看出list的底层实现其实就是数组,size()方法最后要找的其实还是数组的length属性;
另外,除了List,Set和Map也有size()方法,所以准确说size()方法是针对集合而言。
总结:
length——数组的属性;
length()——String的方法;
size()——集合的方法;