理解Java中的字符串类型
1.Java内置对字符串的支持;
所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和wstring类实现与C语言兼容和Unicode标准。Java内部通过String类实现对字符串类型的支持。
这意味着:我们可以直接对字符串常量调用和String对象同样的方法:
//可以再"abc"上直接调用String对象的所有方法
int length="abc".length();
以及
String abc=new String("abc");
int length=abc.length();
2.Java中的字符串值是constant(常量的)
这里的意思是字符串类型在创建完成之后,是不能改变其中的值的,从String的成员方法也可以看出没有能改变值的方法接口;并且像"abc",new String("def")中的”abc","def"存放于Java虚拟机中的常量池。
以下的代码中的"abc"存放于常量池中,因此变量a,ab指向的地址均为常量池中同一个"abc"。
public class StringTest {
public static void main(String[] args) {
String a="abc";
String ab="abc";
String abc=new String("abc");
System.out.println(ab==a);
System.out.println(a==abc);
}
}
/*程序输出:
* true
* false
* */
那么动态生成的、可变的字符串又是如何实现的呢?Java中提供StringBuffer和StringBuilder类实现这一需求;Java中字符串连接可以使用“+”操作符; 如:"abc"+"def";这里的内部实现也可以使用StringBuilder类或者StringBuffer类实现;那么StringBuilder和StringBuffer内部又是如何实现呢?是通过字符数组存储字符串。以下是从JDK附带的源码中找到的片段,可以看出StringBuffer内部使用char数组对字符串进行存储,其中的AbstractStringBuilder是StringBuffer的父类:

3.字符串中的编码问题。
这里要理解两个问题:如何处理源文件中的字符串编码?编译成class文件或者是代码在Java虚拟机运行时字符串是采用什么编码的?
第一个问题的理解是:源代码中的字符串编码取决于你的IDE或者文本编辑器。如以下的代码是使用GBK编码格式下编辑,然后使用UTF-8和GBK解码打开
//GBK编码格式,使用GBK格式打开

//GBK编码格式,使用UTF-8格式打开,乱码;如果此时系统默认的编码格式不是GBK时,在编译时需要在javac加入"-encoding GBK"参数选项值;

