深入解析C++和JAVA的字符串

所有的字符串类都起源于C语言的字符串,而C语言字符串则是字符的数组。C语言中是没有字符串的,只有字符数组。
谈一下C++的字符串:C++提供两种字符串的表示:C风格的字符串和标准C++引入的string类型。一般建议用string类型,但是实际情况中还是要使用老式C风格的字符串。
1.C风格的字符串:C风格字符串起源于C,并在C++中得到扩展。字符串存储在一个字符数组中,例如:
       const char *str = “zhangdan”;(不要忘掉最后的\0)
       这里用常量字符数组来表示字符串。操作字符串的时候只要操作指针就可以了。如 :
       const char * str = "zhangdan";  const char *p = str; 然后对p进行操作就可以了。
2.标准C++的string类型:如果用的话首先要引入头文件:#include<string>
       在C++中提供的标准字符串类型提供了以下操作:
      (1).支持用字符序列或者第二个字符串去初始化一个字符串对象。C风格的字符串不支持用另外一个字符串初始化另外一个字符串。
      (2).支持字符串之间的copy,C风格字符串通过strcpy()函数来实现。
      (3).支持读写访问单个字符。对于C风格的字符串,只有解除引用或者通过下标操作才能访问单个字符。
      (4).支持两个字符串相等比较,对于C风格的字符串,比较是通过strcmp()函数来实现的。
      (5).支持两个字符串连接,对于C风格的字符串用strcpy() 函数copy到一个新的实例中,然后用strcat()把两个字符串接起来。如:
       string str1 = "111111", str2 = "222222";
       string str3 = str1 + str2;
      (6).支持对字符串长度的查询:string s ("XXXXXXX"); str.size() 为字符串的长度。
     相互转换:const char * str = str2.c_str(); //不可把字符串类型直接赋给字符数组,但是可以吧一个字符数组赋给一个字符串类型:如:const char *str = "zhangdan"; string str2 = str;

C++ string类的输入
    (1)方法一:和C字符串输入的方法一相同。
    (2)方法二:使用getline函数。
    例如:string a;
   getline(cin,a);

字符串到数字的转换
    atoi函数获取一个C字符串参数,返回对应的int值。如果参数不与一个int值对应,atoi就会返回0。atoi函数在文件为cstdlib的库中。如果数字太大,不能转换成int类型的值,可以使用atol将字符串转换为long类型的值。
   例如:
    atoi("1234");   //返回整数1234
    atoi("#123");   //返回0
   C++中字符串的常用方法就不一一介绍,介绍几个常用的:begin(),end(),append(),等等。
  2:JAVA中的字符串:在JAVA中,String不属于8中基本类型,所以String是对象,默认值是null
 例如:String str = new String(); 和String str =  new String("");是一个意思,就是构造一个空字符串,(理解null和""的区别)。
        看下面这段代码:

String str = "xxx";
String str2 = new String("xxx");
System.out.println(str == str2);
System.out.println(str.equals(str2));

结果是:
false
true

为什么呢? 在JAVA中 == 是对地址的比较,而equals是对内容的比较,为什么地址不一样呢?
先引入常量池的概念:

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
当我们将一个字符串赋给一个字符串变量的时候,如String str = "xxxx"; 这时候,先去常量池中找有没有"xxxx"的字符串拷贝,如果有的话,把str的地址指向常量池中字符串常量"xxxx"的地址,如果没有则在常量池中建立"xxxx"的字符串常量。而 new String("xxxx")是放在堆内存中,有自己的内存空间。所以地址比较的时候不一样。
看下面一段代码:

String str = "zhang";
String str2 = "peng";
String str3 = "zhangpeng";
String str4 = "zhangpeng"
str += str2;
System.out.println(str == str3);
System.out.println(str3 == str4)

结果为:
true
true

为什么呢?
首先,我们要知道Java会确保一个字符串常量只有一个拷贝。

因为例子中的str3和str4中的"zhangpeng"都是字符串常量,它们在编译期就被确定了,所以str3==str4为true;而"zhang"和"peng"也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以str2也同样在编译期就被解析为一个字符串常量,所以str2也是常量池中"zhangpeng"的一个引用。

