广东品牌网站设计上海 .net网站建设

bicheng/2026/1/26 9:21:27/文章来源:
广东品牌网站设计,上海 .net网站建设,wordpress顶部导航菜单,南京app定制公司目录 String的基本特性 String的内存分配 字符串拼接操作 intern()的使用 String的基本特性 String#xff1a;字符串#xff0c;使用一对引起来表示 String声明为final的#xff0c;不可被继承 String实现了Serializable接口#xff1a;表示字符串是支持…目录 String的基本特性 String的内存分配 字符串拼接操作 intern()的使用 String的基本特性 String字符串使用一对引起来表示 String声明为final的不可被继承 String实现了Serializable接口表示字符串是支持序列化的。 String实现了Comparable接口表示string可以比较大小 String在jdk8及以前内部定义了final char[] value用于存储字符串数据。JDK9时改为byte[] String代表不可变的字符序列。简称不可变性。 当对字符串重新赋值时需要重写指定内存区域赋值不能使用原有的value进行赋值。 当对现有的字符串进行连接操作时也需要重新指定内存区域赋值不能使用原有的value进行赋值。 当调用string的replace()方法修改指定字符或字符串时也需要重新指定内存区域赋值不能使用原有的value进行赋值。 通过字面量的方式区别于new给一个字符串赋值此时的字符串值声明在字符串常量池中。 字符串常量池是不会存储相同内容的字符串的 String的String Pool是一个固定大小的Hashtable默认值大小长度是1009。如果放进String Pool的String非常多就会造成Hash冲突严重从而导致链表会很长而链表长了后直接会造成的影响就是当调用String.intern时性能会大幅下降。 使用-XX:StringTablesize可设置StringTable的长度 在jdk6中StringTable是固定的就是1009的长度所以如果常量池中的字符串过多就会导致效率下降很快。StringTablesize设置没有要求 在jdk7中StringTable的长度默认值是60013StringTablesize设置没有要求 在JDK8中设置StringTable长度的话1009是可以设置的最小值 String的内存分配 在Java语言中有8种基本数据类型和一种比较特殊的类型String。这些类型为了使它们在运行过程中速度更快、更节省内存都提供了一种常量池的概念。 常量池就类似一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调的String类型的常量池比较特殊。它的主要使用方法有两种。 直接使用双引号声明出来的String对象会直接存储在常量池中。 如果不是用双引号声明的String对象可以使用String提供的intern()方法。这个后面重点谈 Java 6及以前字符串常量池存放在永久代 Java 7中 Oracle的工程师对字符串池的逻辑做了很大的改变即将字符串常量池的位置调整到Java堆内 所有的字符串都保存在堆Heap中和其他普通对象一样这样可以让你在进行调优应用时仅需要调整堆大小就可以了。 字符串常量池概念原本使用得比较多但是这个改动使得我们有足够的理由让我们重新考虑在Java 7中使用String.intern()。 Java8及以后字符串常量池在堆中。 Java语言规范里要求完全相同的字符串字面量应该包含同样的Unicode字符序列包含同一份码点序列的常量并且必须是指向同一个String类实例。 class Memory {public static void main(String[] args) {int i 1;Object obj new Object();Memory mem new Memory();mem.foo(obj);}private void foo(Object param) {String str param.toString();System.out.println(str);} } 字符串拼接操作 常量与常量的拼接结果在常量池原理是编译期优化 常量池中不会存在相同内容的变量 只要其中有一个是变量结果就在堆中。变量拼接的原理是StringBuilder 如果拼接的结果调用intern()方法则主动将常量池中还没有的字符串对象放入池中并返回此对象地址 举例1: public static void test1() {// 都是常量前端编译期会进行代码优化// 通过idea直接看对应的反编译的class文件会显示 String s1 abc; 说明做了代码优化String s1 a b c;  String s2 abc; // true由上述可知s1和s2实际上指向字符串常量池中的同一个值System.out.println(s1 s2); } 举例2 public static void test5() {String s1 javaEE;String s2 hadoop; ​String s3 javaEEhadoop;String s4 javaEE hadoop;    String s5 s1 hadoop;String s6 javaEE s2;String s7 s1 s2; ​System.out.println(s3 s4); // true 编译期优化System.out.println(s3 s5); // false s1是变量不能编译期优化System.out.println(s3 s6); // false s2是变量不能编译期优化System.out.println(s3 s7); // false s1、s2都是变量System.out.println(s5 s6); // false s5、s6 不同的对象实例System.out.println(s5 s7); // false s5、s7 不同的对象实例System.out.println(s6 s7); // false s6、s7 不同的对象实例 ​String s8 s6.intern();System.out.println(s3 s8); // true intern之后s8和s3一样指向字符串常量池中的javaEEhadoop } 举例3 public void test6(){String s0 beijing;String s1 bei;String s2 jing;String s3 s1 s2;System.out.println(s0 s3); // false s3指向对象实例s0指向字符串常量池中的beijingString s7 shanxi;final String s4 shan;final String s5 xi;String s6 s4 s5;System.out.println(s6 s7); // true s4和s5是final修饰的编译期就能确定s6的值了 } 不使用final修饰即为变量。如s3行的s1和s2会通过new StringBuilder进行拼接 使用final修饰即为常量。会在编译器进行代码优化。 举例4 public void test3(){String s1 a;String s2 b;String s3 ab;String s4 s1 s2;System.out.println(s3s4);//false } 我们拿例4的字节码进行查看可以发现s1 s2实际上是new了一个StringBuilder对象并使用了append方法将s1和s2添加进来最后调用了toString方法赋给s4 0 ldc #2 a2 astore_13 ldc #3 b5 astore_26 ldc #4 ab8 astore_39 new #5 java/lang/StringBuilder 12 dup 13 invokespecial #6 java/lang/StringBuilder.init 16 aload_1 17 invokevirtual #7 java/lang/StringBuilder.append 20 aload_2 21 invokevirtual #7 java/lang/StringBuilder.append 24 invokevirtual #8 java/lang/StringBuilder.toString 27 astore 4 29 getstatic #9 java/lang/System.out 32 aload_3 33 aload 4 35 if_acmpne 42 (7) 38 iconst_1 39 goto 43 (4) 42 iconst_0 43 invokevirtual #10 java/io/PrintStream.println 46 return 字符串拼接效率对比 public class Test {public static void main(String[] args) {int times 50000; ​// Stringlong start System.currentTimeMillis();testString(times);long end System.currentTimeMillis();System.out.println(String: (end-start) ms); ​// StringBuilderstart System.currentTimeMillis();testStringBuilder(times);end System.currentTimeMillis();System.out.println(StringBuilder: (end-start) ms); ​// StringBufferstart System.currentTimeMillis();testStringBuffer(times);end System.currentTimeMillis();System.out.println(StringBuffer: (end-start) ms);} ​public static void testString(int times) {String str ;for (int i 0; i times; i) {str test;}} ​public static void testStringBuilder(int times) {StringBuilder sb new StringBuilder();for (int i 0; i times; i) {sb.append(test);}} ​public static void testStringBuffer(int times) {StringBuffer sb new StringBuffer();for (int i 0; i times; i) {sb.append(test);}} } ​ // 结果 String: 7963ms StringBuilder: 1ms StringBuffer: 4ms 本实验进行5万次循环String拼接方式的时间是StringBuilder.append方式的约8000倍StringBuffer.append()方式的时间是StringBuilder.append()方式的约4倍 可以看到通过StringBuilder的append方式的速度要比直接对String使用“”拼接的方式快的不是一点半点 那么在实际开发中对于需要多次或大量拼接的操作在不考虑线程安全问题时我们就应该尽可能使用StringBuilder进行append操作 StringBuilder空参构造器的初始化大小为16。那么如果提前知道需要拼接String的个数就应该直接使用带参构造器指定capacity以减少扩容的次数扩容的逻辑可以自行查看源代码 /*** Constructs a string builder with no characters in it and an* initial capacity of 16 characters.*/ public StringBuilder() {super(16); } ​ /*** Constructs a string builder with no characters in it and an* initial capacity specified by the {code capacity} argument.** param     capacity the initial capacity.* throws     NegativeArraySizeException if the {code capacity}*               argument is less than {code 0}.*/ public StringBuilder(int capacity) {super(capacity); } new String(“ab”)会创建几个对象 2个 一个对象是new关键字在堆空间创建的 另一个对象是字符串常量池中的对象ab new String(“a”) new String(“b”)创建几个对象呢 5个在常量池中是没有ab存在的 对象1new StringBuilder() 对象2 new String(“a”)在堆中 对象3 常量池中的a 对象4 new String(“b”)在堆中 对象5 常量池中的b intern()的使用 当调用intern方法时如果池子里已经包含了一个与这个String对象相等的字符串正如equals(Object)方法所确定的那么池子里的字符串会被返回。否则这个String对象被添加到池中并返回这个String对象的引用。 由此可见对于任何两个字符串s和t当且仅当s.equals(t)为真时s.intern() t.intern()为真。 s.intern()返回一个与此字符串内容相同的字符串但保证是来自一个唯一的字符串池。 intern是一个native方法调用的是底层C的方法 public native String intern(); 如果不是用双引号声明的String对象可以使用String提供的intern方法它会从字符串常量池中查询当前字符串是否存在若不存在就会将当前字符串放入常量池中。 String myInfo new string(I love Java).intern(); 也就是说如果在任意字符串上调用String.intern方法那么其返回结果所指向的那个类实例必须和直接以常量形式出现的字符串实例完全相同。因此下列表达式的值必定是true (abc).intern() abc 通俗点讲Interned string就是确保字符串在内存里只有一份拷贝这样可以节约内存空间加快字符串操作任务的执行速度。注意这个值会被存放在字符串内部池String Intern Pool String的intern()的使用 JDK1.6中将这个字符串对象尝试放入字符串常量池。 如果字符串常量池中有则并不会放入。返回已有的字符串常量池中的对象的地址 如果没有会把此对象复制一份就是将字符串字面量复制一份放入字符串常量池并返回字符串常量池中的对象地址 JDK1.7起将这个字符串对象尝试放入字符串常量池。 如果字符串常量池中有则并不会放入。返回已有的字符串常量池中的对象的地址 如果没有则会把对象在堆中的引用地址复制一份放入字符串常量池并返回字符串常量池中的引用地址它不会创建一个对象如果堆中已经有这个字符串那么会将堆中的引用地址赋给它 /*** ① String s new String(1)* 创建了两个对象* 堆空间中一个new对象* 字符串常量池中一个字符串常量1注意此时字符串常量池中已有1* ② s.intern()由于字符串常量池中已存在1* s 指向的是堆空间中的对象地址* s2 指向的是堆空间中常量池中1的地址* 所以不相等*/ String s new String(1); s.intern(); String s2 1; System.out.println(ss2); // jdk1.6 false jdk7/8 false/** ① String s3 new String(1) new String(1)* 等价于new String11但是常量池中并不生成字符串11** ② s3.intern()* 由于此时常量池中并无11所以把s3中记录的对象的地址存入常量池* 所以s3 和 s4 指向的都是一个地址 */ String s3 new String(1) new String(1); s3.intern(); String s4 11; System.out.println(s3s4); //jdk1.6 false jdk7/8 true 举例1 举例2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/86587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海市建设注册管理网站startit wordpress

