精华内容
下载资源
问答
  • 引用类型的存储原理:引用类型继承于Object类(也引用类型)都...区别:基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型分配在堆上的(需要java中的栈、堆概念),那Java中字符串stri...

    引用类型的存储原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的;

    ae4cd50673107ddcef6efcb7757bf56c.png

    区别:基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的(需要java中的栈、堆概念),

    那Java中字符串string属于什么数据类型?

    Java中的字符串String属于引用数据类型。因为String是一个类。

    注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(详看笔记部分解析)。

    String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:public class StringDemo{

    public static void main(String args[]){

    char[] helloArray = { 'r', 'u', 'n', 'o', 'o', 'b'};

    String helloString = new String(helloArray);

    System.out.println( helloString );

    }

    }

    以上实例编译运行结果如下:runoob

    创建字符串对象两种方式的区别

    直接赋值方式创建对象是在方法区的常量池String str="hello";//直接赋值的方式

    通过构造方法创建字符串对象是在堆内存String str=new String("hello");//实例化的方式

    展开全文
  • Java一种“纯粹”的面向对象程序设计语言,为什么这里“纯粹”需要加引号呢?因为Java中数据类型除了对象这种引用类型,还有另一种特例:基本类型。Java数据类型引用类型在Java中,引用类型的变量非常类似于C/C++...

    前言

    在Java世界里,有这么一句话:“一切都是对象”,Java语言假设我们只进行面向对象的程序设计。Java是一种“纯粹”的面向对象程序设计语言,为什么这里“纯粹”需要加引号呢?因为Java中数据类型除了对象这种引用类型,还有另一种特例:基本类型。

    Java数据类型

    7dcee8475ba3256b9806a66f65f8fe25.png

    引用类型

    在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如String,Date 等。变量一旦声明后,类型就不能被改变了。对象、数组都是引用数据类型。所有引用类型的默认值都是null。

    什么是对象?对象是类的一个实例,有状态和行为。类可以看成是创建Java对象的模板。

    对象如何产生呢?使用关键字new来创建一个新的对象。

    String s = new String("hello world!");

    其中s是一个引用,指向Java中一个String类型内容为“hello world”的对象。引用不是对象,引用是用来操作对象的。对于String类型,有一个特殊点:

    String s = "hello world";

    上述操作也没有问题,也许有人觉得,既然String可以这样来创建,那么它是不是一个基本类型呢?不是。String可以这样操作,是因为String实在是太常用了,Java对String做了一些优化。

    基本类型

    Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。基本类型不用new来创建变量,基本类型的变量直接存储“值”,并置于堆栈(区别于对象是存储在中)中,因此使用基本类型要比引用类型更加高效。

    byte:

    • byte 数据类型是8位、有符号的,以二进制补码表示的整数;
    • 最小值是 -128(-2^7)
    • 最大值是 127(2^7-1)
    • 默认值是 0
    • byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
    • 例子:byte a = 100,byte b = -50。

    short:

    • short 数据类型是 16 位、有符号的以二进制补码表示的整数
    • 最小值是 -32768(-2^15)
    • 最大值是 32767(2^15 - 1)
    • Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
    • 默认值是 0
    • 例子:short s = 1000,short r = -20000。

    int:

    • int 数据类型是32位、有符号的以二进制补码表示的整数;
    • 最小值是 -2,147,483,648(-2^31)
    • 最大值是 2,147,483,647(2^31 - 1)
    • 一般地整型变量默认为 int 类型;
    • 默认值是 0
    • 例子:int a = 100000, int b = -200000。

    long:

    • long 数据类型是 64 位、有符号的以二进制补码表示的整数;
    • 最小值是 -9,223,372,036,854,775,808(-2^63)
    • 最大值是 9,223,372,036,854,775,807(2^63 -1)
    • 这种类型主要使用在需要比较大整数的系统上;
    • 默认值是 0L
    • 例子: long a = 100000L,Long b = -200000L。
    • "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。

    float:

    • float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
    • float 在储存大型浮点数组的时候可节省内存空间;
    • 默认值是 0.0f
    • 浮点数不能用来表示精确的值,如货币;
    • 例子:float f1 = 234.5f。

    double:

    • double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
    • 浮点数的默认类型为double类型;
    • double类型同样不能表示精确的值,如货币;
    • 默认值是 0.0d
    • 例子:double d1 = 123.4。

    boolean:

    • boolean数据类型表示一位的信息;
    • 只有两个取值:true 和 false;
    • 这种类型只作为一种标志来记录 true/false 情况;
    • 默认值是 false
    • 例子:boolean one = true。

    char:

    • char类型是一个单一的 16 位 Unicode 字符;
    • 最小值是
    展开全文
  • 1、String是引用类型;String是final的类,是不可以被继承的。...引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆...

    1、String是引用类型;String是final的类,是不可以被继承的。

    675748b81be2ead1bc28f88029a30896.png

    String

    2、基本类型只有8种:byte,short,int,long,float,double,char,boolean。

    3、基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上。

    引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。

    不论是基本数据类型还是引用类型,他们都会先在栈中分配一块内存,对于基本类型来说,这块区域包含的是基本类型的内容;而对于对象类型来说,这块区域包含的是指向真正内容的指针,真正的内容被手动的分配在堆上。

    4、栈区内存由系统自动分配,函数结束时释放;堆区内存由程序员自己申请,并指明大小,用户忘释放时,会造成内存泄露,不过进程结束时会由系统回收。

    5、final是Java的关键字

    5.1、防止任何继承类改变它的本来含义

    5.2、提高效率,会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。

    常规代码插入方法:将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理。

    6、如果说整个类都是final(在它的定义前冠以final关键字),就表明自己不希望从这个类继承,或者不允许其他任何人采取这种操作。总而言之,我们的类肯定不需要进行任何改变;或者出于安全方面的理由,我们不希望进行子类化(子类处理)。

    7、继承String本身是一个错误的行为,对String类型最好的重用方式是关联关系(has-a)和依赖关系(use-a)而不是继承关系(is-a)

    展开全文
  • 作者:逸游Java来源:...---《Thinking in Java》提到Java中的String,总是有说不完的知识点,它对于刚接触Java的人来说,有太多太多的值得研究的东西了,可是为...

    d1a39d9dc66f8e1d476be0d29c96d657.png

    作者:逸游Java 

    来源:

    https://www.cnblogs.com/dengchengchao/p/9713859.html

    可以证明,字符串操作是计算机程序设计中最常见的行为,尤其是在Java大展拳脚的Web系统中更是如此。

    ---《Thinking in Java》

    提到Java中的String,总是有说不完的知识点,它对于刚接触Java的人来说,有太多太多的值得研究的东西了,可是为什么Java中的String这么独特呢?今天我们来一探究竟。

    基本数据类型

    众所周知Java有八大基本数据类型,那么基本数据类型与对象有什么异同呢?

    • 基本数据类型不是对象
    • 基本数据类型能直接存储变量对应的值在堆栈中,存取更加高效
    • 使用方便,不用new创建,每次表示都不用新建一个对象

    字面量与赋值

    什么叫字面值呢?考虑下面代码:

    int a=3;double d=3.32;long l=102322332245L;

    其中,3、3.32、102322332245L便叫做字面值。3默认是int类型,3.32默认是double类型,102322332245默认也是int类型,所以必须加一个L来将它修改为long类型,否则编译器就会报错,字面量可以直接在计算机中表示。

    基本数据类型便可以直接通过字面值进行赋值

    String与基本数据类型

    话说了这么多,这和String有什么关系呢?正如本文最开始所说,因为Java需要常常与字符串打交道,因此Java的设计者想要将String类型在使用上性能上尽量像基本数据类型一样。也就是

    int i=0;String str="test";

    那么问题来了,基本数据类型之所以叫基本数据类型,是因为这种类型可以直接在计算机中直接被表示,比如int i=0;中,0作为字面值是可以直接被表示出来"0x00",而test作为字符串如何直接被表示呢?

    常量池

    JVM的解决方案便是Class文件常量池。Class常量池中主要用于存放两大类常量: 字面量符号引用量,其中字面量便包括了文本字符串。

    也就是当我们在类中写下String str="test"的时候,Class文件中,就会出现test这个字面量。

    String类型的特殊性在于它只需要一个utf8表示的内容即可。这样便解决了String直接赋值的问题,只要在JVM中,将str与test字面量对应起来即可。

    也就是类似

    int a=0;String str="test"

    但是,问题就真的这么简单么?

    可别忘了,String也是一个对象,它也同时拥有所有一个对象应该拥有的特点,也就说

    String str="test"

    其中test字面量不仅仅需要表示str指向的内容是test,它还应该将str指向一个对象,支持类似str.length(),str.replace()等一切对象访问的操作。

    test的内容写在Class文件中仅仅解决的是如果赋值的问题,那String对象是如何在内存中存在呢?

    String创建过程

    打开java.lang.String文件,可以看到String拥有不可变对象的所有特点,final修饰的类,final修饰的成员变量,因此任何看似对String内容进行操作的方法,实际上都是返回了一个新的String对象,这就造就了一个String对象的被创建后,就一直会保持不变。

    正因为String这样的特点,我们可以建立一个对String的对象的缓存池:String Pool,用来缓存所有第一次出现的String对象。

    JVM规范中只要求了String Pool,但并没有要求如何实现,在Hot Spot JVM中,是通过类似一个HashSet实现,里面存储是当前已存储的String对象的引用

    String str="test";

    首先虚拟机会在String Pool中查找是否有equals("test")String 引用,如果有,就把字符串常量池里面对"test"对象的引用赋值给str。如果不存在,就在中新建一个"test"对象,并将引用驻留在字符串常量池(String Pool)中,同时将该引用复制给str

    可以看到,Java在这里是使用的String缓存对象来解决“字面值”性能这个问题的。也就是说,"test"所对应的字面值其实是一个在字符串常量池的String对象这样做只要出现过一次的String对象,第二次就不再会被创建,节约了很大一笔开销,便解决了String类似基本数据类型的性能问题。

    深入理解String

    明白了String的前因后果,现在来梳理关于String的细节问题。

    String str="test"

    包含了3个“值”:

    • "test"字面量,表示String对象所存储的内容,编译后存放在Class字节码中,运行时存放在Class对象中,而Class对象存储在JVM的方法区中
    • test对象,存储在堆中
    • test对象对应的引用,存储在String Pool中。

    如图所示:

    f56564d0ba0e244a15c1192a14ffb91d.png

    其中一定注意str所指向的对象是存放在堆中的,网上大多数说的不明白,更有误导String Pool中存储的是对象的说法。Java 对象,排除逃逸分析的优化,所有对象都是存储在堆中的。

    String Pool位于JVM 的None Heap中,并且String Pool中的引用持有对堆中对应String对象的引用,因此不必担心堆中的String对象是被GC回收。

    网上很多文章还会说test字面值是存在Perm Gen中,但是这样并不准确,永生代(“Perm Gen”)只是Sun JDK的一个实现细节而已,Java语言规范和Java虚拟机规范都没有规定必须有“Permanent Generation”这么一块空间,甚至没规定要用什么GC算法——不用分代式GC算法哪儿来的“永生代”? HotSpot的PermGen是用来实现Java虚拟机规范中的“方法区”(method area)的。

    前面说过,Java想将String向基本数据类型靠近,还能体现在对final String对象的处理,对于final String,如果使用仅仅是字面值的作用,而并没有涉及到对象操作的话(使用对象访问操作符"."),编译器会直接将对应的值替换为相应字面值。举例:

    对于

    final String str="hello";String helloWorld=str+"world";

    编译器会直接优化:

    String helloWorld="helloworld";

    对于

    final String str="hello";String hello=String.valueOf(str);

    编译器会直接优化

    String hello=String.valueOf("hello");

    如果没有编译器的优化,就会涉及到操作数压栈出栈等操作,但是经过优化后的String,可以发现并不会有astore/aload等指令的出现.

    new String()其实new String没什么好说的,new String()表示将String完全作为一个对象来看,放弃它的基本数据类型性质,也与String Pool没有任何关系,但是String包含的intern()方法能将它与String Pool关联起来。
    • jdk 1.7之前,intern()表示若String Pool中不存在该字符串,则 在堆中新建一个与调用intern()对象的字面值相同的对象,并在String Pool中保存该对象的引用,同时返回该对象,若存在则直接返回。
    • jdk 1.7及1.7 之后,intern()表示将调用intern()对象的引用直接复制一份到String Pool中。
    网上很多讨论涉及到几个对象
    String str=new String("hello world");
    下面图解分析:

    e47a68bb460ed31412c8f44779a26e9a.png

    需要明白的一点的是new String("hello world")并不是一个原子操作,可以将其分为两步,每个关键字负责不同的工作其中new负责生成对象,String("hello world")负责初始化new生成的对象。
    • 首先,执行new操作,在中分配空间,并生成一个String对象。
    • 其次,将new生成的对象的引用传递给String("hello world")方法进行初始化,而此时参数中出现了"hello world"字面量,JVM会先在字符串常量池里面检查是否有equals("hello world")的引用,如果没有,就在中创建相应的对象,并生成一个引用指向这个对象,并将此引用存储在字符串常量池中。
    • 再次,复制常量池hello world指向的字面量对象传递给new String("hello world")进行初始化。
    第二点中提到了复制,其实最主要的就是复制String对象中value所指向的地址,也就是将方法区中的"hello world"的索引复制给新的对象,这也是为什么上图中,两个对象都指向方法区中同一个位置下面的String str=new String("hello world")进行反编译的结果:
           0: new           #2
    3: dup
    4: ldc #3
    6: invokespecial #4
    9: astore_1
    10: return
    大概的指令应该都能看到,解释一下:
    • new 执行new 操作,在堆中分配内存
    • dup 将new 操作生成的对象压栈
    • ldc 将String型常量值从常量池中推送至栈顶
    • invokespecial 调用new String()并传入new 出来的对象了ldc的String值
    ldc指令是什么东西?简单地说,它用于将int、float或String型常量值从常量池中推送至栈顶,在这里也能看到,JVM是将String和八大基本数据类型统一处理的。ldc 还隐藏了一个操作:也就是"hello world"的resolve操作,也就是检测“hello world”是否已经在常量池中存在的操作。传送门详见:Java 中new String("字面量") 中 "字面量" 是何时进入字符串常量池的?有个很神奇的坑,《深入理解JVM》中曾经提到过这个问题,不过周志明老师是拿的"java"作为举例:代码如下(jdk 1.7)
    public class RuntimeConstantPoolOOM {    public static void main(String[] args) {        String str1 = new StringBuilder("计算机").append("软件").toString();        System.out.println(str1.intern() == str1);        String str2 = new StringBuilder("ja").append("va").toString();        System.out.println(str2.intern() == str2);    }}
    结果
    true
    false
    不明白为什么"java"字符串会在执行StringBuilder.toString()之前出现过?其实是因为:Java 标准库在JVM启动的时候加载的某些类已经包含了java字面量。方法区上面图中说了,“hello wold”对象的value的值是放在方法区中的。如何证明呢?这里我们可以使用反射来干一些坏事。虽然String类是一个不可变对象,对外并没有提供如何修改value的方法,但是反射可以。
    String str1=new String("abcd");        String str2="abcd";        String str3="abcd";        Field valueField = String.class.getDeclaredField("value");        valueField.setAccessible(true);        char[] value = (char[]) valueField.get(str2);        value[0] = '0';        value[1] = '1';        value[2] = '2';        value[3] = '3';        System.out.println(str1);        System.out.println(str2);        System.out.println(str3);        String str4="abcd";        System.out.println(str4);        System.out.println("abcd");
    可以试一试,输出结果都是0123,因为在编译的时候生成Class对象的时候,str1,str2,str3,str4都是指向的Class文件中同一个位置,而在运行的时候这个Class对象的值被修改后,所有和abcd有关的对象的value都会被改变。相信理解了这一个例子的同学,能够对String有一个更加深刻的理解检验说了这么多,你真的懂了么?来看看经常出现的一些关于String的问题:
    String str1 = new StringBuilder("Hel").append("lo").toString();System.out.println(str1.intern() == str1);String str = "Hello";System.out.println(str == str1);
    String str1="hello";String str2=new String("hello");System.out.println(str2 == str1);
    final String str1="hell";String str2="hello";String str3=str1+"o";System.out.println(str2 == str3);
    String str1="hell";String str2="hello";String str3=str1+"o";System.out.println(str2 == str3);
    参考文章:《深入理解JVM》 第二版java用这样的方式生成字符串:String str = "Hello",到底有没有在堆中创建对象?R大:请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧Java 中new String("字面量") 中 "字面量" 是何时进入字符串常量池的?有道无术,术可成;有术无道,止于术欢迎大家关注Java之道公众号1625822d8d3e58491a7b8c76e8b52b82.png好文章,我在看❤️
    展开全文
  • 一、Python中的数据类型整数, 如 1 -100长整数, 比较大的整数,Python 2里面有long长整数;Python 3里面没有浮点数 如 1.23、3E-2布尔类型 False True二、Number(数字)类型三种:int整型2)Float 浮点型,默认保留...
  • Python中的字符串被标识为用引号引起来的一组连续字符。Python允许使用单引号或双引号对...示例加号(+)字符串连接运算符,星号(*)重复运算符。例如-#!/usr/bin/pythonstr='HelloWorld!'printstr#Printscompletes...
  • 一、泛型的概念先回顾下集合和数组的区别:数组长度固定不变,可以存放任意数据类型,但存放的数据类型要一致。集合长度可变,可以存放任意引用数据类型,但存储的数据类型可以不一致。也就是说一个集...
  • 是不是有很多疑惑,int、double、String 不都经常一起使用的么,应该都同一种数据类型吧,基本数据类型?」大家认为呢?「老公你快说句话啊!」对于初学者而言可能没有对数据类型没有很强的意识,没有特别的注意...
  • 是不是有很多疑惑,int、double、String 不都经常一起使用的么,应该都同一种数据类型吧,基本数据类型?」 大家认为呢?「老公你快说句话啊!」 对于初学者而言可能没有对数据类型没有很强的意识,没有特别的...
  • 是不是有很多疑惑,int、double、String 不都经常一起使用的么,应该都同一种数据类型吧,基本数据类型?」大家认为呢?「老公你快说句话啊!」对于初学者而言可能没有对数据类型没有很强的意识,没有特别的注意...
  • java 中String 个对象,引用类型 ,基础类型与引用类型的区别,基础类型只表示简单的字符或数字,引用类型可以任何复杂的数据结构 ,基本类型仅表示简单的数据类型,引用类型可以表示复杂的数据类型,还可以...
  • Java中字符串string属于什么数据类型

    万次阅读 多人点赞 2018-07-19 10:21:51
    1)基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本数据类型直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面八种数据类型是这种存储模型; 2)引用...
  • 是不是有很多疑惑,int、double、String 不都经常一起使用的么,应该都同一种数据类型吧,基本数据类型?」大家认为呢?「老公你快说句话啊!」对于初学者而言可能没有对数据类型没有很强的意识,没有特别的注意...
  • 是不是有很多疑惑,int、double、String 不都经常一起使用的么,应该都同一种数据类型吧,基本数据类型?」大家认为呢?「老公你快说句话啊!」对于初学者而言可能没有对数据类型没有很强的意识,没有特别的注意...
  • 2.问题描述:Java中字符串string属于什么数据类型? 3.问题解答: (1)首先给出数据类型的分类 (2)Java数据类型在内存中的存储: 1)基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,...
  • java 中String 个对象,引用类型 ,基础类型与引用类型的区别,基础类型只表示简单的字符或数字,引用类型可以任何复杂的数据结构 ,基本类型仅表示简单的数据类型,引用类型可以表示复杂的数据类型,还...
  • 传入数据类型是List<String> 数据库的字段类型应该是什么 数据库是SQL server
  • 一、数据类型基础3.1什么是数据类型数据类型是一组性质相同的值的集合以及定义在这个值集合上的一组操作的总称(集合指具有某种特定性质的具体的或抽象的对象汇总而成的集体。)3.2数据类型的分类?一、基本数据...
  • 问题描述:Java中字符串string属于什么数据类型? 3.问题解答: (1)首先给出数据类型的分类 (2)Java数据类型在内存中的存储: 1)基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本...
  • 展开全部Java中String是一个特殊的包装类数据,有两种创建形式:62616964757a686964616fe58685e5aeb931333363373039String s = "abc";String s = new String("abc");第一种先在栈中创建一个对String类的对象引用变量s...
  • Java中除了基本数据类型以外,有时候也需要把这些基本数据类型当做...首先int是基本数据类型,而String是引用数据类型,两者从本质上来说,一个是类(对象),一个是数据,自然不能强转。1:先看int转String。int是...
  • 在c#中分为值类型和引用类型,值类型为int ,float ,bool ,char ,struct等简单数据类型,引用类型有stirng,class。 然而string的身为引用类型却表现得与值类型十分相同。为什么string为引用类型呢?首先明白string...
  • 一、在JAVA中一共有八种基本数据类型,他们分别 byte、short、int、long、float、double、char、boolean整型 color=gray 其中byte、short、int、long都表示整数的,只不过他们的取值范围不一样 byte的取值...
  • 二者之间有什么区别?两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都缓冲区中的那一个。NewString每写一遍,就创建一个新的对象,后一句用那个常量”xyz”对象的...
  • JS数据类型转换好学吗?Web前端人才要掌握什么?JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的... JavaScript数据类型 Number:指的数字,可以为整型,也可以浮点数。 str...
  • ①总体而言,Java中的数据类型分为两大类,即原始类型的对象类型(或叫引用类型),后者指由类生成的对象的类型,我们将在下一节详解;Java中的原始类型有如下8种,如表所示。 类型 称呼 值域 表示范围 byte...
  • string和text之间的区别是什么? 从一般的经验上讲: :string 被用于短文本输入(用户名,电子邮件,密码,标题等)。 :text 被用于预计文本长度较长的文本输入(描述,评论内容等)。
  • String和Number 是GEE中最基本的数据类型1 String 注意在给变量赋值的时候,不仅关注值是什么,还要关注值是什么格式//创建一个String变量 ee.String( )告诉GEE这是一个文本,并且具体的文本内容在括号内。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,851
精华内容 3,140
关键字:

string是什么数据类型