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". ...
随机推荐
- hexo的next主题博客中加入分类页面的js,实现多级目录,并且能够点击展开,隐藏下级目录~(不知道算不算深度优化~~~)
个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 多级标题 在自己的xxxx.md文件中做如下修 ...
- 11、testng.xml文件解析
我们可以从以下几种方式调用testng 用testng.xml ant 命令行 我们本次重点介绍testng.xml,testng.xml 文件来配置测试用例的执行 ,testng.xml 文件可以很 ...
- \t \r \n转义字符
t \r \n都是转义字符,空格就是单纯的空格,输入时可以输入空格 \t 的意思是 横向跳到下一制表符位置 \r 的意思是 回车 \n 的意思是回车换行 所有的转义字符和所对应的意义: 转义字符 意义 ...
- C#内嵌Python架构实现
C#通过IronPython内嵌Python脚本,实现了对业务逻辑抽象及判断,适合在大量订单需要进行校验的场合使用. 比如,贷款时会对用户进行核查,核查过程可能存在多个节点,并且节点可能会随着政策而不 ...
- python调用tushare获取A股上市公司基础信息
接口:stock_company 描述:获取上市公司基础信息 积分:用户需要至少120积分才可以调取,具体请参阅最下方积分获取办法 注:tushare库下载和初始化教程,请查阅我之前的文章 输入参数 ...
- 骑马修栅栏 Riding the Fences
题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
- 第十一篇 session和cookie自动登录机制
session和cookie的作用和区别可以在网上查到,这里简单说下,我们使用的http协议本身是种无状态的协议,就是说web服务器接收到浏览器的请求,会直接返回相应内容,并不会检查是哪个浏览器,即浏 ...
- 2018年第九届蓝桥杯B组第四题:摔手机题解
摔手机 摔手机 动态规划 在蓝桥杯的时候遇到一次 当时没有做对 看了题解也没明白 如今再次遇到这个类似的题目 于是拿出来补补吧 摔手机题目如下: 星球的居民脾气不太好,但好在他们生气的时候唯一的 ...
- c# 使用NOPI 操作Excel
最近项目需要导出Excel,找来找去,微软有自己的Excel组件 using Microsoft.Office.Core;using Microsoft.Office.Interop.Excel;,但 ...
- Use on Git
Preface The document is about to introduce some specialties on PLM development and mainte ...