【学习打卡】Java高级(八)

学习目标:

Java 高级编程 学习打卡 第八天

学习内容:

1、如何遍历Map的key集,value集,key-value集,使用上泛型

HashMap<String, String> map = new HashMap<>();
map.put("name","Jack");
map.put("gender","male");
map.put("age","20");

//遍历所有的key
Set<String> keySet = map.keySet();
for (String key : keySet) {
     
	System.out.println(key);
}

//遍历所有value
Collection<String> values = map.values();
Iterator<String> iterator = values.iterator();
while (iterator.hasNext()) {
     
	System.out.println(iterator.next());
}

//遍历所有key-value
Set<Map.Entry<String, String>> entries = map.entrySet();
Iterator<Map.Entry<String, String>> entryIterator = entries.iterator();
while (entryIterator.hasNext()) {
     
	Map.Entry<String, String> entry = entryIterator.next();
	String key = entry.getKey();
	String value = entry.getValue();
	System.out.println(key+":"+value);
}

2、写出使用 Iterator 和 增强 for 循环遍历List的代码,使用上泛型

List<String> list = new ArrayList<String>();
list.add("Jack");
list.add("male");
list.add("20");

for (String s : list) {
     
	System.out.println(s);
}

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
     
	System.out.println(iterator.next());
}

3、提供一个方法,用于遍历获取HashMap中的所有value,并存放在List中返回。考虑上集合中泛型的使用。

public List<String> getValueList(HashMap<String,String> map){
     

	Collection<String> values = map.values();
    ArrayList<String> list = new ArrayList<>();
	for (String value : values) {
     
		list.add(value);
    }
	return list;
}

4、创建一个与a.txt文件同目录下的另外一个文件b.txt

File file1 = new File("d:\\a\\a.txt");
File file2 = new File(file1.getParent(),"b.txt");

5、Map接口中的常用方法有哪些?

学习时间:

2021年5月02日

学习产出:

【学习打卡】Java高级 第一天
【学习打卡】Java高级 第二天
【学习打卡】Java高级 第三天
【学习打卡】Java高级 第四天
【学习打卡】Java高级 第五天
【学习打卡】Java高级 第六天
【学习打卡】Java高级 第七天
【学习打卡】Java高级 第八天

学习总结:

泛型

泛型的概念

所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时确定(即传入实际的类型参数,也称为类型实参)。

泛型的引入背景

集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection,List,ArrayList 这个就是类型参数,即泛型。

【学习打卡】Java高级(八)_第1张图片

Map<String,Integer> map = new HashMap<String,Integer>();
//jdk7新特性:类型推断
Map<String,Integer> map = new HashMap<>();
map.put("Tom",87);
map.put("Jerry",87);
map.put("Jack",67);

【学习打卡】Java高级(八)_第2张图片

集合中使用泛型总结:

① 集合接口或集合类在jdk5.0时都修改为带泛型的结构。

② 在实例化集合类时,可以指明具体的泛型类型

③ 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。比如:add(E e) —>实例化以后:add(Integer e)

④ 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换

⑤ 如果实例化时,没指明泛型的类型。默认类型为java.lang.Object类型。

自定义泛型类,泛型接口,泛型方法

public class Order<T> {
     

    String orderName;
    int orderId;

    //类的内部结构就可以使用类的泛型
    T orderT;

    public Order(){
     
        //编译不通过
		//T[] arr = new T[10];
        //编译通过
        T[] arr = (T[]) new Object[10];
    }

    public Order(String orderName,int orderId,T orderT){
     
        this.orderName = orderName;
        this.orderId = orderId;
        this.orderT = orderT;
    }

    //如下的个方法都不是泛型方法
    public T getOrderT(){
     
        return orderT;
    }
    public void setOrderT(T orderT){
     
        this.orderT = orderT;
    }
    
    //静态方法中不能使用类的泛型。
    /*
    public static void show(T orderT){
        System.out.println(orderT);
    }
    */

    public void show(){
     
       	//编译不通过
        /*
        try{
        
        }catch(T t){
        
        }
        */
    }

    //泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没任何关系。
    //换句话说,泛型方法所属的类是不是泛型类都没关系。
    //泛型方法,可以声明为静态的。原因:泛型参数是在调用方法时确定的。并非在实例化类时确定。
    public static <E>  List<E> copyFromArrayToList(E[] arr){
     
        ArrayList<E> list = new ArrayList<>();
        for(E e : arr){
     
            list.add(e);
        }
        return list;
    }
}
public class SubOrder extends Order<Integer> {
     //SubOrder:不是泛型类
	
