Map
- Map集合的特点都是由键决定的。
- Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)。
- Map集合后面重复的键对应的值会覆盖前面重复键的值。
- Map集合的键值对都可以为null。
Map | ||||
---|---|---|---|---|
HashMap | HashTable | 其他Map | ||
LinkHashMap | Properties | TreeMap |
使用最多的Map集合是HashMap。
Map集合实现类特点
- HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)
- LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。
- TreeMap:元素按照建是排序,不重复,无索引的,值不做要求。
Map集合的遍历方式有:3种。
- 方式一:键找值的方式遍历:先获取Map集合全部的键,再根据遍历键找值。
Map<String, Integer> buy=new HashMap<>();
buy.put("苹果手机", 2);//添加键值对
buy.put("智能手表", 1);
buy.put("java书", 1);
buy.put("c语言书", 1);
buy.put("西瓜", 2);
//Map集合的遍历
//先把所有键取出来
Set<String> s1=buy.keySet();
//开始根据键找值
for (String key : s1) {
Integer value=buy.get(key);
System.out.println(key+"->>>>"+value);
}
- 方式二:键值对的方式遍历,把“键值对“看成一个整体,难度较大。
// 先获取键值对
Set<Map.Entry<String,Integer>> en=buy.entrySet();
for (Map.Entry<String, Integer> entry : en) {
String key=entry.getKey();
Integer value=entry.getValue();
System.out.println(key+"->>>"+value);
}
- 方式三:JDK 1.8开始之后的新技术:Lambda表达式。
//Lamubda表达式遍历
buy.forEach((k,v)->{
System.out.println(t+"->>>"+v);
}
});
HashMap的特点
- HashMap底层是哈希表结构
- 依赖hashCode和equals方法保证键的唯一
- 如果键要存储的是自定义对象,需要重写hashcode和equals方法
- HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已。
TreeMap的特点
- TreeMap底层是红黑树结构
- 依赖自然排序或者比较器排序,对键进行排序
- 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象的时候给出比较器排序规则
IO流
- intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。
- output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。
或者
Properties
- Properties是一个Map体系的集合类
- Properties中有跟io相关的方法
- Properties只存储字符串
Properties核心作用:
- Properties代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去。
- 属性文件:后缀是.properties结尾的文件,里面的内容都是 key=value,后续做系统配置信息的。
反射
- 反射是在运行时获取类的字节码文件对象:然后可以解析类中的全部成分(构造器,属性,方法)。
- 反射的核心思想和关键就是:得到编译以后的class文件对象。
获取Class类的对象的三种方式
- 方式一:Class c1 = Class.forName(“全类名”);
- 方式二:Class c2 = 类名.class
- 方式三:Class c3 = 对象.getClass();
使用反射技术获取构造器对象并使用
- 反射的第一步是先得到类对象,然后从类对象中获取类的成分对象。
- Class类中用于获取构造器的方法
- 获取构造器的作用依然是初始化一个对象返回。
利用反射技术获取构造器对象的方式
- getDeclaredConstructors()
- getDeclaredConstructor (Class<?>… parameterTypes)
反射得到的构造器可以做什么?
- 依然是创建对象的
- public newInstance(Object… initargs)
如果是非public的构造器,需要打开权限(暴力反射),然后再创建对象
- setAccessible(boolean)
- 反射可以破坏封装性,私有的也可以执行了。
利用反射技术获取成员变量的方式
获取类中成员变量对象的方法
- getDeclaredFields()
- getDeclaredField (String name)
反射得到成员变量可以做什么?依然是在某个对象中取值和赋值。
- void set(Object obj, Object value):
- Object get(Object obj)
如果某成员变量是非public的,需要打开权限(暴力反射),然后再取值、赋值
- setAccessible(boolean)
利用反射技术获取成员方法对象的方式
获取类中成员方法对象
- getDeclaredMethods()
- getDeclaredMethod (String name, Class<?>… parameterTypes)
反射得到成员方法可以做什么?依然是在某个对象中触发该方法执行。
- Object invoke(Object obj, Object… args)
如果某成员方法是非public的,需要打开权限(暴力反射),然后再触发执行
- setAccessible(boolean)
反射为何可以给约定了泛型的集合存入其他类型的元素?
- 编译成Class文件进入运行阶段的时候,泛型会自动擦除。
- 反射是作用在运行时的技术,此时已经不存在泛型了。
注解
Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。
自定义注解
public @interface 注解名称 {
public 属性类型 属性名() default 默认值 ;
}
// 例如:
public @interface MyAnnotation {
public String name() default "jjw" ;
}
元注解:注解注解的注解。
元注解有两个:
- @Target: 约束自定义注解只能在哪些地方使用,@Target中可使用的值定义在ElementType枚举类中,常用值如下:
- TYPE,类,接口
- FIELD, 成员变量
- METHOD, 成员方法
- PARAMETER, 方法参数
- CONSTRUCTOR, 构造器
- LOCAL_VARIABLE, 局部变量
- @Retention:申明注解的生命周期,@Retention中可使用的值定义在RetentionPolicy枚举类中,常用值如下:
- SOURCE: 注解只作用在源码阶段,生成的字节码文件中不存在
- CLASS: 注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值.
- RUNTIME:注解作用在源码阶段,字节码文件阶段,运行阶段(开发常用,平时用这个)
工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一, 这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。
工厂设计模式的作用:
- 工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入。
- 可以实现类与类之间的解耦操作(核心思想)。
装饰设计模式
创建一个新类,包装原始类,从而在新类中提升原来类的功能。作用:装饰模式指的是在不改变原类的基础上, 动态地扩展一个类的功能。
操作步骤:
- 定义父类。
- 定义原始类,继承父类,定义功能。
- 定义装饰类,继承父类,包装原始类,增强功能!!
注意:此处的装饰方式和Python中的@方式不一样,Java中的@方式是注解而Python中的为装饰器