Java中的String类型
1、基本类型和引用类型
在C语言里面,是有指针这么一个变量类型的,指针变量保存的就是所要指向内容的地址。在Java里面,没有了指针的这么个说法,而是换了一个词:引用类型变量。
先说Java里面的基本类型,所谓基本类型,很简单,就是一个数字,一个字符或一个布尔值,数字里面包含整型、浮点型等,没有什么好说的。
再说这个引用类型,他的概念就很像指针了。引用变量的值指向内存空间的引用,就是C中的地址,所在这个地址里面的内容就是要被他引用的对象。
2、String就是一个引用类型
大多数时候,我们在用String的时候,就是这么用的:
String str = "balabala";
直接赋值,简单易懂。
其实,还有下面的三种使用String的方式,利用API里面的String构造方法:
String str = new String(char[] array);
array是一个字符数组,这就很形象了,在array里面字符跟字符是分开的,需要array[i]来获取。
通过String的这一个构造方法之后,将“字符”给“串”起来了,就变成了字符串。
另外一种构造方式:
String str = new String(char[] array,int offset,int count);
array还是那个字符数组,offset是指数组中的某一个位置,count值数量,综合的意思就是:将array数组中,从第offset个字符开始的,往后数count个字符的“子数组”,串成字符串。
举例:char[] array = {'a','b','c','d','e','f','g'};String str = new String(array,2,3);
此时str就是cde,数组从0开始数。
最后一个,最简单:
String str = new String("abcdefg");
3、基本类型跟引用类型中“等号”的判断区别
int a = 1; int b = 1; system.out.println(a == b);
输出的是true,因为基本类型中,==是进行值的判断。
String str1 = "abc";String str2 = "abc";system.out.println(str1 == str2);
输出的是true,因为引用类型中,==也是进行值的判断?
不,不是这样的,虽然表面上看,好像是这样,但其实不是的,在仔细看一下下面的例子:
String str1 = "abc";String str2 = new String("abc");system.out.println(str1 == str2);
这时输出的就是false了,然而str1、str2的内容是一样的,这是为什么?
这是因为,引用类型的"=="是进行地址值的判断,判断所引用的内容是不是是一个地址,是不是一个地方的。
所以,反过来说,若引用类型的"=="是false,那么俩个引用类型的引用地址是不同的,这就引出了下面要说的内容了。
为什么str1,str2的内容相同,但是是不同的呢?
4、直接赋值创建跟new String创建的区别
在2中说到了使用String的四种方式,1个直接赋值,3个new创建。
(1)String str1 = "abc";
上面的直接赋值,其实是分成三步的:
第一步,是将“abc”的这个字符串内容在“堆”中创建出来。
第二步,将创建出来的“abc”的地址保存在一个叫做“字符串池”的东西里面。
第三步,将“abc”的地址给str1(即str这个引用类型指向了abc这个字符串所在的内存地址)
这时候,如果再来一个String str2 = "abc";
java会先去字符串池寻址查找是否有这么一个字符串也叫“abc”,如果没有,参见上面三步操作。很明显,我们刚刚创建过,肯定能找到,然后将查找得到的地址也赋给str2。
(2)String str1 = new String("abc");
当使用new的时候,不管内容是什么,不会执行上面的三步,直接在堆中创建一个传新版本的字符串,将字符串abc的地址(假设0x001)再给str1。
这时候再来一个:String str2 = new String("abc");则字符串abc的地址(假设0x002)给str2。
(3)所以,直接赋值的string,如果值相同,那么引用的地址也相同。
而,new出来的,不管值的内容相不相同,地址必然不同,这就是为什么3里面的str1==str2是false的原因了,来张图:

Java中的String类型的更多相关文章
- Java中关于String类型的一些思考
作为初学者在学习Java的时候,变量类型是不可避免会遇到的,在以往我们的印象中字符串String都是作为基本类型而存在的,但是在Java中String类型确是一个实实在在的引用类型,是可以通过new关 ...
- java中关于String 类型数据 的存储方式
Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太 明白Constant Pool到底是个 ...
- Java中关于String类型的10个问题
1. 如何比较两个字符串?用“=”还是equals 简单来说,“==”是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等.只要你想检测俩字符串是不是相等 ...
- Java 中转换为String类型的四种方法
1. 使用 String 的构造方法,用于 byte[], char[], StringBuffer, StringBuilder 类型 2. 使用 String 的静态方法 valueOf() 推荐 ...
- java 中的String类型数据添加双引号
转义符 \ 加上引号 \" <?xml version="1.0"encoding="GBK"?> String temp = &qu ...
- 理解Java中的字符串类型
1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...
- Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!
写在前面 最近小伙伴加群时,我总是问一个问题:Java中的String类占用多大的内存空间?很多小伙伴的回答着实让我哭笑不得,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道 ...
- Java中的Bigdecimal类型运算
Java中的Bigdecimal类型运算 双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提 供的API类BigD ...
- Java中的枚举类型详解
枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...
随机推荐
- ubuntu wubi.exe 直接加载下载好的 amd64.tar.xz
玩了这么久的LINUX,一直都是直机装UBUNTU,虚一下XP的,后来不得不直机用WIN7,只能WUBI装一下UBUNTU了.不得不说,在WIN7下虚一个UBUNTU真是相当麻烦.网络那块很是难搞,而 ...
- (三十一)PickerView自定义视图
例如选择国家,左边是名称右边是国家,不应该使用两列,而是自定义PickerView的一列,可以通过xib来实现. 注意,虽然PickerView也是一列,但是数据源方法是@required,所以必须实 ...
- ORACLE 多表关联 UPDATE 语句
为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id num ...
- 使用GDAL将下载的Google卫星图像转为带坐标的tif
网上有很多下载Google地图的卫片的软件,一般下载下来的图像都是jpg格式的,另外附带一个坐标信息的描述文件.这样的数据不能直接拿来在遥感或者GIS软件中使用,因为图像里面没有投影和坐标信息,所以就 ...
- 2013 QCon北京演讲:跨终端的WebKit渲染机制
转载请注明原文地址:http://blog.csdn.net/milado_nju 1. 该演讲主要介绍WebKit的渲染机制的内部工作原理和一些新的技术,特别是针对不断出现的多种终端所做的一些努力. ...
- C语言中 sscanf 的用法
名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ...
- java工具类(一)之服务端java实现根据地址从百度API获取经纬度
服务端java实现根据地址从百度API获取经纬度 代码: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...
- 关于Service中bindService注意的几个问题
最近有用到Activity需要不断的从Service中获取数据,第一个想法肯定就是通过bind回调机制了,有几点概念模糊特此记录下: 单独使用bindService(),unbindService() ...
- OpenCV 闭合轮廓检测
这个好像是骨头什么的,但是要求轮廓闭合,于是对图片进行一下膨胀操作,再次检测轮廓就好了. // A closed contour.cpp : 定义控制台应用程序的入口点. // #include &q ...
- Java进阶(十五)Java中设置session的详细解释
Java中设置session的详细解释 简单通俗的讲session就是象一个临时的容器,用来存放临时的东西.从你登陆开始就保存在session里,当然你可以自己设置它的有效时间和页面,举个简单的例子: ...