广告
返回顶部
首页 > 资讯 > 精选 >java String的深入理解
  • 623
分享到

java String的深入理解

javastringava 2023-05-31 03:05:49 623人浏览 薄情痞子
摘要

java String的深入理解一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。     JVM主要管理两种类型内存

java String的深入理解

一、Java内存模型 

按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。    

JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在 Java 虚拟机启动时创建,非堆内存(Non-heap Memory)是在JVM堆之外的内存。

简单来说,非堆包含方法区、JVM内部处理或优化所需的内存(如 JITCompiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码。     

Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、 anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。

堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。   

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和对象句柄(引用)。     

虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集合,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。   

对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。在程序执行的时候,常量池会储存在Method Area,而不是堆中。常量池中保存着很多String对象; 并且可以被共享使用,因此它提高了效率 

二、案例解析

public static void main(String[] args) {          String s1 = "abc";       //↑ 在字符串池创建了一个对象     String s2 = "abc";       //↑ 字符串pool已经存在对象“abc”(共享),所以创建0个对象,累计创建一个对象     System.out.println("s1 == s2 : "+(s1==s2));      //↑ true 指向同一个对象,     System.out.println("s1.equals(s2) : " + (s1.equals(s2)));      //↑ true 值相等     //↑------------------------------------------------------over          String s3 = new String("abc");     //↑ 创建了两个对象,一个存放在字符串池中,一个存在与堆区中;     //↑ 还有一个对象引用s3存放在栈中     String s4 = new String("abc");     //↑ 字符串池中已经存在“abc”对象,所以只在堆中创建了一个对象     System.out.println("s3 == s4 : "+(s3==s4));     //↑false  s3和s4栈区的地址不同,指向堆区的不同地址;     System.out.println("s3.equals(s4) : "+(s3.equals(s4)));     //↑true s3和s4的值相同     System.out.println("s1 == s3 : "+(s1==s3));     //↑false 存放的地区多不同,一个栈区,一个堆区     System.out.println("s1.equals(s3) : "+(s1.equals(s3)));     //↑true 值相同     //↑------------------------------------------------------over          String str1 = "ab" + "cd"; //1个对象     String str11 = "abcd";      System.out.println("str1 = str11 : "+ (str1 == str11));     //↑------------------------------------------------------over          String str2 = "ab"; //1个对象     String str3 = "cd"; //1个对象                         String str4 = str2+str3;                        String str5 = "abcd";      System.out.println("str4 = str5 : " + (str4==str5)); // false     //↑------------------------------------------------------over          String str6 = "b";     String str7 = "a" + str6;     String str67 = "ab";     System.out.println("str7 = str67 : "+ (str7 == str67));     //↑str6为变量,在运行期才会被解析。     final String str8 = "b";     String str9 = "a" + str8;     String str89 = "ab";     System.out.println("str9 = str89 : "+ (str9 == str89));     //↑str8为常量变量,编译期会被优化     //↑------------------------------------------------------over   }

--结束END--

本文标题: java String的深入理解

本文链接: https://www.lsjlt.com/news/223198.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java String的深入理解
    java String的深入理解一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。     JVM主要管理两种类型内存...
    99+
    2023-05-31
    java string ava
  • 深入理解Java new String()方法
    问题一:这段代码创建了几个对象? String str1 = new String("aa"); 答案是两个 “aa”对象和String对象 其中有一项是常量池 常量池在Cla...
    99+
    2022-11-12
  • 深入了解java中的string对象
    这里来对Java中的String对象做一个稍微深入的了解。Java对象实现的演进String对象是Java中使用最频繁的对象之一,所以Java开发者们也在不断地对String对象的实现进行优化,以便提升String对象的性能。(推荐学习:J...
    99+
    2019-07-17
    java教程 java string
  • 深入了解Java核心类库--String类
    目录一、 简介零碎知识点字符串常量池堆在逻辑上的划分二、 创建对象2.1.1 直接引用常量区2.1.2 使用构造方法2.1.3 两种实例化方法的区别三、常用方法总结一、 简介 零碎知...
    99+
    2022-11-12
  • 深入浅析Java中的String类
    这期内容当中小编将会给大家带来有关深入浅析Java中的String类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。引题在Java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时...
    99+
    2023-05-31
    java string ava
  • 深入理解Java中的HashMap
    目录一、HashMap的结构图示二、HashMap的成员变量以及含义2.1、hash方法说明2.2、tableSizeFor方法说明三、HashMap的构造方法四、HashMap元素...
    99+
    2022-11-12
  • 深入string理解Golang是怎样实现的
    目录引言内容介绍字符串数据结构字符串会分配到内存中的哪块区域编译期即可确定的字符串如果我们创建两个hello world字符串, 他们会放到同一内存区域吗运行时通过+拼接的字符串会放...
    99+
    2023-05-17
    Golang string实现 Golang string
  • Java IO流深入理解
    目录阻塞(Block)和非阻塞(Non-Block)同步(Synchronization)和异步(Asynchronous)BIO与NIO对比面向流与面向缓冲阻塞与非阻塞选择器的问世...
    99+
    2022-11-12
  • java中String的一些常见方法深入解析
    这篇文章主要介绍“java中String的一些常见方法深入解析”,在日常操作中,相信很多人在java中String的一些常见方法深入解析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2022-10-19
  • Java异常处理深入理解
    目录图片解析:异常的处理:处理机制一:try-catch-finallyfinally的再说明:处理机制二:throws + 异常类型开发中应该如何选择两种处理方式?如何自定义异常类...
    99+
    2022-11-12
  • Java深入浅出讲解String类常见方法
    目录1.定义字符串2.字符串的存储3.String中常用的方法3.1字符串的比较3.2查找字符串3.3转换字符串4.StringBuilder和StringBuffer5.常量池1....
    99+
    2022-11-13
  • 深入理解java泛型Generic
    目录一、背景二、泛型概念三、泛型类3.1 定义与调用3.2 注意3.3 使用3.4 泛型类的继承3.4.1 子类也是泛型类3.4.2 子类不是泛型类四、泛型接口4.1 定义4.2 使...
    99+
    2022-11-12
  • Java多线程深入理解
    目录线程Thread类Runnable接口创建线程Thread和Runnable的区别匿名内部类方式实现线程的创建线程安全线程安全线程同步同步方法Lock锁线程状态等待唤醒机制线程间...
    99+
    2022-11-12
  • Java反射之深入理解
    目录一、Java反射机制概述二、理解Class类并获取Class实例关于java.lang.Class类的理解三、通过反射创建对应的运行时类的对象(反射的应用1)四、获取运行时类的完...
    99+
    2022-11-12
  • 深入理解Java中的java.lang.ArithmeticException异常
    引言 在Java中,异常处理是一种重要的编程机制。异常是指在程序执行过程中发生的错误或异常情况,它打破了正常的程序流程,需要进行相应的处理。Java提供了丰富的异常类和异常处理语法,使开发人员能够更好...
    99+
    2023-10-18
    java 开发语言
  • Java代理模式的深入了解
    目录一、静态代理模式1.1、 代理模式的定义:1.2、代理模式的优缺点二、动态代理模式总结一、静态代理模式 1.1、 代理模式的定义: 由于某些原因需要给某对象提供一个代理以控制对该...
    99+
    2022-11-12
  • 深入理解java中Arrays.sort()的用法
    在Java中,Arrays.sort()方法是用来对数组进行排序的。它使用了经过优化的快速排序算法,可以对任何类型的数组进行排序。A...
    99+
    2023-08-14
    Java
  • 深入理解java的异常情况
    目录什么是异常?异常的存在形式Java异常体系异常的分类运行时异常编译时异常错误 Error编译时异常和运行时异常的区别常见的异常防御式编程Java处理异常的语法异常抛出—throw...
    99+
    2022-11-12
  • 深入理解Java main方法详解
    目录1. 深入理解 main 方法2. 在 Idea 下如何传递参数总结1. 深入理解 main 方法 解释main方法的形式:public static void main(Str...
    99+
    2022-11-12
  • 带你深入理解Java异常
    💕“人生就像一盘棋,有时候你慢一步,就输掉了一局。但只要你不停止思考和行动,就永远有机会翻盘。”💕 🐼作者:不能再留遗憾了🐼 &#x...
    99+
    2023-10-05
    java jvm 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作