字符串常量

静态常量字符串(类成员)

白昼怎懂夜的黑 提交于 2020-02-28 06:10:01
我想要一个类的私有静态常量(在这种情况下是形状工厂)。 我想要些类似的东西。 class A { private: static const string RECTANGLE = "rectangle"; } 不幸的是,我从C ++(g ++)编译器中收到各种错误,例如: ISO C ++禁止初始化成员“ RECTANGLE” 非整数类型'std :: string'的静态数据成员的无效的类内初始化 错误:将“ RECTANGLE”设为静态 这告诉我,这种成员设计不符合该标准。 您如何在没有使用#define指令的情况下拥有私有文字常量(或也许是公共的)(我想避免数据全局性的丑陋!) 任何帮助表示赞赏。 #1楼 您必须在类定义之外定义静态成员,然后在其中提供初始化程序。 第一 // In a header file (if it is in a header file in your case) class A { private: static const string RECTANGLE; }; 然后 // In one of the implementation files const string A::RECTANGLE = "rectangle"; 您最初尝试使用的语法(类定义内的初始化程序)仅适用于整数和枚举类型。 从C ++ 17开始,您还有另一个选择

转:String StringBuffer StringBuilder区别

倖福魔咒の 提交于 2020-02-27 04:35:33
转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论。还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸裸的站在我们这些Java色狼面前了。嘿嘿.... 众所周知,String是由字符组成的串,在程序中使用频率很高。Java中的String是一个类,而并非基本数据类型。 不过她却不是普通的类哦!!! 【镜头1】 String对象的创建 1、关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world"); 问题是参数"Hello world"是什么东西,也是字符串对象吗?莫非用字符串对象创建一个字符串对象? 2、当然,String类对象还有一种大家都很喜欢的创建方式:String s="Hello world"; 但是有点怪呀,怎么与基本数据类型的赋值操作(int i=1)很像呀? 在开始解释这些问题之前,我们先引入一些必要的知识: ★ Java class文件结构 和常量池 我们都知道,Java程序要运行,首先需要编译器将源代码文件编译成字节码文件(也就是.class文件)。然后在由JVM解释执行。 class文件是8位字节的二进制流 。这些二进制流的涵义由一些紧凑的有意义的项 组成

C++笔记(3):一些C++的基础知识点

99封情书 提交于 2020-02-26 23:05:08
前言: 找工作需要,最近看了下一些C++的基本概念,为范磊的 《零起点学通C++》,以下是一些笔记。 内容:   delete p;只是删除指针p指向内存区,并不是删除指针p,所以p还是可以用的。删除空指针所指向内存是可以的。   堆中的变量和对象时匿名的,没有名称,只能通过指针来访问。   在堆中创建对象时,在分配内存的同时会调用类的构造函数,在删除堆中对象时,会调用类的析构函数。   为了避免内存泄露,在删除一个指针后应该将其其值赋为0。   常量指针是指针指向的内存区域地址不能改变,但是该内存地址里保存的值是可以改变的,比如int a; int * const p = &a;   指向常量的指针表示指针指向的对象是不能被修改的,但是该指针可以被修改,即该指针可以指向另一块目标内存地址。比如const int a = 0; const int *p = &a; 如果A是一个类,也可以为const A* p = new A;   而指向常量的常指针表示指针本身不能被修改,其指向的内存地址内容也不能被修改。比如const int a = 0; const int * const p = &a;   引用就是别名常量。   堆中的地址是用指针来操作的,用不到别名。   如果在main函数前面的其它函数的声明和定义是一起的,则表明这个函数是内联函数!因此当该函数较长时

透过源码学优化:String字符串性能优化的方案,你知道几种?

江枫思渺然 提交于 2020-02-26 00:41:01
推荐阅读: 阿里二面凉经:设计模式+缓存+Spring+虚拟机+MySQL+中间件+并发等难题,全部迎刃而解 阿里巴巴字节跳动那些大厂必问的HTTP该怎么学?我建议你看看这篇文章! 蚂蚁、字节、PDD社招面经Java岗(分布式+线程安全+MySQL+CAS) String字符串是系统里最常用的类型之一,在系统中占据了很大的内存,因此,高效地使用字符串,对系统的性能有较好的提升。 针对字符串的优化,我在工作与学习过程总结了以下三种方案作分享: 一.优化构建的超大字符串   验证环境:jdk1.8   反编译工具:jad 1.下载反编译工具jad,百度下载 2.验证 先执行一段例子1代码: public class test3 { public static void main(String[] args) { String str="ab"+"cd"+"ef"+"123"; } } 执行完成后,用反编译工具jad进行反编译:jad -o -a -s d.java test.class 反编译后的代码: // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options:

