JAVA学习笔记–数据类型
数据类型分类:
基本数据类型:
单位: bit/位,如0/1
类型名称 | 类型定义 | 取值范围 |
---|---|---|
byte | 8位有符号整数 | -128 ~ 127 |
short | 16位有符号整数 | -32768~ 32767 |
int | 32位有符号整数 | (-2)^31 ~ 2^31 -1 |
long | 64位有符号整数 | (-2)^63 ~ 2^63 -1 |
float | 32位浮点数 | 1.4E-45 ~ 3.4028235E38 |
double | 64位浮点数 | 4.9E-324 ~ 1.7976931348623157E308 |
char | 16位字符 | 0 ~ 65535 |
boolean | 布尔值 | true/false |
注意:
(1)Float和Double的最小值和最大值都是以科学记数法的形式输出的,结尾的“E+数字”表示E之前的数字要乘以10的多少倍。
比如3.14E3就是3.14×1000=3140,3.14E-3就是3.14/1000=0.00314。
(2)Java语言中,默认的整数类型是int类型,声明long类型的时候,后面必须要加个l(字母L的小写)或者L,建议使用大写L,防止和数字1混淆,如:long a=30L;
(3)Java语言中,默认的浮点数类型是double,声明float类型的时候,后面必须添加字母f或者F,如 double num1=3.14; float num2=3.14F / 3.14f;
(4)Java语言中,char类型为16位Unicode字符,Unicode字符中的取值不存在负数范围,所以它的取值范围为 0 ~ 65535,—— 有点类似 “无符号数”;
(5)java语言中,不可以用0或非0的整数替代false和true,这点和c语言不同
(6)java语言中,布尔类型不参与基本数据类型转换
基本数据类型转换:
-
自动转换(隐式转换):
当java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型。
-
char -> int -> long -> float -> double
-
byte -> short -> int -> long -> float -> double
-
//隐式转换 int a='c'; //字符->整型 double d=80;//整形->双精度浮点数
-
当有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后进行计算。
-
(byte、short)和char之间不会自动转换,但可以计算,计算时首先转换为int类型在进行计算。
-
-
强制转换(显示转换):
-
从储存范围大的数据类型到存储范围小的数据类型,可能存在精度丢失
-
double -> float -> long -> int -> short -> byte
-
short a = 3; // 强制类型转换 byte b = (byte)a; int i = 98; // 强制类型转换 char c = (char)i;
-
引用数据类型:
字符串类:
-
String是一个final类,代表不可变的字符序列,字符内容存储在一个final字符数组value[]中。
-
声明与创建: String 字符串名= “字符串常量”;// 存储在方法区常量池
字符串名=new String(字符串常量);//存储在堆中
String name; name="Ding"; // name=new String(Ding);
-
基本数据类型转化为String类:String 字符串名= 基本数据类型的值 + “”;
int n1=100; float n2=1.1f; double n3=3.4; String str1=n1+""; String str2=n2+""; String str3=n3+"";
-
String类型转化为基本数据类型:基本数据类型.parse数据类型(“字符串常量”);
Integer.parseInt("123"); Double.parseDouble("123.23");
-
程序中 +号的用法:从左到右计算,当两边都是数值型时,做加法运算,当两边一方为字符串时,做拼接运算
System.out.println(100+98);//198 System.out.println(100+"98");//10098 System.out.println(100+98+"hello");//198hello
基本数据类型与引用数据类型的区别:
-
定义类型不同:
-
赋值:
-
基本数据类型:在线程栈中直接申请空间进行赋值,在栈中存储值,赋值时之间在栈中进行更改。
int a=10; int b=a; b=100; //a=10,b=100 基本数据类型存储在栈中,具有独立的存储空间
-
字符串类:在线程栈中申请空间,但是在公共堆中开辟空间存储字符串常量,栈中只存储堆中空间的首地址。赋值时根据栈中存储的地址在堆中进行赋值更改,栈中存储的地址不变。字符串默认为NULL,不指向堆中空间。
-
创建时用new
//字符串声明在存储在堆内存中 //开辟一个空间 String str1="abc"; String str2=str1;//存储的地址相同,指向堆中同一个存储空间,值相同 str2="cba";//直接将这个地址内存储的值改变,所以str1和str2都要改变为cba //开辟多个空间 String str1="abc"; String str2="cba"; str2=str1;//此时原本str2指向的堆中空间没有引用变量变成垃圾,会等待GC不定期进行回收与空间的释放
-
创建时不用new
-
-
//通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。字符串常量池中不会存储相同内容的字符串。String str1="abc";String str2="abc";//此时str1和str2存储的地址相同str2="ding";//此时存储的地址不同
-
比较:
-
基本数据类型:可以直接比较,比较的是值,字符型也可以用ascll码进行比较
-
字符串类型:直接比较时,比较的是地址,具体的比较可以用自定义的方法进行比较
static boolean equal(String str1,String str2 ){ //因为主函数是静态的,所以自定义方法必须用静态的 if(str1==str2) //比较地址 return true; if(str1.length()!=str2.length()) //比较长度 return false; int len=str1.length(); //根据字符串长度,进行遍历比较 for(int i=0;i<len;i++){ if(str1.charAt(i)!=str2.charAt(i)) return false; } return true; } //可以直接用 equals() 函数String str1;String str2;boolean b=str1.equals(str2); //返回true或者false
-