java容器、泛型及一些知识点的回顾


  • 记录一些自己在学习中认识不够清晰的知识点,方便自己回顾

一、 集合的知识结构图

  1. 什么时候使用集合?

    当我们需要将一些相同结构的个体整合在一起时,就可以考虑使用集合了 。举例:购物车

  1. 为什么要使用集合?

    集合和数组相似点:
    都可以存储多个对象,对外作为一个整体存在,是“装其他对象的对象”.

 数组:优点:线性序列效率高  缺点:长度需要初始化,且固定不变,不灵活。删除和添加效率低下;缺乏封装,操作繁琐。

  因为数组的这些缺点,因此引入集合

简单概念解释

• Collection 根接口,表示一组对象

• List 有顺序可重复

  ArrayList: 查询效率高,增删效率低,长度不受限实现(扩容)
  Linkedlist: 增删效率高,查询效率低

• Set 没有顺序不可重复

 • HashSet 
 • 采用Hashtable哈希表存储结构(神奇的结构) 
 • 优点:添加速度快 查询速度快 删除速度快 
 • 缺点:无序 

 • LinkedHashSet 
 • 采用哈希表存储结构,同时使用链表维护次序
 • 有序(添加顺序)

 • TreeSet
 • 采用二叉树(红黑树)的存储结构 
 • 优点:有序 查询速度比List快(按照内容查询) 
 • 缺点:查询速度没有HashSet快

• Map 存储一组键值对象,key和value

HashMap:底层数据结构:数组加链表,键不能重复,如果重复则新的覆盖旧的

TreeMap:排序时使用

• Key 唯一 无序
• value 不唯一 无序

二、泛型(转自csdn 作者 我不是大王强)

// 泛型:就是一种不确定的数据类型。

// 比如:ArrayList E就是泛型。 这种不确定的数据类型需要在使用这个类的时候才能够确定出来。

// 泛型可以省略,如果省略,默认泛型是Object类型。

// 泛型的好处:

    1. 省略了强转的代码。
    1. 可以把运行时的问题提前到编译时期。
    public class Demo01Generic {
    
         public static void main(String[] args) {
    
        //创建集合不给出泛型
        ArrayList list = new ArrayList();
        list.add("hello");
        list.add("java");
        list.add("world");
        //遍历集合
        for (Object obj : list) System.out.println(obj);
        //进行遍历,打印出每个字符串长度
        for (Object obj : list) {
            String str = (String) obj;/*此处练习了向下转型*/
            System.out.println(str.length());
        }
        //创建集合给出泛型
        ArrayList<String> list2 = new ArrayList<>();
        //添加元素
        list2.add("helloo");
        list2.add("helo");
        list2.add("world");
         //list2.add(100);编译的时候就会报错,如果没有给出泛型,则不会报错
        //使用增强for遍历集合
        for (String str2 : list2
                ) {
            System.out.println(str2);
    
        }
      }
    }
    

三、构造器(一种特殊的方法)

// 用于对象的初始化

// 需要注意

  • 构造器的方法名必须和类名一致!
  • 构造器虽然有返回值,但是不能定义返回类型(返回值的类型肯定是本类),不能在构造器里调用 return。
  • 通过new关键字调用!!
  • 如果我们没有定义构造器,则系统会自动定义一个无参的构造方法。如果已定义则编译器不会 添加无参数构造方法!
  • 与普通方法一样,构造方法也可以重载
class Point{
    double x,y;

    //构造方法名称必须和类名保持一致
    public Point(double _x,double _y) {
        x=_x;
        y=_y;
    }

    public double getDistance(Point p) {
        return Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));
    }
}


public class Constructor {
    public static void main(String[] args) {
        Point p=new Point(3.0,4.0);  //new关键字调用
        Point origin=new Point(0.0,0.0);

        System.out.println(p.getDistance(origin));

    }

}

四、Static关键字

  • 修饰成员变量和方法,从属于类

  • 普通变量和方法从属于对象

  • 静态方法不能使用非静态方法

  • 非静态方法可以使用静态

 public class TestStatic
  { 
  int a; 

  static int width;   //修饰成员变量,从属于类

  static void gg(){   //修饰方法

     //tt();  //报错静态方法不能使用非静态方法

    System.out.println("gg");
   }

   void tt(){     //从属于对象
       gg(); // 可以使用静态方法
       System.out.println("tt");
     }

   public static void main(String[] args){

          TestStatic hi = new TestStatic(); 

          TestStatic.width = 2;

           //  TestStatic.gg(); //gg(); 

           //   hi.gg(); //通过引用也可以访问static变量或static方法。不过,一般还 是使用类名.static成员名来访问。 
           //  gg();

           hi.tt();  //用对象引用,因为从属于对象
      } 
    }

五、this关键字

  • 本质:创建好对象的地址

this的作用:

• this表示的是当前对象本身, 
• 更准确地说,this代表当前对象的一个引用。

普通方法中使用this

• 区分类成员属性和方法的形参. 
• 调用当前对象的其他方法(可以省略) 
• 位置:任意 

构造方法中使用this

• 使用this来调用其它构造方法 
• 位置:必须是第一条语句
• this不能用于static方法。(底层在堆里的对象中,而静态方法在方法区)
public class TeatThis {

    int a,b,c;

    TeatThis(int a,int b){
        this.a=a;  //区分类成员属性和方法的形参
        this.b=b;
    }

    TeatThis(int a,int b,int c){
        this(a,b);  //调用其它构造方法 ,必须是第一条语句
        this.c=c;
    }


    void sing() {

    }

    void eat() {
        this.sing();//调用本类中的sing()即调用当前对象的其他方法
        System.out.println("你妈妈喊你回家吃饭");
    }

    public static void main(String[] args) { 
        TeatThis hi= new TeatThis(2,3);
        hi.eat();

    }

}

再次强调

• This代表当前对象自身的引用(必须new) 
• This可以修饰属性,区别成员变量和局部变量 
• This修饰方法 
• This修饰构造方法(必须是第一条语句)

六、知识点的小问题记录

  • Object类是所有Java类的根基类
  • 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类

     public class Person { ... } 
     public class Person extends Object { ... }
    
  • B b = new B(); // 则既声明了类型为B的引用,又创建了B的实例(对象),并且将b引用了B的实例(对象)。

  • 创建对象的步骤

    • 分配对象空间,并将对象的成员变量初始化为0或空
    • 执行属性值的显式初始化
    • 执行构造方法
    • 返回对象的地址给相关变量
    

END


   转载规则


《java容器、泛型及一些知识点的回顾》 zfylearn 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
简单的Io流回顾 简单的Io流回顾
一、大体结构 IO流:见名知意就是 输入、输出流 一、 从处理数据来看 处理数据的话为字节流,加一个认知吧 字节流:Stream结束的都是字节流 因为我们经常用的中文,英文各种语言就有了字符流 字符流:是Reader和Witer的子
2019-08-19 zfylearn
下一篇 
启发性的飞机小游戏(一) 启发性的飞机小游戏(一)
写在前面 建议先将结尾源码素材下载,供练习中的对照参考,如果遇到问题,私下补课,也可以联系博主,第一次写有点多的东西,不合理的地方可以评论留言。 游戏项目的介绍基于Eclipse的开发环境,通过AWT图形用户界面技术(现在用的少)
2019-07-22 zfylearn
  目录