该文章旨在记录开发中遇到的一些异常,以供遇到似错误进行参考修改 一、项目在多个环境下切换,有一次启动后编译失败,报异常 背景:项目在不同环境下有对应的分支,切换分支后运行项目,报错如下 错误:Kotlin:…

做视频点播网站需要服务器存储吗网页设计题目

系列文章 数值(整数,实数,字符串)与数据类型(wire、reg、mem、parameter) 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…

南昌做网站比较好的公司如何提高自己的营销能力

测试报告在项目中是至关重要的角色,一个好的测试报告: 可以体现测试人员的工作量; 开发人员可以从测试报告中了解缺陷的情况; 测试经理可以从测试报告中看到测试人员的执行情况及测试用例的覆盖率; 项目负责人可以通过…

游览有关小城镇建设的网站网站seo优化技术入门

本文简单介绍一下大洋钻探IODP 342航次,从中,我们一窥大洋钻探航次的风采。 IODP342的航次报告在网络上可以下载,英文名字叫《Integrated Ocean Drilling ProgramExpedition 342 Preliminary Report》,航次研究的主要内容是纽芬兰…

wordpress单页 文章页网站推广优化设计方案

一台Ubuntu一直以为扩展成功了的,但是用起来空间不够,才发现空间还是那么小,所以赶快想办法扩展。 首先尝试使用gparted软件,结果在软件里面发现硬盘分区/dev/sda3已经全分配78G了。 但是看df -H,明明没有扩展: /dev…

