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 字符串对象的更多相关文章

  1. JS对象 String 字符串对象定义字符串的方法就是直接赋值。比如: var mystr = "I love JavaScript!"

    String 字符串对象 在之前的学习中已经使用字符串对象了,定义字符串的方法就是直接赋值.比如: var mystr = "I love JavaScript!" 定义mystr ...

  2. Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法

    首先来看一下C/C++中怎么创建Java对象:在JNIEnv中有两种方法是用来创建Java对象的: 第一种方法: jobject  NewObject(jclass clazz  , jmethodI ...

  3. 第七天:JS内置对象-String字符串对象

    1.String对象  String对象用于处理已有的字符串 字符串可以使用双引号或单引号 String对象有一些常用的方法和属性,例如length 示例代码: <!DOCTYPE html&g ...

  4. js String字符串对象常见方法总结

    String对象常用来保存文本形式的数据. 其转化方法有二种: String(s) new String(s) String对象方法有: charAt() charCodeAt() concat() ...

  5. JavaScript的内置对象(Date日期+string字符串)基础语法总结

    1.Date日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 1)定义一个时间对象 : var Udate=new Date(); //注意:使用关键字new,Date()的首 ...

  6. javascript字符串对象

    String字符串对象 1. 字符串粗体展示: var a = "陈冠希喜欢拍电影";   document.writeln(a.bold()+"<br/>& ...

  7. javascript中的字符串对象和数组对象

    1.javascript的对象的概念 在javascript中,除了null和undefined以处,其他的数据类型都被定义成了对象 也可以用创建对象的方法定义变量,string,math,array ...

  8. javascript中的字符串对象

    1.javascript的对象的概念 在javascript中,除了null和undefined以处,其他的数据类型都被定义成了对象 也可以用创建对象的方法定义变量,string,math,array ...

  9. JavaScript 字符串(String) 对象

    JavaScript 字符串(String) 对象 String 对象用于处理已有的字符块. JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". ...

随机推荐

  1. PHP面试 PHP基础知识 八(会话控制)

    ---恢复内容开始--- PHP会话控制技术 首先了解一下为什么要使用会话控制技术? 本身web 与服务器的交互是通过HTTP协议来实现的,而HTTP协议又是无状态协议.就是说明HTTP协议没有一个內 ...

  2. vbs 之 wscript

    https://www.jb51.net/article/20919.htm '''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' ...

  3. Kibana < 6.6.1 代码执行漏洞复现CVE-2019-7609

    登陆kibana poc .es(*).props(label.__proto__.env.AAAA='require("child_process").exec("ba ...

  4. python中函数的定义及调用

    python中函数的定义及使用方法 1.函数的概念:函数是将具有独立功能的代码块组织为一个整体,使其具有特殊功能的代码集; 2.函数的作用:使用函数可以加强代码的复用性,提高程序编写的效率; 3.函数 ...

  5. Mysql 查询视图出现The user specified as a definer ('root'@'%') does not exist的问题

    今天服务器Mysql版本在5.7升级到8.0+之后,部分网站(老的)访问视图出现The user specified as a definer ('root'@'%') does not exist问 ...

  6. unlocked - 非锁定的标准输入输出函数

    SYNOPSIS 总览 #include <stdio.h> int getc_unlocked(FILE *stream); int getchar_unlocked(void); in ...

  7. 搭建一个node.js项目

    初始化项目 新建一个文件夹,运行 npm init 初始化项目 mkdir okadaGo cd okadaGo npm init 按照提示输入一些项目的相关信息 D:\web\node>mkd ...

  8. AWS lambda DynamoDB api gateway之间的连接

    创建角色 附加策略 AmazonDynamoDBFullAccess AWSLambdaDynamoDBExecutionRole 创建DynamoDB表 在表的项目中创建内容 this pipi 打 ...

  9. day03 mysql外键 表的三种关系 单表查询 navicat

    day03 mysql navicat   一.完整性约束之     外键 foreign key     一个表(关联表: 是从表)设置了外键字段的值, 对应的是另一个表的一条记录(被关联表: 是主 ...

  10. ajax 工作原理

    Ajax的优缺点及工作原理? 定义和用法: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).Ajax 是一种用于创建快速动态网 ...