# 常用数据类型介绍
在Java中, 数据类型除去天生的八大基本数据类型, 除去String以外, 还有许多Java官方给的类, 这些类经常使用.
# Object类
class A{}
这是我瞎定义的A
类, 它没有extends
, 那么它的父类是谁?
很明显, A
对象肯定是一种对象, 父类就是Object
, Object在英文中就是对象的意思.
也就是, 所有的类追溯根源, 它们都是Object
类的子类, 所有对象都属于Object
对象.
Object obj = new String("也就意味着Object变量可以存任何对象");
# String
String还有很多常用的用法.
String str = "ABCdefG";
System.out.println(str.toLowerCase()); //转换为小写
System.out.println(str.toUpperCase()); //转换为大写
System.out.println(str.contains("def")); //判断是不是存在某一字符串
String[] strs = str.split("d"); //将某一String分割成数组
//这里strs是有两个String元素的数组,
//一个元素是 ABC, 另一个是efG
更多有趣的用法你可以在百度查一查.
这里在前排提醒: 玩家用户名的处理离不开toLowerCase
或toUpperCase
! 否则会有安全问题. 想想看, 为什么.
# Math
Math
类给我们提供了很多好用的计算方法, 比如随意列举几个:
Math.sqrt()
: 计算平方根Math.cbrt()
: 计算立方根Math.pow(a, b)
: 计算a的b次方Math.max(a,b)
: 计算a和b间最大值Math.min(a,b)
: 计算a和b间最小值Math.abs(a)
: 取a的绝对值
这里最想提及的是生成随机数.
Math.random()
可以生成一个0≤x<1
范围内的一个随机数. 利用这个原理, 你可以生成a≤x<b
范围内的随机数:
int a = xxx;
int b = xxx;
System.out.println(Math.random() * (b-a) + a);// [1, 3)的double类型的数
# BigInteger和BigDecimal
# BigDecimal解决精度丢失问题
Java中进行浮点数运算可能就会出现这样的问题:
System.out.println(12.0-11.9); //试试看, 结果是0.1吗?
在我的电脑里输出结果如下:
0.09999999999999964
这个现象就是精度丢失问题. 对于浮点数的运算应当特别小心这种问题. 假如你是开银行的, 客户的账户余额要是遇到这种错误, 解释都解释不清楚这是啥情况.
解决这一问题的最好办法就是利用BigDecimal
.
//注意参数需要给String类型的数字字符串
BigDecimal num1 = new BigDecimal("12.0");
BigDecimal num2 = new BigDecimal("11.9");
BigDecimal num3 = num1.subtract(num2); //做减法
double doubleNum = num3.doubleValue(); //可以将其转换为double类型值(那样就变得不精确了)
String str1 = num3.toString(); //为了精确, 这种数字存储的时候干脆就存成String
我们示范的subtract
是减法运算, 还有加、乘、除, 分别是add
, multiply
、divide
. 还有更多运算(取余、乘方等).
下面是两篇非常棒的关于BigDecimal
的内容:
https://www.cnblogs.com/heqiyoujing/p/10409965.html
https://blog.csdn.net/haiyinshushe/article/details/82721234
# BigInteger解决大数字计算问题
Long.MAX_VALUE
通常是是9223372036854775807
, 如果我需要做整数运算, 计算一下9223372036854775807+1
是多少, 很明显算不了, 因为存不下会溢出.
但是利用BigInteger
就能算了, 使用方法与BigDecimal
类似.
BigInteger a=new BigInteger("9223372036854775807");
BigInteger b=new BigInteger("1");
BigInteger result = a.add(b); //这就是最后结果了
你还记得对于整数而言, 除法运算8/5
是多少吗? 是1.6
吗? 试一试!
推荐阅读这些内容:
https://blog.csdn.net/bupa900318/article/details/80330426
# 基本类型的包装
有一个疙瘩始终系在我的心里. 说好的Java里万物皆对象, 可是基本数据类型不是啊!
其实基本数据类型也有它们的对象. Java中将它们包装成了一个个类.
Integer
是int
的包装类, 同理还有Double
、Long
、Float
等, 八大基本数据类型都有其包装类.
现在你应该明白了, 其实我说的Long.MAX_VALUE
就是Long
类里的一个成员常量, 内容恰好是一个最大的long
.
对基本类型的包装, 这里仅做提及, 为的是解释下面的泛型尖括号内的内容的含义. 不做具体阐释.
本教程将不提及泛型.
# List
数组存数据其实很麻烦, 比如我想把数据塞在最后一个位置上就很困难, 比如我想把中间某一数据删掉就会产生一个空位, 比如我想定义的数组我自己都不知道开多大......
List
就可以解决这些问题. 数据永远都是以一个列表状、上下紧挨、不管究竟有多少的状态被存储在List
中.
List<String> stringList = new ArrayList<String>(); //定义一个String类型的数组
String str = "增加一个元素";
stringList.add(str);
System.out.println(stringList.get(0)); //第一个元素还是0
System.out.println(stringList.size()); //数组一共存了几个元素(目前是1)
boolean b = stringList.contains("增加一个元素"); //判断某一元素是否存在
//stringList.remove(0); //删除某一元素
stringList.remove(str); //按对象删除也可以
提醒: 某一对象可以被重复添加到List
中. List
仅保存对象的内存地址, 如果对象本身发生了改变, List
取到的该对象是变化后的.
Player p = 一个玩家;
List<Player> playerList = new ArrayList<Player>(); //玩家列表
playerList.add(p); //现在我把这个玩家添加进去了
// 这个空隙发生了很多事,
// 在此期间, 这个玩家把自己背包里的东西全部丢掉了, 还弄了99999个经验
Player player_meow = playerList.get(0); //取到玩家对象
//这个player_meow是 背包里的东西全部丢掉了, 还弄了99999个经验之后的玩家对象
//当初的那个他, 再也回不来了......
List
可以遍历:
List<String> strList = xxx;
for(String str : strList){
//do something...
}
# Map
Map
会把数据按照key-value键值对的结构存储, 一个Key对应一个Value. 你可以参考一下高中数学必修一集合和初等函数中提到的“映射”的概念, Map
与之类似.
例如, 我们以key :: value
作为例子, 列举一下某个人的一些数字特征:
年龄 :: 18
身上带了多少枚一块钱硬币 :: 18
找过几个女朋友 :: 0
你可以发现, 前面的“项目”是Key, 右面的值是Value, 其中Key不能有重复的, 但是可以有很多个Key对应同一个Value.
//注意, List和Map尖括号里要是想填写基本数据类型, 请填写对应包装类
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("年龄", 18);
map.put("身上带了多少枚一块钱硬币", 18);
map.put("找过几个女朋友", 0);
int girlfriendNum = map.get("找过几个女朋友"); //值为0
boolean b = map.containsKey("吃过几根冰棍"); //不存在这一Key, 值为false
你也可以遍历一个Map
.
for(String key : map.keySet()){
System.out.println(key + "对应的值是: " + map.get(key));
}
# File
File
表示计算机中的某一文件;
File f = new File("D:\\test.txt"); //表示的是 D:\test.txt文件, 还记得为什么是两个\吗?