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. hexo的next主题博客中加入分类页面的js,实现多级目录,并且能够点击展开,隐藏下级目录~(不知道算不算深度优化~~~)

    个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 多级标题 在自己的xxxx.md文件中做如下修 ...

  2. 11、testng.xml文件解析

    我们可以从以下几种方式调用testng 用testng.xml ant 命令行 我们本次重点介绍testng.xml,testng.xml 文件来配置测试用例的执行 ,testng.xml 文件可以很 ...

  3. \t \r \n转义字符

    t \r \n都是转义字符,空格就是单纯的空格,输入时可以输入空格 \t 的意思是 横向跳到下一制表符位置 \r 的意思是 回车 \n 的意思是回车换行 所有的转义字符和所对应的意义: 转义字符 意义 ...

  4. C#内嵌Python架构实现

    C#通过IronPython内嵌Python脚本,实现了对业务逻辑抽象及判断,适合在大量订单需要进行校验的场合使用. 比如,贷款时会对用户进行核查,核查过程可能存在多个节点,并且节点可能会随着政策而不 ...

  5. python调用tushare获取A股上市公司基础信息

    接口:stock_company 描述:获取上市公司基础信息 积分:用户需要至少120积分才可以调取,具体请参阅最下方积分获取办法 注:tushare库下载和初始化教程,请查阅我之前的文章 输入参数 ...

  6. 骑马修栅栏 Riding the Fences

    题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...

  7. 第十一篇 session和cookie自动登录机制

    session和cookie的作用和区别可以在网上查到,这里简单说下,我们使用的http协议本身是种无状态的协议,就是说web服务器接收到浏览器的请求,会直接返回相应内容,并不会检查是哪个浏览器,即浏 ...

  8. 2018年第九届蓝桥杯B组第四题:摔手机题解

    摔手机 摔手机 动态规划  在蓝桥杯的时候遇到一次 当时没有做对  看了题解也没明白  如今再次遇到这个类似的题目 于是拿出来补补吧 摔手机题目如下: 星球的居民脾气不太好,但好在他们生气的时候唯一的 ...

  9. c# 使用NOPI 操作Excel

    最近项目需要导出Excel,找来找去,微软有自己的Excel组件 using Microsoft.Office.Core;using Microsoft.Office.Interop.Excel;,但 ...

  10. Use on Git

    Preface            The document is about to introduce some specialties on PLM development and mainte ...