Java基础入门之数据类型

Java的基础学习记录一

数据类型

Java数据类型可以分为:基本类型、引用类型
基本类型:整数型(byte、short、int、long)、浮点型(float、double)布尔型(true、false)、字符型(char)
引用类型: 数组(array)、类(class)、接口(interface),还有一个比较特殊的String类,可以当字符串操作

一、基本数据类型

整数型数据类型

1、byte 占8个字节 取值范围 -128 ~ 127 即 -2的7次方 ~ 2的7次方 - 1
2、short 占16个字节 取值范围 -32768 ~ 32767 即 -2的15次方 ~ 2的15次方 - 1
3、int 占32个字节 取值范围 -2147483648 ~ 2147483647 即 -2的31次方 ~ 2的31次方 - 1
4、long 占64个字节 取值范围 -9223372036854775808 ~ 9223372036854775807 即 -2的63次方 ~ 2的63次方 - 1
注意:
a、整数型的默认值都为0
b、整型在转换的过程中,从范围大的转范围小的可以自动转换。相反,则需要强制转换,一般不推荐因为可能会出现精度丢失。
c、整数型进行运算的时候返回值的结果自动进行转换

int num = 10 //这里的10就是整数型int
byte  num1 = 15; //在没有超过byte的取值返回,会自动进行类型转换
byte num2 = (byte)128; //一旦超过取值返回,必须进行强制转换
int result = 5/2; //正常计算为2.5,赋给int result变量进行自动转换为2

浮点型数据类型

1、float 占32个字节 取值范围为 1.4E-45 ~ 3.4028235E38,即 2的-149次方 到2的128次方 -1
2、double 占64个字节 取值范围为 4.9E-324 ~1.7976931348623157E308
即2的-1074次方 ~ 2的1024次方-1
注意:
a、浮点型的默认值都为0.0
b、整型在转换的过程中,从范围大的转范围小的可以自动转换。相反,则需要强制转换,一般不推荐因为可能会出现精度丢失。
c、整数型进行运算的时候返回值的结果自动进行转换

float num = 3.0;//这里3.0为float型
double num = 4.0;//这里4.0为double型
double result = 5/2;//result结果为2.5,这与整数型的结果不一致

布尔型数据类型

1、true 表示逻辑的真
2、false 表示逻辑的假

if(flag == true){
	//条件成立
}
if(flag == false)
	//条件不成立
}

注意:
a、部分编程语言不仅仅有true 或者 false ,0、“”、“0”也可以被当成布尔值中的false ,而1、非0的数据都被当成true。在java中只有true或者false。

##字符型数据类型
1、通过单引号’ ‘包起来的字符,如’a’、'b’等,是可以包含中文字符的。
注意:
a、字符型跟数值型是可以相互转化的,他们是用过编码表联系在一起,如
b、0和‘0’是不一样的,‘0’在转换为数值型的时候并不等同于0,而是等于编码为0的二进制

char a = 'A';
char b = 'A'+ 1;
int num = c;
System.out.println(c);//这里的结果为65
System.out.println(b);//这里的结果为b

b、字符型只能够包含有一个字符并且被‘’单引号包含

##特殊的字符串类型(String)
字符串是一个比较特殊的例子,Java中没有字符串这种数据类型,但是在开发过程中是比较需要这种数据类型的,所以Java中有个String类用来解决字符串问题。这个类比较特殊,一般类的使用是需要通过对象或者静态调用的形式,但是String内部做了特殊的操作(“”)直接使用双引号也相当于调用了String类,也可以直接实例化String对象

String str = "This is a String 1"; //直接使用双引号
String str2 = new String("This is a String 2");//使用实例化对象的方式

注意:
a、在字符串和数值类型进行+的时候,这时候的+并不是传统数值的+,而是字符串的拼接
字符串类型是一个比较特殊而且复杂的类型,至于其他一些复杂的东西到后面再一一记录吧。

二、引用数据类型

在java中引用类型是比较常用且重要的一种数据类型。引用的话就会牵扯到内存的使用,包括堆栈的使用。如类、数组、接口这些引用数据类型它们的使用都与内存息息相关。

数组类型

1、数组初始化方式:动态初始化、静态初始化
动态初始化:在数组声明的时候为其设置固定长度且默认内容为数组数据类型的默认值
声明以及初始化方式:

//声明格式:数据类型 数组名称 [] = new 数据类型[数组长度]
int intArray [] = new int[10];//定义了一个数组长度为10的int数组
int [] intArray = new int[10];//两种声明格式都一样

静态初始化 :在数组声明的时候就设置好了数组的内容
声明以及初始化方式:

//声明格式:数据类型 数组名称 [] = new 数据类型[数组长度]
int intArray [] = {12345};//简化格式,但是一般不推荐
int [] intArray = new int{123456};//声明了一个int数组并且数组内容为{1,2,3,4,5,6}

2、数组的使用:
a、使用 数组名[数组下标]的方式,下标从0开始。有可能会存在下标越界的错误,在使用了超过下标值的数组值。
b、数组常用于循环遍历:for以及for增强型循环的方式

int arrayData [] = new int []{1,2,3,4,5,6,7};//静态初始化一个数组
//使用for循环遍历数组
for(int i = 0; i< arrayData.length;i++){
	System.out.println("下标值为"+i+"的值为:"+arrayData[i]);
}
//使用增强型for循环遍历数组
for(int temp : arrayData){
	System.out.println(temp);
}

