这个问题其实还是有必要去谈一谈的,在我们进行字符串赋值的时候一般不会注意到string的长度什么的,因为一般达不到,但是有个特殊的字符串比较长,那就是Base64转码;

base64是进行图片传输的时候特殊的编码方式,这个字符就很长,超过了string的“编译时”接收最大长度。为什么说是编译时呢?带着问题我们走入今天的主题!

首先要知道String的长度限制我们就需要知道String是怎么存储字符串的,String其实是使用的一个char类型的数组来存储字符串中的字符的。
那么String既然是数组存储那数组会有长度的限制吗?是的有限制,但是是在有先提条件下的,我们看看String中返回length的方法

整数在java中是有限制的,我们通过源码来看看int类型对应的包装类Integer可以看到,其长度最大限制为2^31 -1,那么说明了数组的长度是0~231-1,那么计算一下就是(231-1 = 2147483647 = 4GB)

Integer的取值范围

看到这我们尝试通过编码来验证一下上述观点。
以上是我通过定义字面量的形式构造的10万个字符的字符串,编译之后虚拟机提示报错,说我们的字符串长度过长,不是说好了可以存21亿个吗?为什么才10万个就报错了呢?

其实这里涉及到了JVM编译规范的限制了,其实JVM在编译时,如果我们将字符串定义成了字面量的形式,编译时JVM是会将其存放在常量池中,这时候JVM对这个常量池存储String类型做出了限制,

至于关于JVM的那块我就不做赘述了,放在文末的原文里了,感兴趣的读者可以看看

问:字符串有长度限制吗?是多少?

答:首先字符串的内容是由一个字符数组 char[] 来存储的,由于数组的长度及索引是整数,且String类中返回字符串长度的方法length() 的返回值也是int ,所以通过查看java源码中的类Integer我们可以看到Integer的最大范围是2^31 -1,由于数组是从0开始的,所以数组的最大长度可以使【0~2^31-1】通过计算是大概4GB。

但是通过翻阅java虚拟机手册对class文件格式的定义以及常量池中对String类型的结构体定义我们可以知道对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。其实是65535,但是由于JVM需要有一个结束指令,所以这个范围就为65534了。超出这个范围在编译时期是会报错的,但是运行时拼接或者赋值的话范围是在整形的最大范围。