JAVA 中String 和StringBuffer的区别:

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
不能通过付值符号对他进行付值.
sb = "xxxxx";
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
字符串连接操作中StringBuffer的效率要比String高:
String str = new String("xxx");
str += "xx";
的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,所以就慢了

问一个问题:为什么StringBuffer效率这么高,那么我们还要String呢?
不会的查一下吧,方向是常量池。

Python 字符串:
Python是一种强大的脚本语言,它定义字符串的时候不用定义类型。python字符串通常有单引号('...')、双引号("...")、三引号("""...""")或('''...''')包围,三引号包含的字符串可由多行组成,一般可表示大段的叙述性字符串。在使用时基本没有差别,但双引号和三引号("""...""")中可以包含单引号,三引号 ('''...''')可以包含双引号,而不需要转义。当需要特殊转义的时候可以用 '\'
python 也有很多字符串操作的函数。具体可以dir一把,跟C++和java都是大同小异的。

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • java对XML文件的解析、节点的增加、删除操作总结

    1.java代码: 主要采用dom来进行操作 复制代码 代码如下: package test; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.T

  • 解析Java的可变长参数列表及其使用时的注意点

    Java 可变参数列表 复制代码 代码如下: class A {} 由于所有的类都继承于Object,可以以Object数组为参数的方法: public class parameter { static void printArray(Object[] args){ for(Object obj : args){ System.out.print(obj + " "); } System.out.println(); } public static void main(String[]

  • java解析出url请求的路径和参数键值对类(解析出url请求的路径,包括页面)

    复制代码 代码如下: package RequestPackage; import java.util.HashMap; import java.util.Map; public class CRequest { /** * 解析出url请求的路径,包括页面 * @param strURL url地址 * @return url路径 */ public static String UrlPage(String strURL) { String strPage=null; String[] arr

  • 深入解析Java编程中方法的参数传递

    在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案: 1. 先定义一个类型Value public static class Value { private String value = "value"; public String getValue() { return value; } public void

  • java中字符串参数化符号${}的解析

    前言 我们在很多地方都能看到代表参数意义的符号${},可能我们在写一些框架的时候,有时候也需要用到这个符号,但他们是如何精确解析的?或者说需要我们自已写的时候,如何写? 我们先来看以下的几个场景: 1.字符串"a${a}a" 2.字符串"a\${a}a" 3.字符串"a${a\}a" 4.字符串"a${a\}a}a" 5.字符串"a${a}a${" 6.字符串"a${a}a${a}" 以

  • java统计字符串单词个数的方法解析

    在一些项目中可能需要对一段字符串中的单词进行统计,我在这里写了一个简单的demo,有需要的同学可以拿去看一下. 不说废话了直接贴代码: 实现代码: /** * 统计各个单词出现的次数 * @param text */ public static void findEnglishNum(String text){ //找出所有的单词 String[] array = {".", " ", "?", "!"}; for (int

  • 在java中使用dom4j解析xml(示例代码)

    虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

  • java解析任意层数json字符串的方法

    复制代码 代码如下: //解析策略,有可能是解析json字符串,有可能为数据中的图片地址,email等package cc.util.regex; public enum RegexPolicy { Json("Json"), Image("ImageFromHtml"); private String value; RegexPolicy (String value) {  this.value = value; } @Override public String

  • Java生成和解析XML格式文件和字符串的实例代码

    1.基础知识: Java解析XML一般有四种方法:DOM.SAX.JDOM.DOM4J. 2.使用介绍 1).DOM (1)简介 由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作.优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作:缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理. (2)示例代码: 复制代码 代码如下: <?xml version="1.0&quo

  • 深入解析C++和JAVA的字符串

    所有的字符串类都起源于C语言的字符串,而C语言字符串则是字符的数组.C语言中是没有字符串的,只有字符数组. 谈一下C++的字符串:C++提供两种字符串的表示:C风格的字符串和标准C++引入的string类型.一般建议用string类型,但是实际情况中还是要使用老式C风格的字符串. 1.C风格的字符串:C风格字符串起源于C,并在C++中得到扩展.字符串存储在一个字符数组中,例如:        const char *str = "zhangdan";(不要忘掉最后的\0)       

  • Java实现字符串解析为日期时间的方法示例

    本文实例讲述了Java实现字符串解析为日期时间的方法.分享给大家供大家参考,具体如下: Java版本:1.8开始 import java.time.LocalDate; import java.time.LocalDateTime; /** * Created by Frank */ public class DateParse { public static void main(String[] args) { String armisticeDate = "1914-11-11";

  • java实现字符串四则运算公式解析工具类的方法

    项目中用到用户定义运算公式进行就算的需求,这样需要进行字符串四则运算解析,下面提供字符串公式四则运算解析与计算工具类,需要的同学可参考. 工具类如下:FormulaCalculator.java: package org.nercita.bcp.record.util; import java.util.ArrayList; import java.util.LinkedList; /** * @author zhangwenchao * @since 2016-08-26 * 公式计算的工具类

  • Java全面解析string类型的xml字符串

    目录 解析string类型的xml字符串 所需要的包自行导入 解析String类型t复杂xml,多级节点,最好的例子 字符串xml如下 解析代码 解析string类型的xml字符串 我先拼接一个xml格式的字符串,模拟获取了这样的数据,然后再解析 所需要的包自行导入 StringBuilder sb = new StringBuilder(); sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?&

  • 解析Java格式字符串的使用

    Class Formatter 该类提供了对布局调整和对齐的支持,对数字.字符串和日期/时间数据的常用格式,以及本地特定的输出.支持常见的Java类型,如byte.BigDecimal和Calendar.通过Formattable接口为任意的用户类型提供有限的格式化定制.格式化器对于多线程访问不一定安全.线程安全是可选的. 举例说明: StringBuilder sb = new StringBuilder(); // Send all output to the Appendable obje

  • Java Json字符串的双引号("")括号如何去掉

    我就废话不多说了,大家还是直接看代码吧~ //自己copy试一下比什么都好 public static void main(String[] args) { String json = "[\"name\":\"value\",\"value1\"]"; String t = json.replaceAll("\\\"",""); System.out.println(&quo

  • Java 常量字符串过长的解决方法

    问题出现 在IDEA中,字符串长度超过65535,进行打印,IDEA会提示java: 常量字符串过长.使用javac 进行编译也会有类似的提示 解决办法 使用StringBuilder StringBuilder sb = new StringBuilder(); sb.append("String"); sb.append("String"); String str = sb.toString(); String[] parts = str.split("

  • 使用Jackson-json解析一个嵌套的json字符串

    目录 Jackson-json解析一个嵌套的json字符串 关于这个jar包 然后读入我的json字符串(str) 把节点展开 取到shops时就简单了,贴上代码 java解析多层嵌套json字符串 Jackson-json解析一个嵌套的json字符串 最近想尝试一下java的爬虫的编写,于是不可避免的遇到了要处理json数据的问题,于是乎用到了Jackson-json这个jar包 关于这个jar包 先在工程中导入这个jar包,然后创建一个ObjectMapper对象 ObjectMapper

  • 你知道Java判断字符串是否为数字的多种方式吗

    目录 前言 异常处理 正则表达式 使用NumberFormat 数字字符 外部工具类 1.NumberUtils.isParsable 2.NumberUtils.isCreatable 3.StringUtils.isNumeric 4.StringUtils.isNumericSpace 测试并比较 1)null或者空字符串 2)常规的数字,整数,浮点数以及负数 3)包含非法的字符,例如包含多余的小数点,包含多余的负号,以及其它非法格式 4)非阿拉伯数字,例如印度数字 १२३,阿拉伯文 ١٢

  • Java检查日期字符串是否合法的方法总结

    目录 WHY HOW 1.使用 DateFormat 检查 2.使用 LocalDate 检查 3.使用 DateTimeFormatter 检查 4.使用 Apache 出品的 commons-validator 检查 总结 WHY 后端接口在接收数据的时候,都需要进行检查.检查全部通过后,才能够执行业务逻辑.对于时间格式,我们一般需要检查这么几方面: 字符串格式是否正确,比如格式是不是yyyy-MM-dd 时间在合法范围内,比如我们需要限定在一个月内的时间 字符串可以解析为正常的时间,比如

随机推荐