那么如何处理这种源代码编码的问题呢?答案是在编译器javac的参数选项-encoding中指定,默认这一参数的值是跟系统默认的编码一致。Windows的默认编码一般为GBK (可以通过System.getProperty("file.encoding")获得该值);在系统默认编码为GBK,但是源代码使用UTF-8编码,此时应该使用 javac -encoding UTF-8 进行编译。
对 ”编译成class文件或者是代码在Java虚拟机运行时字符串是采用什么编码的?“ 这个问题的理解是:首先,Java中的String类型是采用UTF-16编码实现的,也就是不管在源码的编码如何,在Java虚拟机中的字符串都是使用UTF-16编码实现。这意味着只要编译器javac正确的理解了源码文件中字符串的编码,运行时或者class字节码文件中的字符串是独立于源码中的编码格式的。这里我们可以进一步对java中的char基本类型或者Character类进行理解解,这两者内部的编码和java的字符串类型一样,都是基于UTF-16编码实现的,也就是不论‘a','1'这样的字符还是汉字在Java中的长度都是16位。
并且在String类型中也有着通过指定定字符编码,对底层二进制表示和字符串之间进行转化,也就意味着我们可以正确地读取GBK编码、UTF-8编码或者其他编码的文本文件或者其他输入流将其转化为内存中正确的字符串。
如String类中有如下的方法:
public String(byte[] bytes, Charset charset);通过指定定字符集编码类型,和相应的byte数组(byte长度为8位)构造字符串;
public byte[] getBytes(Charset charset);指定字符集编码类型,将字符串转化为byte数组,即字符串的二进制表示。
还有需要注意String的另一个成员方法:
public byte[] getBytes();这个方法返回的byte数组,所根据的字符集编码是指平台默认的字符集编码,而不一定是UTF-16。
理解Java中的字符串类型的更多相关文章
- java中,字符串类型的时间数据怎样转换成date类型。
将字符串类型的时间转换成date类型可以使用SimpleDateFormat来转换,具体方法如下:1.定义一个字符串类型的时间:2.创建一个SimpleDateFormat对象并设置格式:3.最后使用 ...
- 深入理解java中的byte类型
作者 | 进击的石头--GO! 来源 | https://www.cnblogs.com/zl181015/p/9435035.html#4432849 Java也提供了一个byte数据类型,并且是基 ...
- Java中的字符串驻留
转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = “hello” + “world”;被 ...
- 深入学习Java中的字符串,代码点和代码单元
在Java字符串处理时,在使用length和charAt方法时,应该格外小心,因为length返回的是UTF-16编码表示下的代码单元数量,而非我们所认为的字符的个数,charAt方法返回的是指定位置 ...
- 第48篇 说说.Net与Java中的字符串
原文地址:http://blog.laofu.online/2017/08/18/String-In-dotnet-Java/ Java字符串碰到的问题 在写Java程序碰到一个问题,而正是这个问题引 ...
- 深入理解Java中的IO
深入理解Java中的IO 引言: 对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务 < Thinking in Java > 本文的目录视图如下: ...
- 详解Java中的字符串
字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...
- 理解Java中字符流与字节流的区别
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- 理解Java中的弱引用(Weak Reference)
本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出, ...
随机推荐
- Add And Reset a Federation Server to a Federation Server Farm adfs ad
Applies To: Active Directory Federation Services (AD FS) 2.0 After you install the Active Directory ...
- [置顶] 漫谈SOA(面向服务架构)
面向服务架构的思想在整个软件的架构中已经不是什么新鲜的东西.我简单的认为服务化是模块化的延伸,所以服务化有着和模块化类似的优点和缺点.这里不再讨论这些服务定义服务与服务之间的通信协议(像WSDL等等) ...
- 【三支火把】---C语言面试问题总结
看了一份关于HR在面试一名C程序员可能提问的问题手册,学到了很多,很多都是一些琐碎的知识点,总是你写过很多大型的C程序,但是我敢说,里面也有你没掌握的东西. 1.全局变量和局部变量有何区别? 答:全局 ...
- DevExpress GridControl GridView 导出到 Excel 类
说明: 1>GridView 导出到 Excel (如果分页,只导出当前页数据) 2>GridView 导出到 Excel 3>方法2可以参考DataTable 导出到 Excel ...
- Add-VMNetworkAdapterAcl(添加访问控制列表)
Add-VMNetworkAdapterAclCreates an ACL to apply to the traffic through a virtual machine network adap ...
- ThinkPHP函数详解:M方法
M方法用于实例化一个基础模型类,和D方法的区别在于:1.不需要自定义模型类,减少IO加载,性能较好:2.实例化后只能调用基础模型类(默认是Model类)中的方法:3.可以在实例化的时候指定表前缀.数据 ...
- 详解ExplosionField的使用,实现View的粉碎效果
小米平板卸载软件的时候,会有一个粉碎的效果,看起来很拉风,GitHub上有一个开源控件可以实现这个效果,我们一起来看看.先来看看效果图: 看起来不错吧,那我们今天就来详细说说ExplosionFiel ...
- 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
转载请注明 ☞ http://blog.csdn.net/leverage_1229 上周为360全景项目引入了图片缓存模块.因为是在Android4.0平台以上运作,出于惯性,都会在设计之前查阅相关 ...
- oracle数据库入门
oracle 数据库入门. 1.数据 2.数据存储的地方:变量 数组 容器 (内存中),文件,数据库(文件) 3.数据库系统:sqlserver 2000 2005 2008 mysql 5 ...
- the forth assignment of software testing
软件测试用到的 pict33.msi. 加载安装即可. 顺步安装 使用背景: 假如现在有一个网站后台需要测试工程师进行测试用例设计.用常规的方法将参数列出: 帐户名: 空,不存在,超长,超短,正常 密 ...