泛型保证了类型转化安全
1.jdk5.0中新增的特有属性
2.集合中使用泛型:
总结:
① 集合接口或集合类在jdk5.0时都可以修改为带泛型的结构
② 在实例化集合类时,可以指明集体的泛型接口
③指明完之后,在集合类或接口中凡是定义类和接口时,内部结构(比如:方法、构造器、属性等)使用到类的位置,都指定为实例化的泛型类型
④ 注意点:泛型的类型必须是类,不能时基本数据类型。需要用到基本数据类型的位置,拿包装类替换
⑤如果实例化时,没有指定泛型的类型,默认类型就是java.lang.Object类型
如果继承的父类为泛型,但是子类没有设定泛型的指定类型那么也为Object类型
只有都为创建时这样:public A
如果在继承父类时,确定了父类的泛型,那么子类的泛型就是父类指定的泛型类型
泛型不同的引用不能相互赋值
静态方法中不能使用类的泛型
异常类是不能有泛型类的
想要创建T泛型类型的数组
不能直接创建,因为T是形参当我赋值后才会生效
正确创建方法:T[] arr = (T[]) new Object[10];
泛型可以部分保留
在方法中出行了泛型结构,泛型参数与类的泛型参数没有任何关系
泛型方法所属的泛型类是不是泛型类都没有关系
泛型方法可以声明为静态方法,原因:泛型参数是在调用方法是确定的,并非类的实例化时确定的
类A是类B的父类,G和G不具备子父类关系,属性并列关系
补充:A
通配符:?
类A是类B的父类,G和G,二者没有关系(并列关系),二者共同的父类为G>
添加(写入):对于List>就不能向其内部添加数据
特例:可以添加null
获取(读取):允许读取数据,读取数据的类型为Object类型
有限制条件的通配符的使用
类要小于等于Person类,也就是说,是Person类本身或者Person类的子类
可以取值类型只能为Person类,或Person的父类,不能将Person的子类取值
不赋值,因为父类无法给子类赋值,无法确定类是多小的子类
类要大于等于Person类,也就是说,是Person类本身或者Person类的父类
可以取值,因为不知道父类多大,所以类型只能为Object类
可以赋值将Person和子类都可以
定义个泛型类DAO
分别创建以下方法:
public void save(String id,T entity):
保存T类型的对象到Map成员变量中
public T get(String id):从map中获取id对应的对象
public void update(String id,T entity):替换map中key为id的内容改为entity对象
public Listlist():返回map中存放的所有T对象
public void delete(String id):删除指定id对象
定义一个User类:
该类包含:private成员变量(int类型)id,age;(String型)name。
定义一个测试类:
创建DAO类的对象,分别调用其save、get、update、Iist、delete方法来操作User对象
DAO类
public class DAO<T> {
private Map<String, T> map;
public DAO() {
this.map = new HashMap<>();
}
public void save(String id, T entity) {
map.put(id, entity);
}
public T get(String id) {
return map.get(id);
}
public void update(String id, T entity) {
if(map.containsKey(id)) {
map.put(id, entity);
}
}
public List<T> list() {
List<T> list = new ArrayList<>();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String next = iterator.next();
T t = map.get(next);
list.add(t);
}
return list;
}
public void delete(String id) {
map.remove(id);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof DAO)) return false;
DAO<?> dao = (DAO<?>) o;
return Objects.equals(map, dao.map);
}
@Override
public int hashCode() {
return Objects.hash(map);
}
}
User类
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
UserTest类
public class UserTest {
public static void main(String[] args) {
DAO<User> userDAO = new DAO<>();
userDAO.save("1001",new User(1,"有道高"));
userDAO.save("1002",new User(2,"有高道"));
userDAO.save("1003",new User(3,"高有道"));
userDAO.save("1004",new User(4,"有高高道"));
List<User> list = userDAO.list();
System.out.println(list);
System.out.println("--------------");
User user = userDAO.get("1001");
System.out.println(user);
System.out.println();
userDAO.update("1002",new User(2,"刘晶晶"));
userDAO.delete("1004");
System.out.println(userDAO.list());
}
}
1.File类的一个对象,代表一个文件或一个文件目录(文件夹)
2.File类声明在java.io包下
3.File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
4.后续File的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点".
File(String filePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)
包含盘符在内的文件目录的路径
相较于某个路径下,指明的路径
windows和DOS:\\
UNIX:/
public String getAbsolutePath():获取绝对路径
public string getPath():获取路径
public string getName():获取名称
public String getParent():获取上层文件目录路径。若无,返回null
public Long Length():获取文件长度(即:字节数)。不能获取目录的长度。
public Long LastModified():获取最后-次的修改时,毫秒值
public string[] list():获取指定目录下的所有文件或者文件目录的名称数组
public File[] listFiles():获取指定目录下的所有文件或者文件目录的File数组
public boolean renameTo(File dest):把文件重命名为指定的文件路径
比如:file1.renameTo(file2)为例:
要想保证返回true,需要于file1在硬盘中是存在的,且file2不能在硬盘中存在。
public boolean isDirectory():判断是否是文件目灵
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canwrite():判断是否可写
public boolean isHidden():判断是否隐藏
创建硬盘中对应的文件或文件目录
public boolean createNewFile():创建文件。若文件存在,刚不创建,返回false
pablic boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不会创建
public boolean mkdirs():创建文件目录。如果此文件目录存在,就不创建了。如果上层文件目录不存在,会将上层目录一同创建
删除磁盘中的文件或文件目录
public boolean delete():删除文件或者文件夹
删除注意事项:
Java中的删除不走回收站。
1.利用File构造器,new一个文件目录file
1)在其中创建多个文件和目录
2)编写方法,实现删除file中指定文件的操作
2.判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
3.遍历指定目录所有文件名称,包括子文件目录中的文件。
拓展1:并计算指定目录占用空间的大小
拓展2:删除指定文件目录及其下的所有文件