String 字符串对象
String是什么
String字符串,是一种引用数据类型,并不是基础数据类型。
对于基础数据类型和引用数据类型的区别:
基础数据类型,在创建时直接将值存放在栈内存中。
引用数据类型,在创建时栈内存中存放一个引用,这个引用存放的是堆内存的位置,而堆内存中就是存放具体的值。
举例说明:
假如String对象是一个储物柜,在使用储物柜时(相当于新建一个String对象),
我们需要会得到一张记着储物柜的小票(小票相当于栈内存空间,小票上保存引用),
凭借这张小票就可以找到储物柜,然后拿到储物柜中存放的东西(储物柜相当于堆内存空间,可以根据引用去得到堆内存中的值)。
对于基础数据类型,则是直接将值写在小票上。
String的底层数据结构
String的底层实现是字符数组,这一点可以在源码中看到,
其中属性 private final char value[]; 就是用来存储String的值,
以下是String类的部分源码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[]; /** Cache the hash code for the string */
private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
String类被final修饰,则表示String类不可以被继承。
String类的value属性使用了 final 进行修饰,则表示value是一个常量,常量不可以更改。
String对象的重新赋值
String类的源码中可以看到String类的value属性使用了 final 进行修饰,既然是常量。
在发生对象需要重新赋值的时候,String的做法是,将String对象的栈内存与堆内存的引用断开。
再将栈内存中的引用指向新的堆内存空间。
本质上就是新建一个String对象。
由此可以引发一个问题,如果代码中频繁出现对String对象的重新赋值意味着会有大量的堆内存被弃用。
这部分被弃用的堆内存空间只能通过垃圾回收机制进行回收,这会降低内存的利用率。(浪费内存是一方面,另一方面垃圾回收也会耗费资源。此问题在面试中出现的概率比较高)
这个问题可以通过使用StringBuffer或者StringBuilder来解决(StringBuffer和StringBuilder会在接下来的文章进行介绍)。
以下是《Java开发实战经典》一书中的示例:

String对象的比较
比较方式分为两种(自定义比较方法除外):
a.双等号(==):双等号的判断依据是对象的堆内存地址是否相同。(用上面储物柜的例子就是同一个储物柜,当然放的是同样的东西)
b.使用方法equals(Object anObject):方法比较的是对象的取值。
String类中equals(Object anObject)方法源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //通过while循环比较字符数组中的值
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
以下是代码示例:
public class TestString {
public static void main(String[] args) {
String str1 = "a";
String str2 = "a";
String str3 = new String("a"); //使用new关键词创建String对象
String str4 = "b";
System.out.println("str1 == str2: "+(str1 == str2));
System.out.println("str1 equals str2: "+(str1.equals(str2)));
System.out.println("str1 == str3: "+(str1 == str3));
System.out.println("str1 equals str3: "+(str1.equals(str3)));
System.out.println("str1 == str4: "+(str1 == str4));
}
}
控制台结果:
str1 == str2: true
str1 equals str2: true
str1 == str3: false
str1 equals str3: true
str1 == str4: false
通过 str1 == str2: true 结果得出的结论:
String类在不使用new 关键词来新建对象时,如果str1 和 str2 的取值相同,
并不会为str1 和 str2 分别开辟堆内存空间,而是将str1 和 str2同时指向同一个堆内存,减少内存浪费。
String类常用方法
以下是《Java开发实战经典》一书中表格:

结语
纸上得来终觉浅,绝知此事要躬行。
String类中的内容很多,单构造方法就是十多种。
虽然内容多,但是难度都不高可能花看一个小视频的时间能看完。
这里对String类进行简单的介绍。
String 字符串对象的更多相关文章
- JS对象 String 字符串对象定义字符串的方法就是直接赋值。比如: var mystr = "I love JavaScript!"
String 字符串对象 在之前的学习中已经使用字符串对象了,定义字符串的方法就是直接赋值.比如: var mystr = "I love JavaScript!" 定义mystr ...
- Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法
首先来看一下C/C++中怎么创建Java对象:在JNIEnv中有两种方法是用来创建Java对象的: 第一种方法: jobject NewObject(jclass clazz , jmethodI ...
- 第七天:JS内置对象-String字符串对象
1.String对象 String对象用于处理已有的字符串 字符串可以使用双引号或单引号 String对象有一些常用的方法和属性,例如length 示例代码: <!DOCTYPE html&g ...
- js String字符串对象常见方法总结
String对象常用来保存文本形式的数据. 其转化方法有二种: String(s) new String(s) String对象方法有: charAt() charCodeAt() concat() ...
- JavaScript的内置对象(Date日期+string字符串)基础语法总结
1.Date日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 1)定义一个时间对象 : var Udate=new Date(); //注意:使用关键字new,Date()的首 ...
- javascript字符串对象
String字符串对象 1. 字符串粗体展示: var a = "陈冠希喜欢拍电影"; document.writeln(a.bold()+"<br/>& ...
- javascript中的字符串对象和数组对象
1.javascript的对象的概念 在javascript中,除了null和undefined以处,其他的数据类型都被定义成了对象 也可以用创建对象的方法定义变量,string,math,array ...
- javascript中的字符串对象
1.javascript的对象的概念 在javascript中,除了null和undefined以处,其他的数据类型都被定义成了对象 也可以用创建对象的方法定义变量,string,math,array ...
- JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象 String 对象用于处理已有的字符块. JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". ...
随机推荐
- DQL 数据查询语言 IS (information_schema)
3.information_schema 统计信息库 1.介绍: 视图 1.安全: 只允许查询,不知道操作的对象是谁. 2.方便: 只需要简单的select语句即可使用. 2.作用: 1.方便我们做数 ...
- Linux 一些常识命令
linux的性能优化: .CPU,MEM .DISK--RAID .网络相关的外设,网卡 linux系统性能分析: top:linux系统的负载,CPU,MEM,SWAP,占用CPU和内存比较的进程, ...
- ubuntu 搭建嵌入式开发环境tftp的方法
网上很多安装的时候都要安装tftpd-hpa tftp-hpa xinetd三个安装包,经我测试,xinetd无需安装,安装好前两个后,修改tftpd-hpa的配置文件即可:etc/default/t ...
- centos7部署汉化版gitlab
=============================================== 2018/6/5_第7次修改 ccb_warlock 更新说 ...
- winfrom创建转圈等待窗体
第一步:创建一个WaitForm public partial class WaitForm : Form { ; private ArrayList images = new ArrayList() ...
- ajax的两种应用方式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- css切角效果,折角效果
html <div class="one">12345</div> <div class="two">abcde</d ...
- [Err] 1701 - Cannot truncate a table referenced in a foreign key constraint
1.SET FOREIGN_KEY_CHECKS=0; 2.DELETE FROM ACT_RE_DEPLOYMENT where 1=1; 或者 truncate table ACT_RE_DEPL ...
- elasticsearch 父子文档(十一)
说明 需求 一个产品多个区域销售 每个区域有自己的价格, 方式1冗余行,a 产品分别在 area1 area2 area3区域销售 a产品就会生成3条产品数据 搜索id去重就行了,但是问题就是 聚合 ...
- Mysql的Event
Mysql的Event Event简介 Event是mysql中的一个事件,和触发器类似,触发器是在某条sql语句执行后可能会触发,而Event是每隔一段时间或某个特定的时间点执行,可以精确到秒. 准 ...