Day15 又是效率高的一整天

注解现在看了,但是不经常使用,所以后面得回来补了。今天好像没有什么感悟,因为最近可能没做到题目,感受不出来自己的忘记了那些部分,后面得找找题做,一边学习一边做题。痛苦是暂时的,大三下一个学期加暑假去找实习+大四,时间来的及,加油OVO

 

Day15

注解后面学到框架的时候回来再看。

 

JDK内置的三个基本注解

@Override:限定重写父类方法,该注解只能用于方法

@Deprecated:表示所写的东西过时了。

@SuppressWarning :抑制编译器警告

 

自定义注解

  1. 参照SuppressWarning 定义。

  2. 自定义注解通常会指明两个元注解:一是Retention,二是Target

public @interface MyAnnotaion {

  //内部定义成员,通常用value表示。
  String value() default "hello";//这是个属性,不是方法。
  //default可以指定成员的默认值
  //如果自定义的注解没有成员,表明是一个标识作用1
  //如果注解有成员,在使用注解的时候,就要指明成员的值
}

 

元注解:对现有的注解进行解释说明的注解。

  1. Retention:指明所修饰的注解的生命周期。一共有三种状态(SOURCE,CLASS,RUNTIME)

    SOURCE 编译完后丢弃,不在class文件里,反射获取不到

    CLASS是个默认行为,编译完在class文件,但允行时不在了,反射获取不到

    RUNTIME:只有声明为RUNTIME生命周期的注解,才能通过反射获取

  2. Target:指明所修饰的注解能用于那些程序元素。、


  3. Documented:表示所修饰的注解在javadoc解析时,保留下来。

    1. Inherited:被它修饰的Annotation将具有继承性。

 

可重复注解

Repeatable(MyAnnotations.class)。

1.在MyAnnotaion上声明@Repeatable,成员值(MyAnnotations.class)。

2.MyAnnotation的Target和Retention和MyAnnotaions相同。

类型注解

 

 

集合框架

一、集合的概述

  1. 集合、数组都是对多个数据进行存储操作的结构,简称 Java容器。

    说明:此时的存储,主要指的是内存层面的存储,不涉及到持久的存储。

  2. 数组存储多个数据方面的特点:

    一旦初始化以后,其长度就确定了

    数组一旦定义好,其元素的类型也就确定好了。如String[]、int[]

  3. 缺点:

    1.长度不可变。

    2.数组中提供的方法非常有限,对于添加,删除,插入数据,非常不方便,同时效率不高。

    3.获取数组中实际元素的个数的需求,数组没有线程的属性或方法可用。

    4.数组存储的特点是:有序,可重复,对于无序,不可重复的需求,不能满足。

二、集合框架

  1. Collection 接口:单列集合,用来存储一个一个的对象

    List接口:存储有序的,可重复的数据,"动态"数组。

    ArrayList、LinkedList、Vector

    Set接口:存储无序的,不可重复的数据。"高中讲的集合"

    HashSet、LinkedHashSet、TreeSet

  2. Map接口:双列集合,用来存储一堆(key ---value)一对数据。 "高中函数y=f(x)"

    HashMap、LinkedHashMap、TreeMap、Hashtable、Properties。

 

Collection接口中的方法

public class collectionTest {
  @Test
  public void test1() {
      Collection coll =new ArrayList();

      //add(Object e):将元素e添加到集合coll中
      coll.add("aa");
      coll.add("shabi");
      coll.add("啥比");
      coll.add(123);
      coll.add(new Date());
      //size():获取添加的元素个数
      System.out.println(coll.size());//5
      //addAll(Collection coll1):将coll1集合中的元素添加到当前的集合中。
      Collection coll1 =new ArrayList();
      coll1.add(123);
      coll1.add("sss");
      coll1.add("AAA");
      coll.addAll(coll1);
      System.out.println(coll.size());//8
      System.out.println(coll);//这里调用了实现类的Arraylist()里的toString
      //isEmpty():判断当前集合是否为空
      System.out.println(coll.isEmpty());//size ==0是为空
      //clear():清空集合,对象在,没有数据了而已。
      coll.clear();
      System.out.println(coll);//清空集合后,返回一个空集合[]
  }
}

 

Collection接口常用方法

package com.sorrymaker.CollectionTest;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
* 向Collection接口的实现的对象中添加数据obj时,要求obj所在的类要重写equals().

