1、随机数
Random
可以自己定义一些获取随机数的规则
Random random = new Random();
random.nextInt(); // int范围内产生一个随机数
random.nextInt(10); // 返回0~9之间的随机数
// 通过种子获取一组不变的随机数
Random random = new Random(10);
for(int i = 0; i < 10; i++) {
System.out.println(random.nextInt());
}
2、包装类
Java语言中,new一个对象是存储在堆里的,我们通过栈中的引用来使用这些对象;所以,对象本身来说是比较消耗资源的。
对于经常用到的类型,如int等,如果我们每次使用这种变量的时候都需要new一个Java对象的话,就会比较笨重。
所以,和C++一样,Java提供了基本数据类型,这种数据的变量不需要使用new创建,他们不会在堆上创建,而是直接在栈内存中存储,因此会更加高效。
Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。
把基本数据类型转换成类,包装类提供了很多的方法给我们使用。
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
-
自动拆箱
包装类转换成基本数据类型的过程就是拆包装,英文对应于unboxing,中文翻译为拆箱。
自动拆箱:就是将包装类自动转换成对应的基本数据类型。
Integer i1 = new Integer(100); // 第一种 int i2 = i1.intValue(); // 第二种:自动拆箱 int i3 = i1;
-
自动装箱
包装类是对基本类型的包装,所以,把基本数据类型转换成包装类的过程就是打包装,英文对应于boxing,中文翻译为装箱。
自动装箱: 就是将基本数据类型自动转换成对应的包装类
int i4 = 100; // 自动装箱 Integer i5 = i4;
int i6 = 100; Integer i7 = new Integer(100); Integer i8 = new Integer(100); Integer i9 = 200; Integer i10 = 200; Integer i11 = 100; Integer i12 = 100; System.out.println(i6 == i7); // true System.out.println(i7 == i8); // false System.out.println(i9 == i10); // false 自动装箱,调用了valueOf() 把int转化为对象 System.out.println(i9.intValue() == i10.intValue()); // true System.out.println(i11 == i12); // true -128到127都是从缓存获取,缓存只会保留一个地址的值
3、日期类
Date 日期
Date now = new Date();
System.out.println(now);
System.out.println(now.getHours());
System.out.println(now.getTime());
SimpleDateFormat 格式化日期
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = simpleDateFormat.format(new Date());
System.out.println(date);
String dateStr = "2021-08-01 12:00:00";
try {
Date date2 = simpleDateFormat.parse(dateStr);
System.out.println(date2);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
4、集合Collection
// 一个学生数组
String[] strArr1 = new String[3];
strArr1[0] = "张三";
strArr1[1] = "李四";
strArr1[2] = "王五";
// 添加一个新同学
String[] strArr2 = new String[4];
for(int i = 0; i < strArr1.length; i++) {
strArr2[i] = strArr1[i];
}
strArr2[3] = "赵六";
-
ArrayList
List list = new ArrayList(); list.add("张三"); list.add("李四"); list.add("王五"); String name1 = (String) list.get(0); System.out.println(name1); for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
5、泛型
我们在项目中使用集合基本都是存储同一种数据类型,既然我们在集合中存储同一种数据类型,那么我们事先就得知道这个集合存储什么数据类型,我们就能预先指定要存储的类型
List<String> list = new ArrayList<String>();
list.add("张三");
List<Integer> list = new ArrayList<Integer>();
list.add(100);
6、自定义泛型
语法
class/interface 类名/接口名<T> {
}
T只是泛型的一个标准,使用什么字符都可以,但是都要大写,不要使用特殊符号,建议通T。
public class Animal<T> {
public T name;
public T getName() {
return name;
}
public void setName(T name) {
this.name = name;
}
}
7、可变参数
传入函数的参数个数不固定
public class Test7 {
public static void main(String[] args) {
Test7 test7 = new Test7();
test7.getChangeData("aaa", "bbb", "ccc", "ddd");
}
public void getChangeData(String...strings) {
for(int i = 0; i < strings.length; i++) {
System.out.println(strings[i]);
}
}
}