在Java中,分为两大数据类型,分别是基本数据类型和引用数据类型
对于基本数据类型,又分为八大基本数据类型:
整型,细分为四种:byte short int long
byte 8bit(1位符号位,7位数据位)
short 16bit(1位符号位,15位数据位)
int 32bit(1位符号位,31位数据位)
long 64bit(1位符号位,63位数据位)
浮点型,分为两种:float double
float 32bit(1位符号位,8位阶位(小数点存在的位置),23位数据位)
double 64bit(1位符号位,11位阶位(小数点存在的位置),52位数据位)
布尔类型(boolean)
boolean(布尔)类型有两个值:false和true,用来判断逻辑条件。
数值型和boolean之间不能直接转化。
字符型(char)
1.字符类型实际上是一个16位无符号整数,这个数对应字符的编码
2.java字符类型采用Unicode字符集编码。Unicode是世界通用的定字长字符集,所用字符都是16位
对于1的例子:
public static void main(String[] args) {
char c1 = '中';
char c2 = '\u4e2d';
System.out.println(c1);
System.out.println(c2);
}
//’4e2d‘为’中‘所对应的16位Unicode编码
输出结果:
任何一个字符都可以转化为一个整数,整数的范围是0-65535
public static void main(String[] args) {
int a = '中';
System.out.println(a);
}
输出结果:
在字符型中,有一类情况需要注意:对于不方便输出的字符,如一些有特殊意义的符号,可以采用转义字符表示,如下:
public static void main(String[] args) {
int num = 100;
String json = "{"+"\"count\":"+num+"}";// /斜杠 \反斜杠
String dataString = "[{\"id\":\"1\" ,\"name\":\"张三\"},{\"id\":\"2\" ,\"name\":\"李四\"},{\"id\":\"3\" ,\"name\":\"王五\"}]";
System.out.println(json);
}
在本例中“”有着本来双引号的意义,同时在我们输入字符串时也需要用到"",如果不使用转义字符,会被默认为输入字符串的双引号,在不对称匹配时就会报错。
下面是一些常用的转义字符:
----------------------------------------------------------------------------------------------------------------
转义字符 含义
\n 表示回车
\r 表示换行符
\\ 表示反斜杠( \ )
\' 表示单引号( ' )
\" 表示双引号( " )
---------------------------------------------------------------------------------------------------------------------
上面我们了解了Java的基本数据类型,下面我们再来看一下引用数据类型
Java引用数据类型:
在Java中,除了基本类型之外,其余的类型都属于引用数据类型。如我们的字符串类型String,它在内部存储一个“地址”,这个地址可以指向一个对象在内存中的位置。指向对象的变量就是引用变量,这些变量在声明时被指定为一个特定的类型,比如People、Person等。变量一旦声明后,其类型就不能被改变。
常用的引用数据类型有如下几种:
对于这些引用数据类型,与基本数据类型有着一些不同之处:
1.这些引用数据类型的默认值都为null
2.在存储位置上:基本数据类型变量保存的是值,具体内容是存储在栈中的。而引用数据类型变量保存的是地址,只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址。
在这里需要指出的是String类型的存储:
来看下面这段代码:
String a = "123";
String b = "123";
String c =new String("123");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(b==c);
输出结果:true false false
我们都知道,==是来判断值是否相等,在上面了解到的String字符串类型应该都是指向他们的地址,那为何a,b的地址相同?而他们与c的地址不同?
这是因为,有一个叫做字符串常量池的东西
字符串常量池在JDK 7及之前的版本中位于方法区,而在JDK 7及之后的版本中位于堆区
而在字符串常量池当中,存放着我们写入的字符串,为了节省内存,提高性能,我们通过代码中第一二行这种形式定义的字符串,都会存储到字符串常量池当中,并且,指向字符串常量池中的同一值,其中字符串常量池中的相同内容,为了节省内存空间会共享地址,当我们定义的String类型变量他的值存在于字符串常量池当中,他会直接指向那个值,如没有,会在字符串常量池中创建(除了特别声明,字符串常量池中字符串不重复)
这就很好的解释了为何a==b为何结果为true
那又为什么c又和a,b不同呢?
这是因为new这个关键字,创建了一个新的对象,开辟了一个新的内存空间,这个对象存放的字符串再指向123的内存地址,因此与a,b不同