这里附上一个通过base64进行加密解密的操作:
百度里在线base64图片转码:
![在这里插入图片描述](https://img-blog.csdnimg.cn/d73a742a1fbf4b7fbe5da2a3139da660.png

解码操作:

protected static String generateImage(String imgStr, String path) throws IOException {// data:image/jpeg;base64,int start = imgStr.indexOf("/");int end = imgStr.indexOf(";");String ext = "." + imgStr.substring(start + 1, end);imgStr = imgStr.substring(imgStr.indexOf(",") + 1);// Base64解码BASE64Decoder decoder = new BASE64Decoder();byte[] b = decoder.decodeBuffer(imgStr);for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {b[i] += 256;}}// 存放位置,文件夹按日期区分SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");SimpleDateFormat fileSdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");String time = sdf.format(new Date());String fileName = fileSdf.format(new Date()) + ext;File file = new File("C:/file_upload/" + path + time);if(!file.exists()){file.mkdirs();}OutputStream out = new FileOutputStream(file + "/" + fileName);out.write(b);out.flush();out.close();String photo_address = path + time + "/" + fileName;return photo_address;
}

加密操作:

protected String getImageStr(String filePath) {InputStream inputStream = null;byte[] data = null;try {inputStream = new FileInputStream(filePath);data = new byte[inputStream.available()];inputStream.read(data);inputStream.close();} catch (IOException e) {e.printStackTrace();}// 加密BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);
}

我之前做的没有上述的那样拆分,直接就是通过substring(22)拿掉了前面的22位(我的是png,注意这个位数,有的是jpeg就是23.)
附上我自己项目里的代码

 public static boolean generateImage(String imgStr, String filePath, String fileName) {try {if (imgStr == null) {return false;}/** Base64 要求把每三个8Bit 的字节转换为四个6Bit 的字节(3*8 = 4*6 = 24 ),然后把6Bit 再添两位高位0 ,* 组成四个8Bit 的字节,也就是说,转换后的字符串理论上将要比原来的长1/3 。* */BASE64Decoder decoder = new BASE64Decoder();byte[] b = decoder.decodeBuffer(imgStr);File file = new File(filePath);if (!file.exists()) {file.mkdirs();}OutputStream out = new FileOutputStream(filePath+fileName);out.write(b);out.flush();out.close();return true;} catch (Exception e) {return false;}}

参考文章:
面试官:String长度有限制吗?是多少?还好我看过

【Java】# Java对图片进行base64编解码

java中string长度有限制吗,最大是多少?相关推荐

  1. Java中String 长度限制:常量字符串过长

    测试的时候遇到这个问题,idea编译不过,String 赋值的常量字符串过长. 那么String 有没有长度限制呢 编译检验 jdk源码分析Gen.class 类中如果时String 类型长度不能大于 ...

  2. MySql中varchar类型长度的含义、Java中String长度的含义

    varchar(5)表示的是字符长度5,不是字节数

  3. java中String的常用方法

    java中String的常用方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len ...

  4. int的长度_Java中String长度有限制吗?身边的同事每一个人知道!

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 www.toutiao.com/i6893014573322863111 推荐: ...

  5. Java中String类的方法及说明

    String : 字符串类型 一.构造函数      String(byte[ ] bytes):通过byte数组构造字符串对象.      String(char[ ] value):通过char数 ...

  6. Java中String和byte[]间的转换浅析

    Java语言中字符串类型和字节数组类型相互之间的转换经常发生,网上的分析及代码也比较多,本文将分析总结常规的byte[]和String间的转换以及十六进制String和byte[]间相互转换的原理及实 ...

  7. java substr函数_oracle 中的substr()函数的用法,以及与java中String.substring()方法的区别...

    oracle 中的substr()函数的规则是 substr( string, start_position, [ length ] ) 说明: string 是要分割的字符串 start_posit ...

  8. java中String相等问题

    判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是"==",但在java中不能这么写.在java中,用的是equals(); 例:A字符串和B和字符串比较 ...

  9. Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释

    Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...

最新文章

  1. GT Transceiver的总体架构梳理
  2. java webstart 自动升级_windows – 使用java web start实现自动更新桌面应用程序时的AWTPermission异常...
  3. VTK:网格之FitToHeightMap
  4. mysql查询单词出现的位置_在MySQL中从左侧获取一些单词
  5. CSS盒子的三种类型(border-box、content-box)
  6. html5泵站,基于 HTML5 WebGL 的污水处理厂泵站自控系统
  7. 环形博弈 HDU - 3951
  8. 一般用法(IPG写)
  9. python 换页_Python之路【第十九篇】自定义分页实现(模块化)
  10. 4.数据中台 --- 数据中台建设的评估与选择
  11. 末转变者登录服务器一直在排队,魔兽世界:国服神级服务器,排队持续两年,哈霍兰有何特别之处?...
  12. oracle分页优化
  13. css中给文字加框,让CSS3给你的文字加上边框宽度,并实现镂空效果
  14. 雷课堂(THUnderClass)——清华大学2020C++大作业个人项目记录与总结
  15. 云打码的简单使用举例
  16. WPS文字在线转换成Word
  17. JPBC库(基于配对的密码学)入门和避坑指南
  18. python pyqt5 股票分时_pythonpyqt5股票分时:股票风险与提示_XAC配资之家
  19. windows 2008 server 服务器远程桌面连接会话自动注销,在服务器上开掉的软件全部自动关闭的解决办法...
  20. 查看Git本地安装位置

热门文章

  1. 记录一下NotImplementedError: Cannot convert a symbolic Tensor的解决办法
  2. .Net Core 集成 RabbitMQ 订阅与发送
  3. CSDN博客运营团队2022年H2总结
  4. 公司新来了个00后卷王,一副毛头小子的样儿,哪想到...
  5. ReactDOM.render(...) 渲染方法
  6. 利用黑盒测试技术设计测试用例
  7. PotPlayer 播放器美化设置
  8. 直播app源代码,Http方式请求网络
  9. 计算机网络期末复习知识点
  10. echarts 折线图设置曲线平滑