怎么做vip电影网站个人是否可以申请网址

Object-Level Ranking: Bringing Order to Web Objects Zaiqing Nie Yuanzhi Zhang Jirong Wen Weiying Ma 摘要: 现在的网络搜索方法实际上是做文档级排名和检索,与之相对比,我们在探索一种新的聚合体以实现在对象级的网络检索。我们搜集与某…

购物网站推广方案浙江网上移动营业厅

dotnet-exec 小工具Intro在之前的文章中很多会有一些示例代码,这些代码一般都是一些很小的示例,尤其是介绍一些新特性的示例,基本上不会引用其他包,只有 SDK 就可以执行,对于这些示例,一般会每个实例单独一…

投票网站定制vx小程序制作

无着色器绘制2D图形 使用WebGL开发时&#xff0c;为保证界面图形显示效果&#xff0c;请使用真机运行。 此场景为未使用WebGL绘制的2D图形&#xff08;CPU绘制非GPU绘制&#xff09;。开发示例如下&#xff1a; 1.创建页面布局。index.hml示例如下&#xff1a; <div class…

代理机构做的网站找不到人了怎么办新乡营销网站建设公司哪家好

目 录 一、需求 二、解决思路 三、实现方式 1、抓一定数量的数据包 2、抓取1小时的数据包 3、以小时为周期&#xff0c;周期性的执行抓包1小时 4&#xff0c;抓包分析并输出结果 5&#xff0c;周期性分析并输出结果 &#xff08;1&#xff09;定时…

