Java 常用类总结(SE基础)

String是一个final类,代表不可变的字符序列。不可被继承。

String对象的字符内容是存储在一个字节数组byte[]中。JDK1.8中存储的是char[]注意区别。

String实现了Serializable接口,支持序列化

实现了Comparable接口,表示可以比较大小

通过字面量的方式(区别于new)给一个String赋值,此时的字符串值在字符串常量池中(和方法区在同一个地方)

当String进行连接操作、重新赋值、replace()等操作时,会重新指定内存区域赋值,不使用原有的value进行赋值

String str = "hello"; //字面量赋值 String s1 = new String();//本质上为,this.value = new byte[0] String s2 = new String(String str); //放一个String类型的参数 String s3 = new String(byte[] a); String s3 = new String(byte[] a,int off,int length);//构造方法,放char[]也是可以的

考虑如下代码:

String s1 = "javaEE"; String s2 = "javaEE"; String s3 = new String("javaEE"); String s4 = new String("javaEE");

这里,s1s2为true,s1s3, s1s4, s3s4均为false

原因如下:

Java 常用类总结(SE基础)

实际上,通过构造方法来构造String会指向value,而value再去指向字符串常量。

即String s3 = new String("javaEE");在内存中创建了两个对象:一个是堆中的value结构,一个是常量池中的字符串数据。

intern() 返回字符串对象的规范表示。 这里会返回一个字符串常量。内存空间在常量池中。

另外,有一个关于形参实参方面的需要注意:

public class StringTest { String str = new String("hello"); char[]ch = {'t','e','s','t'}; public void change(String str,char ch[]){ str = "hello,world"; ch[0]='b'; } public static void main(String[] args) { StringTest st = new StringTest(); st.change(st.str, st.ch); System.out.println(st.str); System.out.println(st.ch); } }

这里的结果为:"hello" /n "best"

类似于C语言中,根据指针进行交换两个指针中的内容,值传递过程中,实际参数的值传入形参,形成副本,方法结束后形参消失,实际参数值并没有改变。

另外还有一点需要注意:

String str = null; //这个指针指向null,并没有实例化 System.out.println(str);//输出”null“ System.out.println(str.length());//异常 1.2 String的常用方法

将String的常用方法总结如下(未总结的请自己查阅):

同时还需要注意的一些方法如下,重要程度依次降低,但仍需掌握:

注意:上表下部的4个int方法如果未找到,返回的均为-1

再举例一些方法(一些可能不太常用的):

String regex一般都用正则表达式表示

String转换为基本数据类型或包装类

调用包装类的静态方法:对应的类型,如要转int,调用Integer.parseInt(str)

基本数据类型、包装类转为String

调用String重载的valueOf(xxx)

另外

int num = 100; String str = num+""; //存在变量才会返回堆中,如果常量相加则会返回常量池

这样也可以转换为String,但是需要注意,该类型是在堆中生成了value数组,和new String的方式类似。

String与char[], byte[]的相互转换

String-->char[]:调用String.toCharArray即返回了一个char[]

char[]或byte[] --> String:直接调用构造器

String-->byte[]:调用String.getBytes即返回了一个byte[],使用默认的字符集(例如"gbk、utf-8"等)进行转换。

getBytes(Charset charset) 使用给定的charset将该String编码为字节序列,将结果存储到新的字节数组中。不同的编码方式返回的可能不同。

1.3 StringBuffer与StringBuilder

String与StringBuffer, StringBuilder之间的异同?

String:不可变的字符序列,注意理解不可变性

StringBuffer:可变的字符序列,线程安全,效率较低(都是同步方法)

StringBuilder:jdk5.0新增,可变的字符序列,线程不安全,效率高

final byte[] value //String中的 byte[] value //StringBuffer和StringBuilder中的 StringBuffer String str = new String();// new char[0] String str1 = new String("abc");//new char[] {'a','b','c'}; StringBuffer sb = new StringBuffer();//new char[16] 初始容量为16 sb.append('a');// value[0]='a';依次进行 StringBuffer sb1 = new StringBuffer("abc");//new char["abc".length()+16] System.out.println(sb.length()); //return的是count,每append操作count+=len,这里为1,并不是value.length

接下来看StringBuffer的扩容机制

简述:一般情况下,若容量不够的时候,扩充为原来容量的2倍+2,同时将原有数组的元素复制到新数组中

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxsj.html