一、反射
反射机制是在运行阶段,对于任意一个类,都能知道这个类的所有属性和方法(包括private的类),并且对任意一个对象,都能调用它的任意一个方法和属性。
一般应用在框架中,主要是使用他的动态性。当编写代码时并不知道运行之后会有哪些对象被创建出来,这时候就可以用反射的api来动态的对对象进行操作。
1.反射中Class获取的方法
- 类名.class
- 对象.getClass()
- Class.forName("全路径")
2.获取Class与实例化
使用对象.getDeclaredConstructor().newInstance()进行实例化
public class User{ //创建一个个类
}
Class clazz = User.class; //初始化一个类的对象
User user = (User) clazz.getDeclaredConstructor().newInstance();
3.获取构造方法
Class clazz = User.class;
//获取所有public构造方法
Constructor[] constructors = clazz.getConstructors();
//获取所有构造方法(public和private)
Constructor[] constructorsAll = clazz.getDeclaredConstructors();
4.获取属性
Class clazz = User.class;
//获取所有public属性
Field[] fields = clazz.getFields();
//获取所有属性
Field[] fieldAlls = clazz.getDeclaredFields();
5.获取方法
//获取所有public方法
Method[] methods = clazz.getMethods;
//获取所有方法
Method[] methodsAll = clazz.getDeclaredMethods;
调用方法:
methods[0].invoke();
二、常用类
1.String
String相关方法
String转其他包装类或基本数据类型
用parseXXX()
String str1 = "123";
int num = Integer.parseInt(str1);
其他包装类或基本数据类型转String
用valueOf()
String str2 = String.valueOf(num);
用toString()
int num = 15;
String str = Integer.toString(num);
String和 char[] 转换
String 转 char[]: toCharArray(); char[] 转 String: 用String的构造器
String str1 = "abc123";
char[] charArray = str1.toCharArray();
String str2 = new String(charArray);
StringBuilder 和 StringBuffer
StringBuffer:线程安全,效率低
StringBuilder:jdk5.0新增,线程不安全,效率高
Stringbuffer和StringBuilder的方法一样
2.日期时间
LocalDate
LocalTime
LocalDateTime 最常用
Instant 瞬时
DateTimeFormatter 格式化时间
3.JAVA比较器
一般情况下,在JAVA中只能使用 ==, != 来比较对象,但在实际业务中,比如要对一个班的学生按成绩进行排序,就需要对对象进行比较,可以使用Comparable或Comparator进行比较。
4.System类
系统级的很多属性和控制方法都放置在该类的内部,如退出程序、请求系统进行垃圾回收等。
5.Math类
提供了一系列用于科学计算的静态方法,参数和返回值类型一般为double。
6.BigInteger与BigDecimal
BigInteger
int类型最多能存,而long最多也只能存,java.math包的BigInteger可用来表示不可变的任意精度的整数。
构造器:BigInteger(String val) 根据字符串构建BigInteger对象
BigDecimal
在商业计算中要求数字精度比较高,就需要用到java.math.BigDecimal类,BigDecimal类支持不可变的、人已经读的有符号十进制定点数
构造器:
- BigDecimal(double val)
- BigDecimal(String val)
三、集合
1.Colection概述
Collection接口继承树
2.Collection常用接口方法
3.遍历集合
可以使用迭代器Iterable接口或foreach(增强for循环,内部原理也是Iterable迭代器)
for (数据类型 局部变量 : 集合或数组) {
要进行的操作;
}
int[] nums = new int[] {1,2,3,4};
for (int num : nums) {
sout(num);
}
4.Collection子接口-List接口-Vector、ArrayList、LinkedList
特点:有序、可重复
List子接口:Vector、ArrayList、LinkedList
- ArrayList:List接口主要实现类;线程不安全,效率高;底层使用Object[] elementData存储
- LinkedList:底层使用双向链表存储;对于频繁插入、删除效率比ArrayList高
- List接口的上古实现类;线程安全,效率低;底层使用Object[] elementData存储
相关方法:
5.Collection子接口-Set接口-HashSet、LinkedHashSet、TreeSet
特点:无序、不可重复
Set子接口:HashSet、LinkedHashSet、TreeSet
- HashSet:Set接口主要实现类;线程不安全;可以存储null值
- LinkedHashSet:HashSet的子类;遍历其内部数据时,可以按照添加顺序遍历
- TreeSet:可以按照添加对象的指定属性进行排序
Set接口中没有额外的新方法,使用的都是Collection中声明的方法
6.Map子接口-Hashtable、Properties、HashMap、LinkedHashMap、TreeMap
Map相关方法:
7.Collection工具类
四、泛型
在集合中,如果我们把什么东西都通过add()添加进去,那我们就不能对这个集合有较好的利用。就像一个超市,里面什么都卖,卖面包、筷子也卖鞋油、床单。如果送货把东西送来我们就直接丢进超市,仓库管理和顾客购物的体验都不好。于是会将超市里面进行分区,生活用品区,食品区。泛型就类似区域的划分,食品只能放到食品区里,无法把床单放进食品区,而只要是食品,不管是鱼还是肉都可以直接放进去。
泛型程序设计(英文:generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。 参考资料:www.bilibili.com/video/BV1Kb…