* equals()是用来比较两个对象的的内存地址
* 为什么要在我们自己的类中重写equals()?
* 但是有时候我们不满足于使用基本数据类型和Java实现的一些继承自Object的哪些类,
* 比如我们实现一个Person类,它是继承自Object类的,所以它的equals()方法默认
* 使用的是文章开头提到的哪个equals()方法,当我们使用equals()进行比较的时候,
* 比较内存地址,那么有可能出现两个Person对象的参数都相同(比如年龄,身份证号等,
* 在我们的实际认知中认为这两个人就是一个人,应该返回true),但是由于他们的内存地址是不一样的,
* 所以equals()方法会返回false,那么我们就需要去重写equals()方法。
*/
public class collectionTest1 {
  @Test
  public void test1(){
      Collection coll =new ArrayList();
      coll.add(123);
      coll.add(456);
      coll.add(new String("tom"));
      coll.add(false);
      coll.add(789);
//       Person p = new Person("Jerry",20);
//       coll.add(p);
      coll.add(new Person("Jerry",20));
      //1.contains(Object obj);判断当前集合中是否包含obj
      //判断时会调用obj对象所在类的equals()方法。
      boolean contains = coll.contains(123);
      System.out.println(contains);
      System.out.println(coll.contains(new String("tom")));
//       System.out.println(coll.contains(p));//True
      System.out.println(coll.contains(new Person("Jerry", 20)));//false
      System.out.println("=============================");
      //2.containsALL(Collection coll1):判断形参coll1中的所有元素是否存在于当前集合中
      Collection coll1 = Arrays.asList(123,456,000);
      System.out.println(coll.containsAll(coll1));
  }


  @Test
  public void test2(){
      //3.remove(Object obj):
      Collection coll =new ArrayList();
      coll.add(123);
      coll.add(456);
      coll.add(new Person("Jerry",20));
      coll.add(new String("tom"));
      coll.add(false);

//       coll.remove(123);
//       System.out.println(coll);

      coll.remove(new Person("Jerry",20));
      System.out.println(coll);
      //4.removeAll(Collection coll1)差集,从当前集合中移除coll1中所有元素。
      Collection coll1 =Arrays.asList(123,4566);
      coll.removeAll(coll1);
      System.out.println(coll);
  }

  @Test
  public void test3(){
      Collection coll =new ArrayList();
      coll.add(123);
      coll.add(456);
      coll.add(new Person("Jerry",20));
      coll.add(new String("tom"));
      coll.add(false);

      //5.retainAll(Collection coll)交集:获取当前集合coll集合的交集,并返回给当前集合。
//       Collection coll1 =Arrays.asList(123,456,789);
//       coll.retainAll(coll1);
//       System.out.println(coll);

      //6.equals(Object obj);要想返回True,需要当前集合和形参集合的元素都相同
      Collection coll1 =new ArrayList();
      coll1.add(456);
      coll1.add(123);
      coll1.add(new Person("Jerry",20));
      coll1.add(new String("tom"));
      coll1.add(false);
      System.out.println(coll.equals(coll1));
  }
  @Test
  public void test4(){
      Collection coll =new ArrayList();
      coll.add(123);
      coll.add(456);
      coll.add(new Person("Jerry",20));
      coll.add(new String("tom"));
      coll.add(false);

      //7.hashCode();返回当前对象的哈希值
      System.out.println(coll.hashCode());

      //8.集合--->数据。toArray()
      Object[] arr = coll.toArray();
      for (int i = 0; i < arr.length; i++) {
          System.out.println(arr[i]);
      }

      //拓展,数组--->集合。asList(),调用Arrays类的静态方法asList()
      List<String> list = Arrays.asList(new String[]{"aa", "bb", "cc"});
      System.out.println(list);

      List arr1 = Arrays.asList(new int[]{123, 456});//将这里识别为一个元素了。这里是可变形参。
      System.out.println(arr1);//[[I@5b80350b]
      List arr2 = Arrays.asList(new Integer[]{123,456});//用了Integer,就可以始别出来这里有两个元素了
      System.out.println(arr2);//[123, 456]

      //9.iterator();返回Iterator接口的实例,用于遍历集合元素,放在IteratorTest.java中。
  }
}

 

 

 

 

补充:

比较thorw和throws差异

throw:生产一个异常对象,并抛出,使用在方法内部 <->自动抛出异常对象


上面是排污,下面是治污

throws:处理异常的方式,使用在方法声明处的末尾<->try -catch-finally。

例如:public void test() throws Exception{

}

同步监视器:俗称锁,任何一个类的对象可以充当锁,多个线程共用一把锁

共享数据,多个线程共同操作的数据,即为共享数据。

 

 

posted @ 2021-03-25 21:37  独眼龙  阅读(117)  评论(0)    收藏  举报