数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
分为数组,链表,哈希表,树,栈,堆,队列,图共八种。
算法简单来说就是解决问题的步骤,方式。
单个变量 开辟一个空间
数组:开辟一连串连续的空间
对象:
自定义的数据,有很多不同的数据类型的属性,与数组有什么相同的地方?可以存储多个的值。值与值之间有没有特定的联系?
String name=“韦昊”;
String no=“158746352789546123”;
int age=20;
在内存中,存储的方式完全不同
数组
特征:1. 通过索引值来存取数据 2.显式的索引 3.容量是固定的(致命缺点)
Collection
存储一组不唯一,无序的数据。
List 本质上来说,是基于数组的动态实现,会实现动态扩容。
存储一组不唯一,有序的数据。
Set
存储一组唯一的,无序的数据。
map
按键值对的形式来存取数据的,键和值的数据类型可以是任意的数据类型。取值的时候,可以通过键来拿到这个值。提供键到值的映射。
ArrayList:长度可变,特别适用于遍历,
1、元素个数不确定
2、遍历数据
size():代表,集合的长度。
add():向集合中添加元素
container() :查询集合是否有指定的元素
remove() :移除元素
LinkedList:链表式的存储方式,特别适合用于插入,删除操作。
一、Map集合简述
1、Map集合是什么?
Collection集合是以单个方式存储元素的,而Map集合是以键值对的方式存储元素,所有Map集合的Key是无序不可重复的,key和value都是引用数据类型,存的
都是内存的地址。
2、HashMap
HashMap是一种无序的存储结构。HashMap的实现是假定元素是放在一个圆形的环上,每次put进来的元素根据其hashCode计算该元素在圆环上索引,把该元素放到合适的位置。hashmap是用哈希表实现的map类。
哈希表**(**Hash table,国内也有一些算法书籍翻译为散列表)是根据关键码的值而直接进行访问的数据结构。每个是以键值对key-value形式存储。
3、Map集合的特点
Map集合是一个双列集合,一个元素包含两个值(一个key,一个Value)
Map集合中的元素,key和value的数据类型可以相同,也可以不同
Map集合中的元素,key是不允许重复的,无索引的,value是可以重复的
Map集合中的元素,key和value是一一对应的
Map集合后面的键对应的值会覆盖前面重复键的值
Map集合的键值对都可以为null
二、泛型
2.1 概念
在类定义的时候,不会给类中的变量,类中的方法参数以及方法的返回值定义数据类型,而在实例化对象的时候才会确定数据类型。
约束元素的数据类型的,这样的做法让代码变得根据灵活
2.2 泛型符合
K: key的简写,代表键的数据类型
V:Value的简写,value代表值的数据类型
T: Type的简写,代表元素的类型
E:Element的简写,代表元素
只是一种符合,是一种占位符,当然可以使用任何的字母。
2.3 自定义泛型方法
package entity;
public class Student<T> {
private T stuId;
public Student() {
}
public Student(T stuId) {
this.stuId = stuId;
}
public T getStuId() {
return stuId;
}
public void setStuId(T stuId) {
this.stuId = stuId;
}
public T getStu(T stuName){
return stuId;
}
}
2.4 自定义泛型的接口
接口定义:
package entity;
public interface StudentService<T,E> {
T add(E e);
}
接口的使用:
import entity.Student;
import entity.StudentService;
public class StudentServiceImpl implements StudentService<String, Double> {
@Override
public String add(Double aDouble) {
return null;
}
}
2.5 泛型的边界
泛型的上限与下限
<? extends K> 上限
<? super K> 下限
定义
//代表传入的对象,必须是Pet的子类
public void feed(List<? extends Pet> list){
for (Pet pet : list) {
pet.eat();
}
}
//代表传入的对象,必须是Pet的父类
public void feed2(List<? super Pet> list){
for (Object o : list) {
}
}
调用:
Master master=new Master();
Dog dog=new Dog();
Cat cat=new Cat();
List<Dog> list=new ArrayList<>(); //调用的时候,尖括号中定义数据类型
list.add(dog);
master.feed(list);
2.6使用泛型的好处
1、代码量减少,避免了向上转型,向下转型
2、节省了内存资源的消耗,提高了代码的运行速度
3、使得数据更加安全