JAVA 基础数据类型
Java是一种强类型语言, 这就意味着必须为每一个变量声明一种类型, 在Java中一共有8种基本类型, 其中有4种整型,2种浮点型,1种用于表示Unicode编码的字符单元的字符类型char和一种用于表示真值的boolean类型
整型
整型用于表示没有小数部分的数值,它允许是负数.
java提供了4中数据类型
- int 4字节 32位
- short 2字节 16位
- long 8字节 64位, 长整型数值有一个后缀L或l
- byte 1字节 8位
java中int类型与机器无关
16进制数值有一个前缀0x或者0X; 8进制有一个前缀0, 010并不是十进制的10而是二进制的8, 此处也是容易混淆; 从Java7开始,加上前缀0b或0B就可以写二进制数; 并且在java7开始, 就可以用_来表示千分法,例如1_000就表示1千
浮点型
浮点型用于表示有小数部分的数值, 在java中有两种浮点型
- float 4字节
- double 8字节
double表示的这种类型的数值精度是float类型的两倍, 绝大部分应用程序double类型, float类型的数值有一个后缀F或f, 没有后缀F的默认为double类型, 当然也可以在后面加上后缀D或d.
用于表示溢出和出错的三个特殊浮点型, 例如 : 一个正整数除以0的结果为无穷大, 0/0或者负数的平方根结果为NAN
- 正无穷 Double.POSITIVE_INFINITY
- 负无穷 Double.NEGATIVE_INFINITY
- NAN Double.NAN, 注意不能用这个来判断一个数是不是NAN, 他自己甚至不等于他自己, 可以使用Double.isNaN() 来判断
char类型
char类型原本用于表示单个字符
char类型的字面量要用单个引号括起来, 建议不要再程序中使用char类型
Boolean类型
boolean类型有两个值, false和true,用来判断逻辑条件, 整型值和布尔值之间不能进行相互转换.
在python中, 数值或者对象都可以代替boolean值, 值0或者长度等于0的内建对象都是False,
运算符
在java中使用 +,-,*,/表示加减乘除运算.
当参与/运算的两边都是整数时, 表示整数除法,否则表示浮点除法. 整数的求余操作用%表示,
整数被0除时将会产生一个异常, 而浮点数被0除将会得到无穷大或NAN的结果
更多的数学计算都可以在Math库中找到, 比如
import java.lang.Math; public class Hello { public static final int a = 1 ; public static void main(String[] args){ System.out.println(Math.pow(2,3)); // 2**3 System.out.println(Math.sqrt(4)); // 4的平法根 } }
自增,自减
n++,++n 将n当前的值加1
n-- ,--n 将n当前的值-1
这种方法会改变变量的值, 所以不能是数值来操作: 4++
前缀形式会先进行自加操作, 后缀形式会先进行运算操作后进行自加
public class Hello { public static void main(String[] args){ int a=1,b=1; int c = a++; int d = ++b; System.out.println(c); //1 System.out.println(d); //2 } }
比较运算
== , != , >, < , >=, <=
逻辑运算
&&(与), ||(或), !(非)
&&和|| 是按照短路运算方式来求值的, 第一个操作数能够确定表达式的值, 后面的就不会再计算
三元表达式
表达式? 表达式为真时返回的值:表达式为假是返回的值
位运算符
处理整型是, 可以对各个为进行操作
- &(and) 两位全部为1是, 这位就是1
- |(or) 两位有一位为1, 这位就是1
- ^(xor) 异或, 两个值不同返回1
- ~(not) 取反
- >> 左移, 舍弃低位数,前面填充0
- << 右移 舍弃高位数
数值类型之间的转换
当所占字节数少的向所占字节多的类型转换时, 精度不会丢失, 但是下列几种情况有可能会产生精度丢失
- int --> float
- long --> float
- long --> double
自动转换
当两个数值计算时, 都要先转化存储成同一类型, 然后在进行计算
- 如果两个数中有一个是double类型, 另一个操作数就会转化为double类型
- 否则, 有一个数是float类型, 另一个操作数就会转换成float类型
- 否则, 有一个数是long类型, 另一个操作数就会转换成long类型
- 否则, 两个操作数都将会变成int类型
强制转换
有时候需要进行除自动转换之外的转换, 比如double转换为int, java中允许强制类型转换来实现这样的操作,
public class Hello { public static void main(String[] args){ double a=1.98; int b = (int)a; System.out.println(b); } }
强制类型转换来转化浮点数是通过截断小数部分来转换的, 如果想四舍五入可以使用Math.round()方法
如果要转化的类型的长度少于原来的长度, 就会产生一个完全不同的值, 超过部分将会被舍弃
字符串
java没有内置的字符串类型, 而是在标准java类库中提供了一个预定类, 叫做String. 每个用双引号括起来的字符串都是一个String类的一个实例
public class Hello { public static void main(String[] args){ String s = "你好师姐"; System.out.println(s); } }
一些方法
public class Hello { public static void main(String[] args){ String s = "你好师姐"; System.out.println(s.length()); // 返回字符串的长度 System.out.println(s.equals("你好师姐")); // 检测两个字符串是否相等 System.out.println(s.equalsIgnoreCase("你好师姐")); // 检测两个字符串是否相等, 不区分大小写 /* 注意不要用==来判断两个字符串是不是相等, 这个运算符只能够确认两个字符是否放置在同一位置上,实际上只有字符常量是共享内存的, 而+或者substring等操作产生的结果并不是共享的 */ System.out.println(s.substring(0,2)); // 提取子串,顾头不顾尾, 重载可以只指定其实位置 System.out.println(s.startsWith("你")); // 判断是否以某字符串开头 System.out.println(s.endsWith("姐")); //判断是否以某字符串结尾 System.out.println(s.indexOf("姐",2)); // 返回子串开始的位置, 可以指定开始查找的位置, 找不到返回-1 System.out.println(s.replace("师姐","师妹")); // 返回一个替换后的新字符串 System.out.println(s.toLowerCase()); // 全部变小写 System.out.println(s.toUpperCase()); // 全部变大写 System.out.println(s.trim()); // 去除两边空格 System.out.println(String.join(" ","你","好","师","姐")); // 用第一个元素把后面的字符串连接起来 System.out.println(String.format("%s, %s","你好","师姐")); // 字符串格式化 } }
实际上字符串属于不可变数据类型,上面实际上都是返回了一个新的字符串, 像连续+的拼接实际上是很浪费时间空间的,使用StringBuilder类可以避免这个问题的发生
public class Hello { public static void main(String[] args){ StringBuilder i = new StringBuilder(); i.append("你"); // 在后面添加字符 i.append("好"); System.out.println(i.toString()); // 转换成字符串 i.append("师姐"); System.out.println(i.toString()); i.insert(2,","); // 在指定位置插入 System.out.println(i.toString()); i.setCharAt(4,'妹'); // 修改指定位置的字符 System.out.println(i.toString()); i.delete(2,3); // 删除指定位置的字符串 System.out.println(i.toString()); } }
数组
数组是一种数据结构,用来存储同一类型值的集合, 通过一个整型的下标可以访问数组的每一个值,
在声明数组变量时,需要指出数组类型(数组元素类型紧跟[])和数组变量的名字.
int[] a;
不过这条语句只声明了变量a, 并没有将a初始化为一个真正的数组, 应该用new运算符创建数组
int[] a = new int[100]
创建一个数字数组时, 所有的元素初始化为0, 布尔数组的元素初始化为false, 对象数组的元素则初始化为一个特殊值null
除了使用new来初始化之外, 还可以通过{} 在声明时初始化
int[] list={1,2,3,4,5,6}
匿名数组: 创建一个新数组并用括号中的值进行初始化, 数组的大小就是初始值的个数, 使用这种方法可以快速的初始化一个新的数组
public class Hello { public static void main(String[] args) { int[] list; list = new int[]{1,2,3,4,5,6}; } }
一旦创建了数组, 就不能再改变他的大小(但是可以改变数组中的元素), 如果经常需要在运行过程中扩展数组的大小, 就应该使用另一种数据结构-数组列表(array list)
数组拷贝
public class Hello { public static void main(String[] args) { int[] list = {1,2,3,4,5}; int[] list2 = list; list2[1] = 100; for (int a: list){ System.out.println(a); } } }
当使用赋值的方式设置另一个列表时, 这两个变量指向的是同一个地址, 修改一个是另一个也会随之改变
如果不希望产生这样的结果,可以使用Arrays.copyOf()方法
public class Hello { public static void main(String[] args) { int[] list = {1,2,3,4,5}; int[] list2 = Arrays.copyOf(list,list.length); list2[1] = 100; for (int a: list){ System.out.println(a); } } }
其中第二个参数是新数组的大小