String 类
Java.lang.String类代表不可变的字符序列
String 类的常见构造方法:
String(String s)
String (char [] value)
两种创建方式:
1. String s1 = new String(“abc”);
2. String s2 = “abc”;
String s3 = “abc”;
这两种创建方式创建的两个对象 s1 和s2 的字面值相同,但是内存地址不相同。这是因为前者创建的时候在内存开辟空间同时还要在常量池(堆里的一块特殊区域)中创建一个对象,而后者在创建对象时只在常量池中创建对象,若再用这种方法创建一个s3,则先到常量池中看看有没有已存在的字面值,若有就直接用s3引用它而不是重新再开辟空间。
因此,在进行字符串比较时,如果用“==”来比较,则 s2和s3 的结果为true,而s1和s2 的结果为false
内存分配关系:
S3 S2 |
Abc |
栈 堆
上图是使用第二种方法创建对象时的内存分配情况
S2 S1 |
Abc |
Abc |
栈 堆
此图是使用第一种方法创建对象时的内存分配情况
举例说明不可变性:
S1
S1 1111 |
Abc
|
Bcd
|
String s1 = new String(“Abc”);
String s1 = new String (“Bcd”);
首先创建了一个String类型的变量并赋值为“Abc”,如果再执行一遍并为其赋值为“Bcd”,则结果是在内存中又开辟了一块名为s1的空间,用来存放“Bcd”,二不是将第一次创建的s1的值改为“Bcd”
只要用了new 这个关键字那么一定会在内存中重新开辟空间
字符串的连接
1.使用“+”进行连接
2.使用 public String concat(String str)进行连接,连接完成后必须用一个变量引用它才能使用。
例如: String s2 =“abc”; s2= s2.concat(“ef”);
这样 s2 的值变为abcdef ,如果只写s2.concat(“ef”),s2的值还是abc
字符串比较:
1. 使用“= =”进行比较,这种方法比较的是内存地址,即它判断的是存放在栈里的值,比较是否引用同一个对象,如果是返回true,否则返回false
2. 使用equals方法进行比较,这种方法比较的是堆里的值,即字面值,相等返回true,不等则返回false
String类的常用方法
通过查找API文档学会使用String类的各种方法
可以用valueof()将基本数据类型转换为字符串。
包装类
Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。
包装类均位于java.lang包,包装类和基本数据类型的对应关系如下表所示:
包装类对应表
基本数据类型 |
包装类 |
byte |
Byte |
boolean |
Boolean |
short |
Short |
char |
Character |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
包装类的实际使用(以Integer为例):
1. 实现int 和Integer 类之间的转换,具体方法如下:
Int n =10;
Integer in =new Integer(100);
//将int类型转换为Integer类型
Integer in1 = new Integer(n);
//将Integer类型的对象转换为int类型
Int m = in.intValue();
2. Integer 类内部的常用方法
Parselnt
public static int parseInt(String s)
该方法的作用是将数字字符串转换为int数值。在以后的界面编程中,将字符串转换为对应的int数字是一种比较常见的操作。使用示例如下:
String s = “123”;
int n = Integer.parseInt(s);
则int变量n的值是123,该方法实际上实现了字符串和int之间的转换,如果字符串都包含的不是都是数字字符,则程序执行将出现异常。
其他方法查找API
StringBuffer
代表可变的字符串序列
可以被修改 字符串拼接用append()方法
不懂,为什么在word里面画好的示意图在这里显示不出来呢?