精华内容
下载资源
问答
  • 两个String,如果赋值同一个值,在内存中只有一个字符串存在,两个引用的地址相同。由此引出String的不变性。 String的不变性 string最为显著的一个特点就是它具有恒定不变性:我们一旦创建了一个string,在...

    两个String,如果赋值为同一个值,在内存中只有一个字符串存在,两个引用的地址相同。由此引出String的不变性。

    String的不变性

    string最为显著的一个特点就是它具有恒定不变性:我们一旦创建了一个string,在managed heap 上为他分配了一块连续的内存空间,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作(比如调用ToUpper获得大写格式的string)而返回的string,实际上另一个重新创建的string,其本身并不会产生任何变化。
    string 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。有的时候看来似乎修改了,实际是string经过了特殊处理,每次改变值时都会建立一个新的string对象,变量会指向这个新的对象,而原来的还是指向原来的对象,所以不会改变。这也是string效率低下的原因。

    String的不变,并非说string不能改变,而是其值不能改变。

    在例子中str1=“ab”,这时在内存中就将“ab”存下来,如果再创建字符串对象,其值也等于“ab”,str2=“ab”,则并非再重新分配内存空间,而是将之前保存的“ab”的地址赋给str2的引用,这就能印证例子2中的结果。而当str1="abc"其值发生改变时,这时检查内存,发现不存在此字符串,则重新分配内存空间,存储“abc”,并将其地址赋给str1,而str2依然指向“ab”的地址。可以印证例子1中的结果。

    结论:

    String是引用类型,只是编译器对其做了特殊处理(使其和基本数据类型一样)。

    展开全文
  • String为什么是final类型? 首先,先得清楚 final 这个关键字。 final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率。 final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡改...

    首先,先得清楚 final 这个关键字。
    final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率。
    final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡改的。
    了解了这一点,我们再看看问题:

    从设计安全上讲

    • 确保它们不会在子类中改变语义。String类是final类,这意味着不允许任何人定义String的子类。
      换言之,
      如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象。
    • String 一旦被创建是不能被修改的。类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。

    因为 java 设计者将 String 为可以共享的,下面这段是源码中的注释:

    /*
     * The {@code String} class represents character strings. All
     * string literals in Java programs, such as {@code "abc"}, are
     * implemented as instances of this class.
     * <p>
     * Strings are constant; their values cannot be changed after they
     * are created. String buffers support mutable strings.
     * Because String objects are immutable they can be shared. For example:
     *     String str = "abc";
     * is equivalent to:
     *     char data[] = {'a', 'b', 'c'};
     *     String str = new String(data);
     *
       对应翻译:
     * 字符串类表示字符串。所有
     * 在java程序中的字符串,如“ABC”,是
     * 实现为这个类的实例。
     *
     * 字符串是常量,它们的值在它们创建之后不能更改。
     * 支持可变字符串字符串缓冲区。
     * 因为字符串对象是不可改变的,它们可以共享。
     */
    

    从效率上讲

    • 设计成final,JVM才不用对相关方法在虚函数表中查询,而直接定位到String类的相关方法上,提高了执行效率。
    • Java设计者认为共享带来的效率更高,字符串常量池的出现实现共享,节约空间,提高效率。

    总而言之,就是要保证 java.lang.String 引用的对象一定是 java.lang.String的对象,而不是引用它的子孙类,这样才能保证它的效率和安全。

    native方法

    native方法:该方法的实现由非java语言实现
    String.class 类内部就一个native方法–intern()

    String类的属性

    • char value[]
      The value is used for character storage.
    • int hash
      Cache the hash code for the string

    为啥Hashmap的key经常是String类型

    因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。


    展开全文
  • 二、String是对象类型,把它当做方法形参进行值传递的时候,会拷贝其地址副本,我们在方法中对它进行修改为什么没有生效?使用StringBuffer表现出的结果为什么String不同? 如下是String的测试代码 如下是...

    一、我们都知道Java中只有值传递,所以String也一定是值传递。

    二、String是对象类型,把它当做方法形参进行值传递的时候,会拷贝其地址副本,我们在方法中对它进行修改为什么没有生效?使用StringBuffer表现出的结果为什么与String不同?

    1. 如下是String的测试代码
      在这里插入图片描述

    2. 如下是StringBuffer的测试代码
      在这里插入图片描述

    三、String源码解读

    1. 我们首先看看String的几段关键代码,首先它拥有4个成员变量。
      要点001: value[]是用来保存字符的,但是它被final修饰了。
      要点002: final修饰的成员变量仅在第一次初始化时被赋值,以后不可更改
      要点003: 由于final修饰的是数组,所以value[]的地址值不可能再发生变化。它里面存储的char值依然可以改变
      在这里插入图片描述
    2. 我们再看看String中的concat方法是如何执行的
      在这里插入图片描述
    3. 如果你能修改到String中的value[],我们采用反射的方式对value进行修改,这样外层的s1才会变化!
      在这里插入图片描述
    4. String的结论:String没有提供可以修改其成员变量value[]的API,所以我们把s1当做形参传入方法时,只要不人为改变它成员变量value[]的值,方法执行完之后对外层的s1不会产生任何影响!
    5. 注意:我们熟知的+运算符,在Java中只有String重写了这个运算符,它的底层走的是AbstractStringBuilder的append方法!与StringBuffer的append方法是一样的。

    四、StringBuffer源码解读

    1. 先看成员变量,它继承自AbstractStringBuilder
      在这里插入图片描述

    2. 再看看AbstractStringBuilder的成员变量有哪些
      在这里插入图片描述

    3. 然后看看关键的append方法,先执行ensureCapacityInternal,然后执行str.getChars 方法。
      在这里插入图片描述

    4. 我们先看ensureCapacityInternal方法,它又调用了Arrays.copyOf方法
      在这里插入图片描述

    5. 看看Arrays.copyOf 方法在干嘛
      在这里插入图片描述

    6. ensureCapacityInternal执行完之后,下一步就是执行str.getChars方法了
      在这里插入图片描述

    7. StringBuffer总结:value、count没有被final修饰,所以可以被更改。append方法就是修改了value以及count的值,所以把StringBuffer当做形参传入方法,执行changeStr后,外层的StringBuffer值也会受到影响!

    展开全文
  • 学习java有段时间了,今天复习回顾了之前学过的内容,在刚开始复习就发现了一个问题,string什么数据类型?倒不是这个问题有多难,但是好像突然就把我问蒙住了,后来仔细思考了一下,好像悟了哈哈 1、前言 首先...

    学习java有段时间了,今天复习回顾了之前学过的内容,在刚开始复习就发现了一个问题,string是什么数据类型?倒不是这个问题有多难,但是好像突然就把我问蒙住了,后来仔细思考了一下,好像悟了哈哈
    1、前言

    首先提出一个问题在 Java 中 String 属于那种数据类型?

    我的一个朋友是这么说的,「what?是不是有很多疑惑,int、double、String 不都是经常一起使用的么,应该都是同一种数据类型吧,基本数据类型?」

    大家认为呢?

    对于初学者而言可能没有对数据类型没有很强的意识,没有特别的注意到这里,都会认为 int、double、String 基本上都是经常使用的,都差不多,应该都属于基本数据类型。最后还会给自己打气(小声bb:恩是的没错!)。

    那到底是不是这样呢?哎,等一等莫着急,且继续往下看,真相只有一个,且听正文详叙。
    2、正文

    数据这个词我们并不陌生,互联网中无时无刻不产生数据,只不过数据展示到计算机显示器上的表现形式都各不相同;例如:数字、文字、音频、视频等都是属于数据。

    数据是一个抽象的概念,并且缺乏分类,不能表达明确事物的意义。

    而数据类型则是程序设计语言用来描述不同事物的,不同的程序设计语言对应的数据类型都有所相同(大致分类相同),也有所不同(关键字不同)。

    在 Java 中数据类型分为了内置数据类型和扩展数据类型两大类, 内置类型就是 Java 语言本身提供的基本数据类型,比如,整型数,浮点数,字符,布尔值等等。

    而扩展类型则是 Java 语言根据基本类型扩展出的其他类型,Java 要求所有的扩展类型都必须包括在类定义里面,这也是 Java 被叫做面向对象编程语言的原因。

    同时内置数据类型和扩展数据类型也会被称为基本数据类型和引用数据类型。
    在这里插入图片描述
    1个字节=8位
    byte: 1个字节,不考虑负数能表示范围是:0255,考虑正负表示范围:-128127
    short:2个字节,16位
    int: 4个字节,考虑正负:-21亿~+21亿
    long:8个字节

    float: 4个字节
    double:8个字节

    char字符型:2个字节,采用的是Unicode编码
    每个字符在编码表里面都对应一个int整数

    boolean: 只有true和false两种情况
    3、总结

    那么瞎 bb 了这么多,String 到底属于什么类型呢?

    String str1 = “looper”;
    String str2 = new String(“looper”);

    怎么基本数据类型和引用数据类型都涉及到了???

    总的来说 Java 中规定了 String 不属于基本数据类型,只是代表一个类,属于引用类型

    因为对象的默认值是 null,所以String的默认值也是 null。

    但是怎么 String 也可不用 new 的形式来创建对象呢?

    那是因为 Java 有字符串常量池机制

    所以不用 new 关键字创建对象时,会在常量池中创建对象。

    String 类也是一个比较特殊的类后边还会有详细的叙述。

    展开全文
  • Java中String是个什么类型Java中的八大数据类型String 是个什么类型String常见的方法 Java中的八大数据类型 面试官的套路 Java中的数据类型分为四类 1.整型 byte,short,int,long 2.符点型 float,double 3.字符型 ...
  • String是java中的基本数据类型

    千次阅读 2021-02-26 15:45:32
    1. 首先String不属于8种基本数据类型String是一个对象。因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。2.Java代码new String()和new String(“”)都是...
  • 参考java规范因为+左右有一个String类的对象,而另一边不是,所以会将那个不是string的对象转换为string然后再连接。具体转换规则参考最下面。Chapter 15. ExpressionsIf only one operand expression is of type ...
  • 根据:...当分配的值空时,是否可以检索引用类型的声明类型?具体来说,在使用反射的方法中,我希望该方法是无效的,并且对原始声明的类型进行操作(虽然我知道以下代码段不起作用),例如:String refere...
  • String类型转化double类型的问题

    千次阅读 2021-01-27 13:45:52
    这样一个较长的字符串怎么转为double类型的解决方案4doubleb=Double.parseDouble(a);2Stringa="37626615.73017";doubled=Double.parseDouble(a);BigDecimalbd=newBigDecimal(a);42楼的方法可行。题主你试试2doubleb...
  • 二、基本类型变量与引用类型变量的区别 1、基本类型变量 1、概念:基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值; 2、举例 //基本类型变量 int a=10; int b=20; 2、引用...
  • string 的后面加字符或字符串。(比+=, push_back 更灵活)(1)向string 的后面加C-stringbasic_string& append( const value_type* _Ptr );string s ( "Hello " ); // s=”Hello ”const char *c = "Out There ...
  • Python中的字符串被标识用引号引起来的一组连续字符。Python允许使用单引号或双引号对。可以使用切片运算符([]和[:])来获取字符串的子集,其中索引的起始位置字符串的开头0,末尾的索引-1。示例加号(+)是字符...
  • 在java中String...是什么意思

    千次阅读 2021-02-28 18:03:06
    展开全部1、首先String不属于8种基本数据类型String是一个对象。 因为对象的默e68a84e8a2ad62616964757a686964616f31333365653161认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象...
  • String类型变量的使用

    2021-01-16 22:22:04
    1、String属于引用数据类型,翻译字符串 2、声明String类型变量时,使用一对“ ” 注意:String型中“ ”双引号中可以不输入字符 但是char类型中必须只能放一个字符,多了少了都不可以 3、String可以使用八种基本...
  • 今天见到一道选择题有一选项基本数据类型String相加结果一定是字符串型,例如: 输出结果: 确实是这样,那么原理是什么呢? 在我们把一个基本数据类型和一个String类型相加的时候,编译器会将基本类型...
  • 引用类型主要有4种

    千次阅读 2021-03-14 22:16:49
    java中基本数据类型引用数据类型各有什么特点两者之间的关系 特点: 一、从概念方面来说 基本数据类型:变量名指向具体的数值引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值 二、从内存构建方面...
  • 1 String a="Hello JAVA";23 String b=a;45 System.out.println(a);67 System.out.println(b);89 System.out.println(a==b);1011 a="b";1213 System.out.println(a);1415 System.out.println(b);1617 System.out.pri...
  • JAVA基本数据类型: byte,short,int,long整型;float,double浮点型;char字符型;boolean 布尔类型 基本类型间的转换 存储范围小的类型到存储范围大的类型: 自动转换 byte → short(char) → int → ...
  • 答:是引用类型。 这里通过一个简单的样例进行说明: public static void main(String[] args) { int[] a = {1,2}; int[] b = a; a[0] = 10; System.out.println(b[0]); //输出10 } 可以看到,把数组a的第一个...
  • java中string类是什么

    2021-03-18 08:41:51
    java中String类的使用频率非常高,那让我们来看一下它到底是什么String是不可变对象java.lang.String类使用了final修饰,不能被继承。Java程序中的所有字面值,即双引号括起的字符串,如"abc",都是作为String类的...
  • 基本类型和引用类型 基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。 引用数据类型:指针存放在局部变量表中...
  • 以下是引用lyd8935在2006-8-9 23:37:42的发言:String str = "abc";StringBuffer sb = new StringBuffer( str );靠谱~~我去试试你们说的。thanks----------------解决方案-----------------------------------------...
  • 第一节 String类型的方法参数运行下面这段代码,其结果是什么?package com.test;public class Example {String str = new String("good");char[] ch = { 'a', 'b', 'c' };public static void main(String[] args) {...
  • 引用数据类型 Object Array Date Function …… TypeScript的数据类型 TypeScript的数据类型在ES6的基础上添加了以下数据类型 void any never 元组 枚举 高级类型 类型注解 相当于强类型语言中的类型声明,起...
  • 一、基本数据类型byte、short、int、long(整数类型)float、double(浮点数类型)char(字符型)boolean(布尔类型 )Java数据大多数存放在堆栈中。栈区:存放局部变量,对象声明的引用等。堆区:存放new关键字创建的类...
  • java 无法解析类型

    千次阅读 2021-02-28 17:22:22
    importjavax.swing.*;publicclassExample2_14{publicstaticvoidmain(String[]args){...Stringresult=(String)JOptionPane.showInputDialog(null,"请输入一个整数","输入对...import javax.swing.*;public class Ex...
  • a、可变性:String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。...b、线程安全性:String中的对象是不可变的,也就可以理解常量,线程安全。AbstractStringBuilder是Str...
  • Java中的数据类型分为基本数据类型引用数据类型。对于这两种数据类型,在进行赋值操作、方法传参或返回值时,会有值传递和引用(地址)传递的差别。浅拷贝(Shallow Copy):①对于数据类型是基本数据类型的成员变量,...
  • 文章目录1、作用2、保存步骤3、原理 / 内存泄漏3.1 数据结构3.2 设计原理3.3 value如何清理3.4 总结4、四种引用类型5、微信关注『方糖算法』 1、作用 ThreadLocal 在多线程环境中,安全的保存线程本地变量,同一...
  • 基本数据类型:Number、String、Boolean、Null、 Undefined、Symbol(ES6),这些类型可以直接操作保存在变量中的实际值。 引用数据类型:Object(在JS中除了基本数据类型以外的都是对象,数据是对象,函数是对象,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,079,413
精华内容 431,765
关键字:

为什么string是引用类型