Java笔记:String类、ArrayList类(略讲)

String类

在Java中,String类属于引用数据类型,正如像数组一样的引用数据类型一样,包括存放在栈中的引用地址和存放在堆中的实际值。

字符串的声明

String str1 = “hello”;
String str2 = “hello”;
直接赋值,使str1,str2同时指向堆中”hello”字符串,由于并未经过new的过程,直接指向堆中常量池的相同区域,所以在执行System.out.println(str1 == str2); 时,实际比较的是str1、str2指向的堆中字符串常量池的位置,位置相同,打印出的值为true。然而str1,str2却是两个对象,改变其中一个,便在字符串常量区中划出新的部分,并将地址指向该部分。另外,==不能比较两个字符串内容是否相等。而当:
String str3 = new String(“hello”);
String str4 = new String(“hello”);
通过String类构造方法创造对象,不管内容是否相同,都会在堆中开辟新的存储空间,此时:
System.out.println(str3 == str4);//false
System.out.println(str3 == str1);//false
str3,str4在栈中存放的指向各自堆中实际对象的地址不同,str1在栈中存放直接指向字符串常量池的地址,也与str3不同。

字符串的修改

字符串与字符串之间用 ’+’ 相连接就可以达到字符串连接的效果,但是经过这一过程,在字符串常量池中,存在着原字符串、要加入的字符串和生成的新字符串三个字符串。字符串是不可变的,所有对字符串进行修改的操作,都是在堆中重新创建新的字符串,所以不断对一个字符串进行修改是十分耗费空间的。
字符串可看做一个字符数组,当调用字符串名.charAt(index) 时更为明显,例如:
String str1 = “hello”;
for(int i = 0;i< str1.length();i++){
System.out.print(str1.charAt(i));
}
就可实现字符串的一种麻烦的打印,而通过改变i在字符串中的范围,或通过限制某一条件达到控制输出的效果。

String、StringBuilder和StringBuffer

当使用 + 来连接两个字符串时,编译器会引入StringBuilder类,并调用其中的append()方法,最后调用toString()生成最后得到的字符串,多次对字符串进行 + 操作,会创建许多新的字符串,还会多次调用StringBuilder类。当要进行多次字符串 + 连接操作时,不妨先创建一个属于StringBuilder类的对象,多次直接调用append()方法,最后再toString()生成想要的字符串。用段代码比较两者效率 public static void main(String[] args){
String str1 = new String();
StringBuilder str2 = new StringBuilder();

long t1, t2, t3;

t1 = System.currentTimeMillis();

for(int i = 0;i < 100000;i++){
    str1 += "1";
}

t2 = System.currentTimeMillis();

for(int i = 0;i < 100000;i++){
    str2.append("1");
}

t3 = System.currentTimeMillis();

System.out.println(t2 - t1);
System.out.print(t3 - t2);

}

打印出的结果t2 – t1为1718,t3 – t2为16,使用append()方法时,i边界取1000、10000时t3 – t2还是0,到100000时才有了数字。综上,String用于单线程少量操作,StringBuiler用于单线程大量操作,StringBuffer用于多线程(了解的少,没用过,日后学到时补充)。

String类一些方法

1、 String(str) 创建与str字符串相同的字符串。
2、 charAt(index) 返回index位置上的字符
3、 compareTo(str) 返回整数,将原字符串与str按字典顺序比较,原字符串前,返回负数;相等,返回0;原字符串在后,返回整数。
4、 concat(str) 返回原字符串连接str 的新字符串。
5、 equals(str) 返回布尔类型值,判断原字符串和str是否相同。
6、 equalsIgnoreCase(str) 返回布尔类型值,忽略大小写,判断原字符串和str是否相同。
7、 length() 返回整数,为字符串长度。
8、 substring(start, end) 字符串切片,返回位于start 到 end-1 位置上的字符串。
9、 toLowerCase() 将原字符串大写变为小写返回。
10、 toUpperCase() 将原字符串小写变为大写返回。

ArrayList类

此类创建的对象与数组类似,但多了一些自己的方法:
ArrayList a = new ArrayList();
a.add(1);
System.out.println(a);
a.add(“1”);
System.out.println(a);
首先创建一个属于ArrayList类的对象,通过对象名.add()尾插,加入1,再加入字符串”1”,打印结果:第一次[1],第二次[1,1],虽说1和”1”两者数据类型不同,但打印外观是相同的。此时:
System.out.println(a.get(0) + 1); //认为加入第一个元素仍为整型,并对之加法操作。
结果报错,说Object类不能与int类型相加,这说明加入属于ArrayList类的对象后,元素会变成属于Object类的对象,ArrayList是一个Object类的数组。那么尝试强制转换类型输出:
System.out.println((int)a.get(0) + 1); //强转为int类,输出结果为2
get方法返回了指定位置上的元素,原属于ArrayList类的a没有发生改变。继续:
a.add(0, 2); //在指定位置插入,在0号索引处插入2元素
a.remove(0); //删除指定索引处的元素,其后的元素依次向前顺移
a.indexof(1); //返回指定对象首次出现的索引,返回值为int型
a.contains(1); //判断列表中是否含有括号内元素,返回布尔值
a.isEmpty(); //判空否,返回布尔值,空true
a.size(); //返回列表内元素数量

综上,由ArrayList类创建的列表对象是更加灵活的可变数组,可以通过调用方法快速实现增加、减少等操作。但是在某些情况下其效率会偏低,例如向很长的列表中间添加或删除元素,就会有很多元素需要移动,从而降低效率。

猜你喜欢

转载自blog.csdn.net/nellac/article/details/81809367