把一个网站挂到网上要怎么做tp5网站开发逻辑架构

随着全球化的不断推进&#xff0c;跨境电商平台在国际贸易中扮演着越来越重要的角色。然而&#xff0c;这一行业的蓬勃发展也伴随着一系列社会和环境问题&#xff0c;使得跨境电商平台不得不正视并履行社会责任。在追求商业成功的同时&#xff0c;平台如何走上一条可持续经营的…

山西建设厅八大员查询网站设计师图片素材网站有哪些

volatile 关键字 &#xff08;二&#xff09; 文章目录 volatile 关键字 &#xff08;二&#xff09;volatile 可以保证原子性么&#xff1f; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 volatile 可以保证原子性么&#xff1f; volatile 关键字能保证变量的可…

高校招生网站模板资讯网站

一、系统环境和要求 在MySQL中&#xff0c;开启日志审计可以记录数据库的操作日志&#xff0c;包括修改、删除、插入等操作。这对于追踪和分析数据库的使用情况以及排查潜在的安全问题非常有帮助。本文将详细介绍如何开启MySQL的日志审计功能。 操作系统&#xff1a;Ubuntu 20…

柳州企业网站制作哪家好沈阳做网站有名公司

太阳光模拟器是一种用于测试建筑外窗遮阳系数的高科技设备。它能够模拟太阳光照射房屋的情景&#xff0c;帮助建筑师和设计师更好地了解建筑外窗的遮阳性能&#xff0c;从而提高建筑的能源效率和舒适度。 这种模拟器的工作原理非常简单&#xff0c;它通过使用高亮度的光源和精密…

wordpress全站ajax代码网站建设费用怎么算

一、什么是状态模式 状态模式是一种行为型设计模式。它允许对象在内部状态发生改变时改变它的行为&#xff0c;简单地讲就是&#xff0c;一个拥有状态的context对象&#xff0c;在不同状态下&#xff0c;其行为会发生改变。 二、角色组成 上下文&#xff08;Context&#xff0…

网站建设 设计教育类型网站

一文了解堆在前端中的应用⚡序言&#x1f998;一、堆是什么&#xff1f;&#x1f425;二、JS中的堆&#x1f41d;三、堆的应用&#x1f408;四、构建一个最小堆1. 定义2. 方法3. 用js代码实现最小堆&#xff08;1&#xff09;初始化一个堆&#xff08;2&#xff09;交换位置swa…

长沙有哪些网站建设公司邯郸有什么互联网大公司吗

1 创建文件夹&#xff0c;并创建 index.js 在文件中声明函数&#xff0c;使用module.exports 导出 2 npm 初始化工具包&#xff0c;package.json 填写包的信息&#xff08;包的名字是唯一的&#xff09; npm init 可在这里写包的名字&#xff0c;或者一路按回车&#xff0c;后…

中小企业网站用什么技术aso优化推广

最近接触到了五花八门的文件系统、存储类型&#xff0c;名词听得头大&#xff0c;趁假期整理学习一番~ 名称OSSFastDFSJuiceFSCIFSCephFSEFSNFS全称Object Storage Service (对象存储服务)Fast Distributed File System (快速分布式文件系统)Juice File System (Juice 文件系统…

网站开发技术文章秒应小程序怎么创建

看到这个报错头都大了 一开始在网上各种搜搜&#xff0c;然后有人说是flutter版本的问题&#xff0c;改完版本之后还是不对&#xff0c;又是各种搜搜搜 有人说是环境变量的问题&#xff0c;后来改了环境变量&#xff0c;妈的&#xff0c;竟然还不行&#xff0c;想砸电脑的心都…

页面设计比例aso优化{ }贴吧

&#xff08;2017-05-18 银河统计&#xff09;决策树(Decision Tree&#xff09;是在已知各种情况发生概率的基础上&#xff0c;通过构成决策树来判断其可行性的决策分析方法&#xff0c;是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干&#xff0c…

光泽网站建设wzjseo江阴做网站的公司

【hashmap】【将排序之后的字符串作为哈希表的键】【获取 HashMap 中所有值的集合】Leetcode 49 字母异位词分组 解法1 将排序之后的字符串作为哈希表的键解法2 在解法一的基础上加入了getOrDefault ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f3…