	public static <E> List<E> copyFromArrayToList(E[] arr){
     
		ArrayList<E> list = new ArrayList<>();
		for(E e : arr){
     
            list.add(e);
        }
        return list;
    }
}

//实例化时,如下的代码是错误的
SubOrder<Integer> o = new SubOrder<>();
public class SubOrder1<T> extends Order<T> {
     //SubOrder1:仍然是泛型类
}
@Test
public void test1(){
     
	//如果定义了泛型类,实例化没指明类的泛型,则认为此泛型类型为Object类型
    //要求:如果大家定义了类是带泛型的,建议在实例化时要指明类的泛型。
    Order order = new Order();
    order.setOrderT(123);
    order.setOrderT("ABC");
	//建议:实例化时指明类的泛型
	Order<String> order1 = new Order<String>("orderAA",1001,"order:AA");
	order1.setOrderT("AA:hello");
}

@Test
public void test2(){
     
	SubOrder sub1 = new SubOrder();
	//由于子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。
    sub1.setOrderT(1122);
	SubOrder1<String> sub2 = new SubOrder1<>();
	sub2.setOrderT("order2...");
}

@Test
public void test3(){
     
	ArrayList<String> list1 = null;
	ArrayList<Integer> list2 = new ArrayList<Integer>();
	//泛型不同的引用不能相互赋值。
	//list1 = list2;
}

//测试泛型方法
@Test
public void test4(){
     
	Order<String> order = new Order<>();
	Integer[] arr = new Integer[]{
     1,2,3,4};
	//泛型方法在调用时,指明泛型参数的类型。
	List<Integer> list = order.copyFromArrayToList(arr);
	System.out.println(list);
}

注意点

【学习打卡】Java高级(八)_第3张图片
【学习打卡】Java高级(八)_第4张图片

泛型在继承上的体现:

虽然类A是类B的父类,但是G 和G二者不具备子父类关系,二者是并列关系。

补充:类A是类B的父类,A 是 B 的父类

通配符的使用

/*
	通配符的使用
	通配符:?
	类A是类B的父类,G和G是没关系的,二者共同的父类是:G
*/

@Test
public void test(){
     
	List<Object> list1 = null;
	List<String> list2 = null;
	List<?> list = null;
	
	//编译通过
	list = list1;
	list = list2;
    
    List<String> list3 = new ArrayList<>();
	list3.add("AA");
	list3.add("BB");
	list3.add("CC");
	list = list3;
	
	//添加(写入):对于List就不能向其内部添加数据。
	//除了添加null之外。
	//list.add("DD");
	//list.add('?');
	
	list.add(null);

	//获取(读取):允许读取数据,读取的数据类型为Object。
	Object o = list.get(0);
	System.out.println(o);
}
/*
	限制条件的通配符的使用。
		? extends A:
				G 可以作为G和G的父类,其中B是A的子类

        ? super A:
                G 可以作为G和G的父类,其中B是A的父类

*/
@Test
public void test(){
     

	List<? extends Person> list1 = null;
	List<? super Person> list2 = null;

	List<Student> list3 = new ArrayList<Student>();
	List<Person> list4 = new ArrayList<Person>();
	List<Object> list5 = new ArrayList<Object>();

	list1 = list3;
	list1 = list4;
	//list1 = list5;

	//list2 = list3;
	list2 = list4;
	list2 = list5;

	//读取数据:
	list1 = list3;
	Person p = list1.get(0);
	//编译不通过
	//Student s = list1.get(0);

	list2 = list4;
	Object obj = list2.get(0);
	//编译不通过
	//Person obj = list2.get(0);

	//写入数据:
	//编译不通过
	//list1.add(new Student());

	//编译通过
	list2.add(new Person());
	list2.add(new Student());
}	 

File类的使用

File类的理解

1、File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)

2、File类声明在java.io包下

3、File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。

4、File类的对象常会作为参数传递到流的构造器中,指明读取或写入的"终点".

File的实例化

1、常用构造器

File(String filePath)
File(String parentPath,String childPath)
File(File parentFile,String childPath)

2、路径的分类
相对路径:相较于某个路径下,指明的路径。
绝对路径:包含盘符在内的文件或文件目录的路径

3、路径分隔符

windows和DOS系统默认使用“\”来表示

UNIX和URL使用“/”来表示

File类的常用方法

【学习打卡】Java高级(八)_第5张图片
【学习打卡】Java高级(八)_第6张图片
【学习打卡】Java高级(八)_第7张图片

你可能感兴趣的:(Java高级)