两种循环方式都能够遍历数组,但是第一种方式要是判断不正确下标值可能会出现下标越界的错误,第二种则很好的规避了这个问题,但是在使用效果上面两个都是一样的。
3、数组内存分析:
数组是引用类型的数据,也就是说它跟内存是离不开的。我们发现在声明以及初始化数组的时候,有一个关键字new,这是一个开辟内存的标识。在java中new 任何对象都是在向堆内存开辟一个存储空间。画一个简单的内存图:
在这里插入图片描述
上图的内存图就好比创建了一个名字为array的数组,他的长度为4,数组内容为别为60、43、23、34

int array [] = new int[]{60,43,23,34}

我们每次声明的变量名都是存放在栈内容,就好比把名字放了栈内存,而堆内存存放的是一个引用类型的数据,其实就是一个内存地址。在上图中,array[0]对应了一个array[0]的地址,而array[0]的地址就链接到60这个内存地址。第一给个array[0]跟第二个array[0]是有所区别的虽然他们都是一样的名称。在这里只是对内存分析按照我个人的理解简单分析,具体更深入深层的分析要随着个人对于内存引用的深入才能有更好的理解。

4、方法可变传参
在很多情况下,我们需要传递变长的参数。在传统的写法中,提到变长(也就是长度不确定的情况)我们会想到用一个参数数组,这种方法也可以实现,但是有一种更加简洁的方式,就是使用变长参数。在jdk1.5之后引入了这个特性。

public void mulitParamters(int ... data){
	for(int temp : data){
		System.out.println(temp);
	}
}
//使用方式
mulitParamters(1,2,3,4,5);//系统会自动将这些参数转变为一个数组去操作

通过变长参数的方式使我们的需求更加简洁容易去实现。

至于数组的其他一些用法更多的还是要在平时编码的过程中去熟练,这里就不一一记录的。多看api文档多敲键盘~数组是每一门变成语言中必不可要的一部分也是非常重要在一部分,在以后也项目开发中可能很少会使用到简单的数组,但是想集合以及一起一些数据结构都是跟数组离不开的。

字符串类型

在大多数编程语言中,很少有字符串这种概念。但是在实际开发中却是必不可少的。java中,利用了char数组以及byte数组原理拼接成字符串,也就是利用了String类,它的底层原理就是利用char数据(在jdk8之前),也利用了byte数组(在jdk8以后)。

字符串的定义:

1、使用直接赋值的方式

String str = "This is a String"; //利用双引号直接赋值的方式定义

2、使用实例化String类对象创建

String str = new String("This is a String");//通过实例化创建字符串对象

这两种方式的创建效果上相同,在创建行为还是有很大的不同。下面分析一下这两种创建方式的不同
第一种是通过双引号直接创建一个字符串,而这个字符串是直接放在了一个字符串常量池里面的,就好比你买了一个东西一样,之后你如果还需要这个东西是可以直接拿出来用,不需要再去买了,而如果这件东西数据库常量池 没有的话,第一次是需要去购买的而以后再次需要就不用了。

String str = "goldenlee";
String str1 = "goldenlee";

这两个字符串按照传统的理解方式应该是创建了两个字符串对象,但是实际情况是str利用双引号创建了一个内容为goldenlee的字符串,随后将这个字符串放进了常量池,str1这个对象赋值的时候直接从常量池中取出这个字符串,并不需要再次创建,也就是说共享了这个字符串。在使用这种创建方式,是可以适当的减少内存消耗的。

第二种通过实例化String类对象创建

String str = new String("goldenlee");
String str1 = new String("goldenlee");

以上这两个字符串是通过创建实例化对象创建的,在初始化的时候也使用了双引号,也就是说会产生字符串对象放进常量池,但是在这里的话goldenlee这个字符串只产生一次,第二次的话就是直接从常量池里面取出来 。但是这里并不是通过这种方式产生,而是将这个字符串传递给String类,从而产生一个String类的实例对象,也就是说这里的两个字符串的创建分别创建了两个String的对象,他们的内容是互不共享的。

通过比较这两种创建方式,发现前者的内存性能相对较好,但是实现上却没有那么直观,会让人误以为这只是一个简单的字符串,而实际上 这是一个String类的字符串对象,后者的直观性比较好,别人一看就知道这是个对象可以操作方法,但是在创建上会产生一些垃圾,所以个人建议使用第一种方式比较好。

字符串常量池:静态常量池、运行常量池

池一般来说就是防止东西的地方,就好像仓库一样需要的时候就拿出来用,不需要的时候就放在里面。
静态常量池:很多时候我们在项目编码阶段就定义好了通过双引号创建的字符串常量就会直接放入这个静态常量池。
运行常量池:我们在项目运行的时候动态地通过双引号创建的字符串常量就会放入动态常量池。

String str = "Thisis a Str";//在编译阶段已经创建好的,会放入静态常量池
String info = "This is a Str1";
String str1 = info + "goldenlee";//因为info是变量会动态发生变化的,所以在编译阶段不会放入静态常量池,而会在运行阶段放入运行常量池

字符串常量

字符串在被创建之后是不会被改变的,也就是说字符串是一个常量。

String str = "String Demo";//这个String Demo 一旦被创建它就一直是Strig demo
String str= "123";//str对象变成了123,实际上是str这个对象发生了变化,而之前的String Demo 还是String Demo

其他一些String的类库方法就不在这里一一详细描述,字符串在实际设计开发之中是相当重要的,要掌握Strig字符串不是很容易,需要在平时的开发实践中去熟练而已总结领悟。

总结

为什么要记录这些比较基础性的东西呢,因为之前以前一直写的是PHP,陆陆续续也接触过javaee,。现在想重新学习java,就边复习以前学习过的模糊的知识点回忆起来。另一方面就是为了记录自己的学习,让自己的成长以及学习的计划有一个清楚的脉络。加油~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章