Java常量池理解与总结

﹥>﹥吖頭↗ 提交于 2020-02-25 19:22:51
Java常量池理解与总结 一.相关概念 1、什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 2、Class文件中的常量池 在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(constant_pool_count)存储常量池容量计数值。 常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量: 类和接口的全限定名 字段名称和描述符 方法名称和描述符 3、方法区中的运行时常量池 运行时常量池是方法区的一部分。 CLass文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。 运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性

深入浅出java常量池

这一生的挚爱 提交于 2020-02-17 06:45:22
理论 jvm虚拟内存分布: 程序计数器 是jvm执行程序的流水线,存放一些跳转指令。 本地方法栈 是jvm调用操作系统方法所使用的栈。 虚拟机栈 是jvm执行java代码所使用的栈。 方法区 存放了一些常量、静态变量、类信息等,可以理解成class文件在内存中的存放位置。 虚拟机堆 是jvm执行java代码所使用的堆。 Java中的常量池,实际上分为两种形态: 静态常量池 和 运行时常量池 。 所谓 静态常量池 ,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。这种常量池主要用于存放两大类常量: 字面量 (Literal)和 符号引用量 (Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量: 类和接口的全限定名 字段名称和描述符 方法名称和描述符 而 运行时常量池 ,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在 方法区 中,我们常说的常量池,就是指方法区中的运行时常量池。 运行时常量池相对于CLass文件常量池的另外一个重要特征是 具备动态性 ,Java语言并不要求常量一定只有编译期才能产生

PHP笔记

十年热恋 提交于 2020-02-10 02:45:10
//语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出。 /* 【命名规则】 */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_name 函数名建议用驼峰命名法 // varName 定界符建议全大写 // <<<DING, <<<'DING' 文件名建议全小写和下划线、数字 // func_name.php 私有属性名、方法名建议加下划线 // private $_name _func 接口名建议加I_ // interface I_Name /* 语言结构 */ array(), echo(), empty(), eval(), exit(), isset(), list(), print(), unset() echo, print 可省略括号。 /* 预定义常量 */ PATH_SEPARATOR //路径分隔符(Windows为分号,类Unix为冒号) DIRECTORY_SEPARATOR //目录分隔符 PHP_EOL //当前系统的换行符 PHP_VERSION //PHP版本号 PHP_OS //PHP服务操作系统 PHP_SAPI //用来判断是使用命令行还是浏览器执行的,如果 PHP_SAPI=='cli' 表示是在命令行下执行 PHP_INT_MAX

设计模式 | 享元模式及典型应用

寵の児 提交于 2020-02-08 14:03:44
👨 前言 本文的主要内容: 介绍享元模式 示例-云盘 总结 源码分析享元模式的典型应用 String中的享元模式 Integer中的享元模式 Long中的享元模式 Apache Common Pool2中的享元模式 享元模式 享元模式(Flyweight Pattern) : 运用共享技术有效地支持大量细粒度对象的复用 。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。享元模式结构较为复杂,一般结合工厂模式一起使用。 ↘️ 角色 Flyweight(抽象享元类) :通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据( 内部状态 ),同时也可以通过这些方法来设置外部数据( 外部状态 )。 ConcreteFlyweight(具体享元类) :它实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。 UnsharedConcreteFlyweight(非共享具体享元类) :并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类

深入理解Java:String

社会主义新天地 提交于 2020-02-07 07:00:51
在讲解String之前,我们先了解一下Java的内存结构。 一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。 JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在 Java 虚拟机启动时创建,非堆内存(Non-heap Memory)是在JVM堆之外的内存。 简单来说,非堆包含方法区、JVM内部处理或优化所需的内存(如 JIT Compiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码。 Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、 anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。 堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小, 生存期也不必事先告诉编译器 ,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。    栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 栈中主要存放一些基本类型的变量数据(int, short, long,

String字符串性能优化的几种方案

心已入冬 提交于 2020-02-06 20:16:10
String字符串是系统里最常用的类型之一,在系统中占据了很大的内存,因此,高效地使用字符串,对系统的性能有较好的提升。 针对字符串的优化,我在工作与学习过程总结了以下三种方案作分享: 一.优化构建的超大字符串 验证环境:jdk1.8 反编译工具:jad 1.下载反编译工具jad,百度云盘下载: 链接:https://pan.baidu.com/s/1TK1_N769NqtDtLn28jR-Xg 提取码:ilil 2.验证 先执行一段例子1代码: public class test3 { public static void main ( String [ ] args ) { String str = "ab" + "cd" + "ef" + "123" ; } } 执行完成后,用反编译工具jad进行反编译:jad -o -a -s d.java test.class 反编译后的代码: // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) annotate // Source File Name: test.java package