java基础 1.1数据类型

第一章 语言基础

1.1 数据类型

本人只是个Java超级新的新手,本文也只是为了记笔记,欢迎大佬吐槽并指出不足,万望轻喷

1.1.1 基本数据类型

Java定义了四类共八种基本类型

整型:byte,short,int,long

浮点型:float,double
布尔型:boolean
字符型:char

整数类型的范围

类型数据位范围字节数
byte8-27~27-11
short16-215~215-12
int32-231~231-14
long64-263~263-18

Java的四种基本整型都是带符号位的,至于为什么数据位和范围是如上表,还是得补一下计算机组成原理的知识。。。给忘了。。我对不起老师(っ °Д °;)っ

浮点型的范围

类型数据位范围字节数
float32负数:-3.4 028 235E+38 ~ -1.4E-454
正数:1.4E-45 ~ 3.4 028 235E+38
double64负数:-1.797 693 134 862 315 7E+308 ~ -4.9E-3248
正数:4.9E-324 ~ 1.797 693 134 862 315 7E+308

值得一说的是,一个浮点数隐含位double类型,如果在一个浮点数后面加 “f” 或 “F” 会将其强制转换为float,如果声明float变量时不使用 f 或 F ,系统就会认为这是一个double变量,那么就会报错。

double占了8个字节,有效数字最长15位,因为精度范围是float的两倍而被成为双精度类型。

布尔型

布尔型也叫做逻辑型,boolean,只有 true 和 false 两个逻辑值,所有关系运算如(a==b)等返回的都是布尔型的值

字符型

字符型,又叫做char,采用Unicode字符集,用来存储单个字符,在内存中占了两个字节,是16位无符号的整数,有65536个,取值范围自然是0 ~ 65535,表示在Unicode中的排序位置。

Unicode的字符表的前128个字符刚好是ASCII表,每个国家的字母表的字母都是Unicode中的一个字符,所以Java支持多语种

声明字符型数据的时候使用单引号

char c = 'c';

Java中所有可见的ASCII的字符都可以用单引号来转化内字符,要得到字符在Unicode字符集中的取值,需要强转为int,如 (int)‘a’;

而自然的,一个整数也可以用强转转化为字符型,只要这个整数的值在字符型的范围内

声明常量

通过其他语言很容易知道声明变量,在Java中声明常量需要final标识符,且规范常量是全大写

final int MAX = 10;	

常用转义符

转义符代表意义转义符代表意义
\f换页\n换行
\r回车\t跳格一个制表符
\\\\"一个双引号
\’一个单引号\b退格

1.1.2 字符串类型转化

1)自动类型转换

即自动的会把(转换前后类型兼容)范围较小的数据转化为范围较大的数据

例如

float f = 0.1f;
double d = 0.20;
System.out.println(f+d);

最后会输出一个double的0.30,因为自动转换规则是小的往大的转换,当然转换前后的数据需要兼容,不能指望字符型能够自动转换为整数型吧。

2)字符串类型转化内数值型

数字的字符串可以调用 A.parseX(变量) , A代表数字字符串的内容的包装类,X代表需要转换成的数字类型的包装类。

String myNum = "12.3";
Double myDouble = Float.parseDouble(myNum);
3)强制转化
char c = 'c';
int a = (int)c;

强制转换在接口,对象那里也有用到。

1.1.3 数据类型内存

Java中将内存分为两块,栈内存和堆内存。

显然数据类型,如整型,浮点型等是基础的语法,本人理解Java的数据类型涉及到Jvm虚拟机,整型等基本类型是放在栈内存中,而数组等需要new出来的对象,即显式实例化的是实际放在堆内存中,而对象的名字是存放在栈内存,同时在栈内存中存放了一个地址,指向了堆内存中的对象。例如:

String a = new String("I am a String-object.")

在上述代码中,a是一个字符串实例化的对象的引用变量,这个字符串的内容实际上是存放在堆内存中,而a这个名字和这个字符串在堆内存中的地址是存放在栈内存中的。

而对于下面的代码,情况又有不同:

 Object[] test = new Object[]{"a","b"};

定义了a,b两个字符串,同时将他们传入Object数组中,在这里c这个数组名字是保存在栈内存中,然后c[0]指向了字符串a在堆内存中的地址,c[1]指向了字符串b在堆内存中的地址。

这就是Java中的指针。

当没有一个对象在堆内存中没有任何对象引用时,最后会被GC(垃圾回收器)回收掉。

另外,在Java中一个引用变量只能指向唯一的一个对象,不过同一个对象可以被多个引用变量引用,就好比你只能有一个女神(男神),但你的女神(男神)显然可以有多个备胎。( ̄▽ ̄)" 稍微有点不准确,不过大概是这个意思,代码如下:

MyUser a = new MyUser();
Myuser b;
b=a;

那么,在这种情况下,对a的任何操作,比如更改成员变量值之类,自然也会更改b的值,因为他们根本上引用了同一个东西

1.1.4 基本数据类型拆箱装箱

常用数据类型及其包装类

例如:

int i = 10;
Integer j = 10

后者Integer时int的包装类,这就是装箱,这种使用装箱定义的变量在运算时需要拆箱为int,因此速度较慢。

Integer对象判等方式

Integer a1 = 11;
Integer a2 = 11;

有变量a1和a2如上,那么a1==11当然是true,因为a1拆箱为int。

但是在Java中还有一个特性,就是只对比类对象的引用名而不对比值,结果会是false。但是在这里,当你测试a1和a2是否相等时,结果却会是true,这是为什么呢?

这是因为Java提供了缓存机制,当值范围在整数[-128,127]以内的数,会自动装箱为int类型(使用构造函数时除外),所以这里实际上是两个int在对比,当然想等。

如果你定义如下

Integer b1 = 128;
Integer b2 = 128;

那么当你进行判等时,b1==b2 结果为false,因为这已经超出了自动装箱的范围。

所以类对象对比其值的话,应该使用.equal()方法。

1.1.5 自键盘数据输入输出

从键盘输入

显然有两种键盘输入方式,一种是调用java.io.*的一个方法,不过这种方式异常麻烦,所以只记下了第二种方式

引入java.util类库的Scanner类并实例化对象,通过类对象来输入

import java.util.Scanner
public class test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //sc为对象名,创建Scanner对象用于读取System.in的输入
        double num;
        num = sc.nextDouble();
        //调用.nextDouble,读取double类型的输入并保存
        sc.nextByte();
        sc.nextFloat();
        sc.nextInt();
        sc.nextLong();
        sc.nextDouble();
        sc.nextShort();
        sc.next();
        sc.nextLine()
        //这里列举了一些常用方法
        //.next和.nextLine是用于输入字符串,返回一个字符串类型的数据
        //.next需要读取到有效字符才可以结束输入,空格,回车等不算有效字符
    }
}

上述的nextXX()方法被调用后,则需要用户输入数据后按回车(或者空格等)确认。通常是让sc对象先调用hasNextXXX()方法做判断,再调用.nextXXX()输入数据。

例如输入一个浮点型,用 sc.hasNextFloat() 和 sc.hasNextInt()做判断,则sc.hasNextFloat()为true,可以执行接下来的输入操作 sc.nextFloat()
上述的nextXX()方法被调用后,则需要用户输入数据后按回车(或者空格等)确认。通常是让sc对象先调用hasNextXXX()方法做判断,再调用.nextXXX()输入数据。
例如输入一个浮点型,用 sc.hasNextFloat() 和 sc.hasNextInt()做判断,则sc.hasNextFloat()为true,可以执行接下来的输入操作 sc.nextFloat()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值