zoukankan      html  css  js  c++  java
  • Java学习第十三天

    1.collection接口:
      List:接口,存储的数据是有序的(集合存储数据的顺序和添加数据的顺序是一致的),存储的数据是可以重复的
        ArrayList:底层数据结构使用的是数组,线程不安全的,查找速度快,增删速度慢(数组开辟的内存是连续的)
        Vector:底层数据结构使用的是数组, 线程安全的,查找速度快,增删速度慢,被ArrayList替代了
        LinkedList:底层数据结构使用的是链表,线程不安全的,查找速度慢,增删速度快

      set接口:存储的数据是为无序的,存储的数据是不可以重复的(不能存储相同的对象)

        HashSet:数据结构是哈希表,线程不安全的,替代了HashTable

        TreeSet:底层使用的是二叉树,线程不安全的,可以排序

        注意:Set有没有自己特有的功能:没有

    2.HashSet:数据结构是哈希表,线程不安全的,替代了HashTable
        向集合中添加元素时,先比较哈希值,根据哈希算法计算哈希值,确定在堆中地址,如果哈希值都不相同,那么直接存入集合,
      如果出现哈希值相同的,再调用equals()方法进行比较,如果返回true,则认为是相同的对象,则不存入集合,否则存入集合。

      注意:同一个对象哈希值肯定相同,哈希值相同不一定是同一个对象,有可能重写hashCode()函数
         contians()//判断包含某个对象也是依据int hashCode() 和boolean equals()方法
         remove()//删除某个对象也是依据int hashCode() 和boolean equals()方法

    3.TreeSet:底层使用的是二叉树,线程不安全的,可以排序

      第一种排序方式:默认情况下TreeSet会调用加入到集合的对象的compareTo方法
        需要对象所属的类实现Comparable接口的int compareTo(Object obj)方法
        TreeSet会根据compareTo方法的返回值来判断谁大谁小,从而实现排序
        当compareTo方法的返回值为0,认为是同一对象,不加入到集合中,这就是TreeSet保证对象唯一的方式


      第二种排序方式:当对象的排序方式不符合我们的需求时,可以自定义排序方式

        Comparator:接口
          自定义排序方式:实现Comparator接口中的 int compare(Object o1,Object o2)
        当存在自定义排序方式时,优先使用自定义的

        按照字符串的长短排:当存在自定义排序方式时,优先使用自定义的排序方式
        自定义排序方式:Comparator接口 int compare(Object o1,Object o2)

      注意:1.排序发生时:添加对象的同时就排序了

         2.TreeSet默认调用对象的compareTo()方法进行比较,因为Person中没有compareTo()方法,TreeSet无法确定谁大谁小,所以报错
         3.一个类的对象如果是可排序的,那么这个类需要实现Comparable接口
         4.如果没有实现Comparable接口,这抛出异常:ClassCastException:

     


    4.泛型:使用<引用数据类型>来接收一种引用数据类型,目的是在编译时期就检查集合中的数据的类型,
      如果不是指定的数据类型,则编译不通过,从而把运行时期的问题转移到了编译时期,提高了程序的安全性

      作用:使用了泛型,在实现自定义排序方法时就不用类型转换了
         添加的数据要和泛型的数据类型一致
         通过泛型,确定集合中存储的数据的类型

    5.一个类或接口能使用泛型,因为在定义类或接口时定义了泛型

     

     1 定义泛型类:
     2 
     3 /*
     4 定义泛型类
     5 
     6 class Student
     7 {
     8 }
     9 class Worker
    10 {
    11 }
    12 //使用泛型前
    13 class Tool
    14 {
    15 private Object obj;
    16 
    17 public void setObj(Object obj){
    18 this.obj=obj;
    19 }
    20 public Object getObj()
    21 {
    22 return obj;
    23 }
    24 }*/
    25 /*class Tool<T> //定义类
    26 {
    27 private T obj;
    28 
    29 public void setObj(T obj){
    30 this.obj=obj;
    31 }
    32 
    33 public T getObj(){
    34 return obj;
    35 }
    36 }
    37 class Demo9 
    38 {
    39 public static void main(String[] args) 
    40 { 
    41 Student stu = new Student();
    42 Tool<Student> tool=new Tool<>();
    43 
    44 tool.setObj(stu);
    45 
    46 Student w=(Student)tool.getObj();
    47 
    48 
    49 //Student stu = new Student();
    50 //Tool tool=new Tool();
    51 //tool.setObj(stu);
    52 //Worker worker = (Worker)tool.getObj();//编译时期没问题,运行异常    
    53 }
    54 }
  • 相关阅读:
    Android中自定义IP控件
    转:如何上传自己的项目到github呢?
    设置Linux系统的交叉编译环境
    在Linux系统下制作系统启动盘(Ubuntu Linux)
    Arduino PWM
    SOCKET CAN的理解
    linux下can调试工具canutils安装与使用
    小梅哥博客
    Brett Beauregard大神的Arduino PID算法
    手把手教你看懂并理解Arduino PID控制库——引子
  • 原文地址:https://www.cnblogs.com/demain/p/11335604.html
Copyright © 2011-2022 走看看