java 基本类型、变量、运算符、字符串
目录1. 整型2. 浮点类型3. char类型、Unicode编码、boolean类型4. 变量4.1 变量初始化4.2 常量5. 运算符5.1 数学函数5.2 数据类型转换5.3 位运算6. 字符串6.1 截取、拼接、判等、空串6.2 码点和代码单元6.2 构建字符串6.3 字符串String的一些常用APIjava一共有8中基本类...
目录
java一共有8中基本类型。
1. 整型
类型 | 长度 | 取值范围 |
byte | 1字节 | 负2的7次方——2的7次方减1 |
short | 2字节 | 负2的15次方——2的15次方减1 |
int | 4字节 | 负2的31次方——2的31次方减1 |
long | 8字节 | 负2的64次方——2的64次方减1 |
在java中,整型的取值范围是固定的,与运行java代码的机器无关,换句话说,就是整型所占的长度是固定的,与平台无关。
2. 浮点类型
类型 | 长度 |
float | 4字节 |
double | 8字节 |
值得注意的是:float类型数值后面有后缀F或者f,如果没有的话,那么小数就默认按照double类型处理,当然可以double类型的数值后面添加D或者d。
3. char类型、Unicode编码、boolean类型
Unicode编码标准出现之前,有很不多不同的编码标准,比如:美国的ASCLL、西欧语言中的ISO 8859-I、俄罗斯的KOI-8、中国的GB 18030等等。编码标准不同,就产生了问题,对于同一个编码值,在不同标准下代表不同的字符,所以为了解决这一问题,设计出Unicode一统天下。
在1991年,Unicode 1.0发布,2个字节,最多可以表示65536个字符。但是后来由于大量汉语、日语、韩语等等文字的加入,16位的Unicode已经无法满足了。所以从Java SE 5.0开始,码点指某个字符对应的编码值,Unicode将字符分为17个级别(比如:基本多语言级别,数学符号等等),第一个级别的码点范围是U+0000~U+FFFF,剩下的16个分别是U+10000~U+1FFFF、U+20000~U+2FFFF、、、、U+100000~U+10FFFF。UTF-16编码方式是Unicode标准的一种实现方式。
java中强烈不建议在程序中使用char类型,除非确实需要处理utf-16代码单元。
boolean类型就是true、false,注意不能与整型值进行相互转换。
4. 变量
变量的声明是类型加变量名。变量名必须是以字母开头,并字母或者数字组成。这里的字母含义更广,不仅仅是英文的26个字母,还有其它的一些Unicode代码值,像什么希腊字符等等;这里的数字的含义也更广,不仅仅是0~9,也包含了其它的一些在某种语言中表示数字的任何Unicode代码值,但是我们如何区分一个字符是否是字母呢?Character类有两个静态方法:
Character.isJavaIdentifierStart(char ch)和 Character.isJavaIdentifierPart(char ch)可以判断一个字符是否是“字母”。
4.1 变量初始化
注意一点:变量未初始化就被使用,会报错。
4.2 常量
常量即是值不改变的变量。使用关键字final声明,一旦声明了之后,该变量只能被赋值一次,之后便不能更改。习惯将常量名全部大写。
在多数地方,final会配合static一起使用,将变量声明为静态常量。
5. 运算符
加、减、乘、除、取模分别为+、-、*、/、%。
运算中,运算结果的精度取决于两个运算数中精度高的那个。
整数被0除,将产生一个异常。浮点数被0除,会得到无穷大或NaN结果。
注意点:对于浮点计算,默认情况下,虚拟机会运算在浮点运算过程中,扩展精度,得出最后的值时,直接按浮点数的位数截断,这样精度更高。但是同时也允许在浮点运算的整个过程中,都保持浮点数的位数进行运算,超出了,就立刻截断,需要用关键字 strictfp 对方法进行修饰,这样的方法中的所有浮点运算都严格按照浮点位数进行截断运算。
5.1 数学函数
主要就是Math类中提供的一些数学函数:
三角函数、反三角函数:sin(double a)、cos、tan、asin、acos、atan;
双曲三角函数:sinh、cosh、tanh;
将角度转换为弧度:toRadians(double a);
将弧度转换为角度:toDegrees(double a);
e的次方(即执行e^a,e是对数的那个e):exp(double a);
底数为e的对数:log(double a);
底数为10的对数:log10(double a);
开平方根(根号几):sqrt(double a);
开立方根:cbrt(double a);
求余a % b:IEEEremainder(double a, double b);
向上取整:ceil(double a);
向下取整:floor(double a);
取整,取a最接近的那个整数,如果a是处于中间,比如1.5,那就取偶数整数2,而不是1,:rint(double a);
求向量(x,y)与x轴的夹角:atan2(double y, double x);
幂运算 a^b :pow(double a, double b);
四舍五入:round(double a)、round(float a);
随机数:random();生成[0, 1)之间的数,伪随机数,生成结果近似平均分布;
求和:int addExact(int a, int b); long addExact(long a, long b);如果结果溢出范围,则抛出异常;
求差a - b:int subtractExact(int a, int b);long subtractExact(long a , long b);如果结果溢出,则抛出异常;
求乘积:int multiplyExact(int a, int b);long multiplyExact(long a, long b);如果结果溢出,则抛出异常;
自增1:int incrementExact(int a); long incrementExact(long a);如果结果溢出,则抛出异常;
自减1:int decrementExact(int a) ; long decrementExact(long a);如果结果溢出,则抛出异常;
改变参数符号,比如100,则变为 -100:int negateExact(int a);long negateExact(long a);如果结果溢出,则抛出异常;
long转int:int toIntExact(long value);
第一个参数除以第二个参数,商进行floor处理:int floorDiv(int x, int y);long floorDiv(long x, long y);
第一个参数取模第二个参数,商进行floor处理:int floorMod(int x, int y); long floorMod(long x, long y);
绝对值:abs(a);
取最大值:max(a, b);
取最小值:min(a, b);
返回参数的符号,参数为整数,返回1,参数为0,返回0,参数为负,返回-1:double signum(double d);float signum(float f);
x^2 + y^2之后再根号:double hypot(double x, double y);
5.2 数据类型转换
下图给了一个基本数据类型转换图,实线箭头表示转换不会损失信息,虚线箭头表示可能会损失信息。想想,byte为8位,short为16位,int为32位,char为16位(如果是utf-16编码的话),long是64位,float是32位(16位整数部分,16位小数部分),double是64位(32位整数部分,32位小数部分)。记住,小转大,不损失,大转小,可能损失。
其次,如果数据类型强制转换,虚拟机是将数据直接进行截断。
5.3 位运算
位运算都是针对整型类型的。 并(&)、或(|)、异或(^)、非(~);注意:非运算的结果不是说7就变成-7,而是变成-8,而-7的非运算结果是6,就是这个规律。
其中 & 和 | 可以用于布尔类型。
按位左移 << ,比如1<<3,即将1向左移动3位。按位右移>>,比如1>>3,即将1向右移动3位。并且都用符号位填充高位。
>>> 运算符和 >> 的作用一样,只是用0去填充高位。
这样的话,操作数分为左操作数和右操作数,如果左操作数是int类型,32位,右操作数是36,那么要模32后,再移动,即移动4位。其它类型同理。
下表是运算符的优先级:
6. 字符串
字符串从概念上讲就是一个Unicode字符序列。
6.1 截取、拼接、判等、空串
substring(int a, int b) 方法可以将一个字符串的[a, b)部分截取出来,长度就是b - a, 字符串的每个字符都有个索引位置,从0开始,如果a和b超出范围,会报错。
substring(int a) 方法将字符串的从a位置开始到末尾结束的部分截取出来。
拼接:字符串 + 字符串 即可。用 + 号连起来即可,如果一个字符串和一个非字符串进行拼接时,会将非字符串转为字符串,然后再拼接。 有一个静态方法 String.join("#", "a", "b", "crr");结果为"a#b#crr",第一个参数为间隔内容,后面的若干个字符串是要拼接的。
判等:使用equals()方法,判断的两个字符串的内容是否一样,equalsIgnoreCase()方法,功能一样,只是不区分大小写。
尽量别用== 判断字符串相等,因为==判断的是两个字符串的存储位置。
空串是"",内容为空,长度为0的字符串,是一个实实在在的java对象。
6.2 码点和代码单元
这两个概念差不多,码点说的是一个字符对应的编码值,代码单元强调的是存储单元。utf-16编码下,一个码点需要的存储空间是一个代码单元。上文已经介绍过,第一级别的字符只需一个代码单元即可,其它的16个级别的字符需要2个代码单元。
"hello".length() 返回的是5,即字符的个数。
"hello".codePointCount(0, 5);返回的是实际的代码单元数量。
charAt(n) ,直接看字符串对应的代码单元返回的是字符串第n个位置的代码单元。一般我们用的字符都是第一级别的,所以一个代码单元对于一个字符,没问题,就怕遇到其它级别的字符,因此尽量别用char类型的原因就在此。
如果我们想查看或者操作码点的话,每个码点其实是int值,int[] codepoints = "hello".codePoints().toArray() 这样将字符串的每个码点转换成整数数组。String str = new String(codepoints, 0, codepoints.length) 将码点数组转换成字符串。
6.2 构建字符串
有时候,我们需要反复地用一些短的字符串来拼接构建出新的字符串,如果直接采用拼接的方式,就会产生新的String对象,导致费时,费空间。于是StringBuilder类就出现了。
StringBuilder builder = new StringBuilder(); 创建一个空的字符串构建器,当需要添加字符串时,就用builder.append("hello");这样方式来添加。当需要构建字符串时,就直接 builder.toString() 方法来构建字符串。
以下是StringBuilder类里面的方法:
6.3 字符串String的一些常用API
更多推荐
所有评论(0)