Java【初识数据结构】

目录

一、集合框架

1.什么是集合框架

2.什么是数据结构 

3.什么是算法

二、时间复杂度和空间复杂度

1.算法效率、

2.时间复杂度

3.空间复杂度

三、包装类

1.基本类型和对应的包装类型

2.装箱和拆箱

3.面试题

四、泛型

1.什么是泛型

2.语法

3.泛型是如何编译的

4.泛型的上界

5.泛型与方法 


一、集合框架

1.什么是集合框架

Java集合框架(Java CollectionFramework),又被称为容器(container)是定义在java.util包下的一组接口(inteface)和实现类(classes)2f7bf8b0554a4c209ec59220f6df3e91.jpeg

2.什么是数据结构 

数据结构是指计算机储存、组织数据的方式,指相互之间存在一种特定关系的数据元素的集合

容器背后对应的数据结构:

1. Collection:是一个接口,包含了大部分容器常用的一些方法

2. List:是一个接口,规范了ArrayList 和  LinkedList中要实现的方法

ArrayList:实现了List接口,底层为动态类型顺序表

LinkedList:实现了List接口,底层为双向链表

3. Stack:底层是栈,栈是一种特殊的顺序表

4. Queue:底层是队列,队列是一种特殊的顺序表

5. Deque:是一个接口

6. Set:集合,是一个接口,里面放置的是K模型

HashSet:底层为哈希桶,查询的时间复杂度为O(1)

TreeSet:底层为红黑树,查询的时间复杂度为O( ),关于key有序的

7. Map:映射,里面存储的是K-V模型的键值对

HashMap:底层为哈希桶,查询时间复杂度为O(1)

TreeMap:底层为红黑树,查询的时间复杂度为O( ),关于key有序

3.什么是算法

就是定义好良好的计算过程,用来将输入数据转化为输出结果

二、时间复杂度和空间复杂度

1.算法效率、

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。

时间复杂度主要衡量的是一个算法的运行速度

空间复杂度主要衡量一个算法所需要的额外空间

2.时间复杂度

2.1概念

算法的时间复杂度是一个数学函数,算法中的基本操作的执行次数,为算法的时间复杂度

2.2大O的渐进表示法

大概的执行次数

推导大O阶方法:

1.用常数1取代时间中的所有加法常数

2.在修改后的运行次数函数中,只保留最高项

3.如果最高项不是1,则去除与这个项目相乘的常数。

 另外有些算法的时间复杂度存在最好、最坏和平均情况....

3.空间复杂度

空间复杂度是对一个算法在运算过程中储存空间大小的度量

三、包装类

在Java中,由于基本类型不继承与Object,为了在泛型代码中可以支撑基本类型,Java给每个基本类型都对应了一个包装类

1.基本类型和对应的包装类型

基本数据类型包装类
byteByte
shortShort
intInteger
long

Long

floatFloat
doubleDouble
charCharacter
booleanBoolean

2.装箱和拆箱

2.1装箱

把简单类型转换为包装类型

public class Text {
    public static void main(String[] args) {
        int i = 10;
        Integer a = i; //自动的装箱
        Integer b = Integer.valueOf(20); // 显示的装箱
    }
}

2.2拆箱

public class Text {
    public static void main(String[] args) {
        Integer a = 100;
        int i = a; // 自动的拆箱
        int ii = a.intValue(); //显示的拆箱
    }
}

把包装类型转换为简单类型

3.面试题

public class Text {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        System.out.println(a == b);
        Integer aa = 200;
        Integer bb = 200;
        System.out.println(aa == bb);
    }
}
//true
//false

55182d1f8a4c49ed8663dca9cf19a067.pngi>=-128&&i<=127

四、泛型

1.什么是泛型

就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化

2.语法

class 泛型类的名称<类型形参列表> {

     //~~~

}

//泛型类
//<T>表示当前类是一个泛型类
class MyArry<T> {
    public Object[] array = new Object[3];
    public void setArray(int pos,T val) {
        array[pos] = val;
    }
    public T getArray(int pos) {
        return (T)array[pos];
    }
}

public class Text {
    public static void main(String[] args) {
        MyArry<Integer> myArry1 = new MyArry<Integer>();
        myArry1.setArray(0,10);
        myArry1.setArray(1,20);//在编译时,自动进行类型检查
        Integer val = myArry1.getArray(0);//在编译时,自动进行类型转换
        System.out.println(val);
        
        MyArry<String> myArry2 = new MyArry<String>();
        myArry2.setArray(0,"hello");
        myArry2.setArray(1,"java");
        String str = myArry2.getArray(0);
    }
}

类名后的 <T> 代表占位符,表示当前类是一个泛型类,只能是一个引用类型

E 表示 Element

K 表示 Key

V 表示 Value

N 表示 Number

T 表示 Type

....

泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查

优点:数据类型参数化,编译时自动进行类型检查和转换

3.泛型是如何编译的

在运行的时候,没有泛型的概念,JVM当中 就不存在泛型

在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制

4.泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

4.1语法

class 泛型类名称<类型形参 extends 类型边界>{

       //~~~

}

4.2示例:

public class MyArry<E extends Number> {
   //....
} 

只接受Number的子类类型作为E的类型实参

MyArry<Integer> //正常,因为Integer是Number的子类类型 
MyArry<String>  //编译错误,因为String不是Number的子类类型

 泛型没有下界,没有指定类型边界,可视为E extends Object

5.泛型与方法 

class Alg<T extends Comparable<T>> {
    public T findMax(T[] array) {
        T max = array[0];
        for (int i = 0; i < array.length; i++) {
            if(max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }
}

class Student implements Comparable<Student> {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Student o) {
        return this.name.compareTo(o.name);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
}

public class Text {
    public static void main(String[] args) {
        Student[] student = {
                new Student("xiaohong"),
                new Student("xiaoming"),
                new Student("xiaoliang"),
        };
        Alg<Student> alg = new Alg<Student>();
        Student ret = alg.findMax(student);
        System.out.println(ret);
    }
}
//Student{name='xiaoming'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值