精华内容
下载资源
问答
  • 1 String的形式public final class StringString类是由final修饰的,所以是不能被继承的①,我们在对字符串进行比较时,一般是期望对比其中的字符串是否一样,所以这里我们不能用"=="进行字符串的比较,而是需要使用...

    1 String的形式

    public final class String

    String类是由final修饰的,所以是不能被继承的①,我们在对字符串进行比较时,一般是期望对比其中的字符串是否一样,所以这里我们不能用"=="进行字符串的比较,而是需要使用"equals"方法②,因为使用==进行比较时,是比较的对象,只有指向同一个字符串对象的才会是true,否则就算字符串值相同也可能出现不相等的情况。

    private final char value;

    String的值实际上是以char的数组存储的,并且是final的,所以字符串对象是不可变的③,但是我们可以看到字符串的一些操作会误导我们,比如使用:

    String a = "aaaa";a += "bbbb";

    其实这个时候a已经指向新的对象地址。

    到这里为止,初级工程师都应该很熟悉。

    2 String的形式

    在思考String能有多长之前,我们先看下String定义的不同形式。

    // 第一种String s = "aaaaaaaaaaaaa...";// 第二种byte a = readFromFile(new File("someLargeText.txt"));String superLongString = new String(a);

    那么既然思考String的长度,那就应该想想为什么会有长度的限制,难道我在编译器里定义一个String时,有多长不是随便我们自己输入吗?还有上面两种方式有什么区别呢?

    2.1 字面量的形式

    对于第一种是字面量,Java将其存在常量池中,在Java1.6的版本中是在栈的常量池中,在1.7、1.8版本中将其放到了堆的常量池中。那就是说第一种这种方式中是受到常量池大小的约束了,不错,是会受到常量池的约束,但是在运行在JVM之前,被编译成字节码时就已经有了限制。

    17768f28037b9c4a1bfe49d130c2c496.png

    如上图所示,编译后的length的类型为u2(无符号16位),也就是讲length的最大值为2^16-1 = 65535,那就是讲我们的上面的字符串s长度按MUTF-8(字节码中的编码)编码可以存储65535个字节。

    到这里为止,如果你是中级工程师,知道这么多已经很不错了。

    可是事实上呢,我们实验后发现只能存储65534个字节,这是为什么呢?网上有很多猜想,大部分不正确。我们扒一下Java编译器的源码,会发现:

    5a75431a8a8c18b736cb6cc1920299bb.png

    这下大家明白了吧,Java编译器在检查字符串常量时,判断的是长度只有<65535才会正常,否则报错。看起来像是编译器的Bug。如果你会修改编译器源码,你将上面的判断条件改成<=65535,这样你存一个65535个字符"a"的字符串就不会编译出错了。

    我们知道上面我们是用拉丁字符"a"来测试的,a使用UTF-8编码刚好是一个字节,所以可以存储65534个,那如果存汉字呢,比如我们经常看到的"烫",它使用TF-8编码后占用三个字节,那么也就是说我们可以这样定义:

    // 按照我们刚才的分析,应该可以存储65534/3个"烫"汉字String s = "烫烫烫...烫烫";

    那我们尝试存储65535/3个汉字"烫"试试呢?结果是可以的,并没有报错。诶?这是为什么呢?我们继续扒下编译器的源码看到:

    52cee0d0d1c12a4c7023dd1aec743d64.png

    编译处理汉字这种的呢,他判断的逻辑不一样。条件是>65535才会抛异常,也就是小于等于65535是正常的。很有意思,写Java编译器的人也很有意思哈。

    2.1 new的形式

    对于第二种形式的,很显然只有在运行时受限于Java虚拟机了。我们知道String最后保存在char数组中,Java虚拟机是如何做的呢?简单参考下源码:

    88798ab39d80b43e8f56915694edb21b.png

    虚拟机指令newarray [int],size是以整形定义的,所以它的限制其实就是int的最大值,但是在有一些虚拟机上会保留一些头信息在数组中,所以就变成了Integer.MAX_VALUE - 8个char;

    到这里呢,基本上你就有了高级工程师的思考高度了。

    3

    总结

    3.1 字面量的形式

    • 受字节码数据结构的限制,字符串使用MUTF-8编码后字节数不超过65535

    • 拉丁字符,受Java编译器代码限制,最多只能存储65534个字节

    • 非拉丁字符,最多存储65535个字节

    3.2 new的形式

    • 受虚拟机指令限制,字符数理论上线是Integer.MAX_VALUE,但是实际上有保留头信息的部分,所以会略小

    • 受堆内存的限制,如果堆内存很小,那就不能超过堆内存的限制

    看起来本文有点过于追求细节了,有点孔乙己的回字有几种写法的意思。实际则不然,搞技术就是要把握好细节,才能写出优秀的代码,才能成为高阶的工程师而不是码农。

    如果看到这里,说明你喜欢这篇文章,请转发

    展开全文
  • c++string长度问题

    2020-03-19 12:05:36
    if (name.size()== 0 || name.size()> 18) { cout << "卡号长度错误,请重新设置" << endl; } 在上述代码中,str.size()编译成功,然而当使用str.length时,出现错误。 ...
    if (name.size()== 0 || name.size()> 18)
    	{
    		cout << "卡号长度错误,请重新设置" << endl;
    		
    	}
    

    在上述代码中,str.size()编译成功,然而当使用str.length时,出现错误。

    展开全文
  • C++string长度

    2020-12-18 15:21:05
    C++string长度 (1)采用string的成员方法length()获取字符串长度 (2)采用string的成员方法size()获取字符串长度 (3)用strlen获取字符串长度 (4)函数实现获取字符串长度的功能 int GetStringWords( ...

                                                                                C++之string长度

    (1)采用string的成员方法length()获取字符串长度

    (2)采用string的成员方法size()获取字符串长度

    (3)用strlen获取字符串长度

    (4)函数实现获取字符串长度的功能

    int GetStringWords( string strWord )
    {
      int nWords(0);
      int nLen = strWord.length();
      int i(0);
      while (i<nLen)
      {
    	  //如果是汉字则移到下一个
    	  if (strWord[i]&0x80)
    	  {
    		  i++;
    	  }  
    	  nWords++;
    	  i++;
      }
      return nWords;
    }

    总结:(1)、(2)、(3)如果有中文,代表两个字符,(4)不区分中英文,根据实际个数进行计算字符串长度。

    展开全文
  • c++中求string类型长度的方法

    千次阅读 2020-07-26 20:49:47
    c++中的string类型求长度有两种方法 str.length() 以及 str.size() string str; cin >> str; // 输入 "abcdefg" int len1 = str.size(); int len2 = str.length(); cout << len1 << ' ' << ...

    c++中的string类型求长度有两种方法 str.length() 以及 str.size()

    string str;
    cin >> str; // 输入 "abcdefg"
    int len1 = str.size();
    int len2 = str.length();
    cout << len1 << ' ' << len2 << endl;
    

    代码运行结果:
    在这里插入图片描述

    完整代码

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        string str;
        cin >> str;
        int len1 = str.length();
        int len2 = str.size();
        cout << len1 << ' ' << len2 << endl;
        return 0;
    }
    
    展开全文
  • C++string长度和插入函数

    万次阅读 2017-04-15 22:39:59
    size#include ...}(2)a.length()(同size(),这是早期开发string类时加入的,现在还可以用,但其他STL容器没有此方法)解释一下sizeof的结果:sizeof运算符返回对象或类型实际占有的空间,string
  • 1、C++获取字符串长度详解 http://c.biancheng.net/view/1444.html 2、C++ string类型的字符串长度获取的三种方法 https://blog.csdn.net/fanyun_01/article/details/79122843
  • C++ string类型的字符串长度获取的三种方法

    万次阅读 多人点赞 2018-01-21 20:43:44
    string的成员方法length()获取字符串长度  length()比较直观,表示的就是该字符串的长度。 [cpp] view plain copy  print? #include  #include    using namespace std;  ...
  • 1.C++中求string类型的长度有三种方式。在c++中,string代表一个类,有它自己的构造函数和成员函数。有两个成员函数都可以求string类型的长度。① length()成员函数。② size()成员函数。③ 可以借助strlen函数,...
  • c++ string长度问题

    千次阅读 2011-09-02 17:22:32
    最近在用c++写代码,我不是太熟悉,在... 对于一个string类型的变量s,我们要想知道其长度会调用本身的size或者length函数,该函数返回的值是一个unsigned类型,所以没有正负,就不用如同下面的使用方式:   if(
  • C++ 字符串长度获取 sizeof、strlen、string.length、string.size 刚开始在获取字符数组和string字符串的长度的时候对函数的使用不是很清楚. 实践出真知 #include <iostream> #include <typeinfo> #...
  • std::string string_array[] = {"qdfsdasdewqd","dsfcvxfdhtrh","dcv455"}; int num = sizeof(string_array) / sizeof(string_array[0]); 任何基本数组的个数都可以用“sizeof(数组名)/sizeof(数组某一项)”得到,...
  • 后面又使用length()和size()函数看了一下,我本地的字符串a的长度总是比别人传过来的字符串长度小1。然后我将a和b逐个字符打印(按照%d)出来发现b比a多了一个字符‘\0’,对应的十进制就是0. 这个给我们造成了疑惑...
  • C++string类仿写

    2018-05-30 18:06:33
    C++编写的类似于string类,自己改动实现相关库函数功能 C++的一般编译器都定义和封装了字符串功能,请模仿定义string类的实现,可以实现并支持如下功能: (1)string s = “rubbish大学”; (2)string t = s; ...
  • Code: public class Example { public Example(double x) { String yuan="亿千百拾万千百十元角分"; String digit="零壹贰叁肆伍陆柒捌玖"; S
  • c++中的string对象的size()和length(),返回的都是字节个数,如何获取字符个数呢?(尤其是字符串里面包含了中文),如下: #include <iostream> using namespace std; //获取utf-8字符个数(utf-8下,英文...
  • 1. size_type find_first_of( const basic_string &amp;str, size_type index = 0 );     查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始,如果没找到就返回string::...
  • C/C++计算字符串的长度

    万次阅读 多人点赞 2019-10-07 18:09:15
    C/C++语言计算字符串长度 1.自定义函数求长度 2.使用strlen()函数 3.使用sizeof()操作符 4.使用length()函数 利用自定义函数的方法: int cont_str(char *s) { int i = 0; while ( str[i++] != '\0') ; return i; ...
  • C++ string字符串初始化

    万次阅读 2018-04-18 11:09:33
    这三种定义c字符串的方式,其中前两种虽然形式不一样但含义是一摸一样的,没有差别,在计算字符长度的时候都会比实际显示的字符长度多1,因为这两种初始化会在字符串末尾默认添加了一个‘/0’。而...
  • C++开发的项目难免会用到STL的string,使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因。
  • C++ string库 resize坑

    千次阅读 2019-12-16 17:52:27
    #include <sys/time.h>... string str1; string str2; str1.resize(100000000); unsigned long realtime; struct timeval ts; unsigned long timecount; gettimeofday(&ts, NULL...
  • C++ 字符串 对象 C++ 字符串 对象 创建方法 C++ 字符串 对象 输出到控制台 C++ 字符串 拼接 C++ 字符串 方法调用 ( 栈内存对象 ) C++ 字符串 方法调用 ( 堆内存对象 ) C / C++ 字符串 完整代码示例
  • C++string类数组的长度(元素个数)

    千次阅读 2018-07-17 08:48:01
    整个数组的长度/第一个元素的长度(长度是固定的) sizeof其作用是返回一个对象或类型所占的内存字节数,在windows下string是28 例子 string A[] = { "Hello "}; sizeof(A)的结果为28,sizeof(A[0])的...
  • 使用string的成员函数length(),获得字符串的有效长度,包括’\n’ 使用string的成员函数size(),获得实际包含元素的个数 不能直接使用strlen函数来获取有效长度,需要先将string转换为char*类型,需要用到c_str()...
  • c++ string 用法详解

    万次阅读 多人点赞 2018-11-13 08:50:27
    c++ string 用法详解
  • C++string类常用方法

    千次阅读 多人点赞 2020-10-09 15:34:26
    C++string类常用方法 1、string(const char *s) :将 string 对象初始化为 s 指向的字符串 string str("hello"); 2、string(size_type n,char c) :创建一个包含 n 个元素的 string 对象,其中每个元素都被初始化为...
  • C++获取字符串长度详解

    千次阅读 2019-08-12 13:04:26
    String 类型对象包括三种求解字符串长度的函数:size() 和 length()、 maxsize()和 capacity(): size() 和 length():这两个函数会返回 string 类型对象中的字符个数,且它们的执行效果相同。 max_size():max_...
  • C++ string详解

    千次阅读 2014-08-15 21:21:59
    C++ string 详解 任何人对本文进行引用都要标明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 语言是个十分优秀的语言,但优秀并不表示...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 185,235
精华内容 74,094
关键字:

c++string长度

c++ 订阅