# 常用数据类型介绍

在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

更多有趣的用法你可以在百度查一查.
这里在前排提醒: 玩家用户名的处理离不开toLowerCasetoUpperCase! 否则会有安全问题. 想想看, 为什么.

# Math

Math类给我们提供了很多好用的计算方法, 比如随意列举几个:

  1. Math.sqrt(): 计算平方根
  2. Math.cbrt() : 计算立方根
  3. Math.pow(a, b) : 计算a的b次方
  4. Math.max(a,b): 计算a和b间最大值
  5. Math.min(a,b): 计算a和b间最小值
  6. 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, multiplydivide. 还有更多运算(取余、乘方等).

下面是两篇非常棒的关于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中将它们包装成了一个个类.
Integerint的包装类, 同理还有DoubleLongFloat等, 八大基本数据类型都有其包装类.
现在你应该明白了, 其实我说的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文件, 还记得为什么是两个\吗?