数据结构

第一章 数据结构

1、常见的数据结构

1.2. 队列
3. 数组
4. 链表
5. 红黑树

2、各自的特点

1. 栈
	特点: 先进后出。  //例如: "后吃的东西 先吐出来"
	
2. 队列
	特点: 先进先出。  //例如: "先吃的东西 先拉出来"
	
3. 数组
	特点: 查询快,增删慢。 //例如: ArrayList 底层就是数组结构

4. 链表
	特点: 查询慢,增删快。 //例如: LinkedList 底层就是链表结构

5. 红黑树
	特点: 查询速度非常快。 //例如: HashSet 集合的底层有红黑树. 想一想"猜数字游戏"

第二章 List集合

1、List集合的特点

1. 有序		//存放的顺序和取出的顺序是一致的
2. 有重复		//可以存储相同内容的数据
3. 有索引		//拥有带有索引 index 的方法

2、List集合常用的方法

1.public abstract void add(int index, E element); //指定的索引位置,添加元素
	
2.public abstract E remove(int index); //删除指定索引位置的元素,并且将该元素作为返回值,返回
	
3.public abstract E set(int index, E element);//修改指定位置的元素,将旧的元素返回
	
4.public abstract E get(int index); //通过指定的索引,获取对应的元素值

3、LinkedList集合常用的方法

1. 增(添加头、添加尾)
        public void addFirst(E e) 
        public void addLast(E e)
    
2. 删(删除头、删除尾)
		public E removeFirst()
    	public E removeLast()
    
3. 查(查询头、查询尾)
		public E getFirst()
    	public E getLast()
    
4. 特殊的两个方法
		public void push(E e)  //内部调用的是 添加头的方法
		public E pop()  //内部调用的是 移除头的方法

备注: 如果想要修改头、修改尾。应该怎么办? 应该“先删除再添加”

第三章 Set集合

1、Set集合的特点

1. 无序  //存放的顺序和取出的顺序,'可能'不一样
2. 无重复 //存放的数据,不能是重复的元素。(前提:需要重写 hashcode和equals方法)
3. 无索引 

注意: Set 集合是无重复的。那么我们可以用于【去重操作】

2、Set集合去重代码

//采用Set集合去重操作
public static void main(String[] args) {
        //例如:List集合当中存在一些数据,数据可能有重复.想要去掉重复,怎么办?
        //思路:List -> Set -> List  通过Set集合过滤一下,筛选掉重复数据!
        List<String> mList = new ArrayList<>();
        mList.add("真皮沙发");
        mList.add("迪丽热巴");
        mList.add("古力娜扎");
        mList.add("马尔扎哈");
        mList.add("马尔扎哈");
        mList.add("迪丽热巴");
        System.out.println("mList = " + mList);
        //mList = [真皮沙发, 迪丽热巴, 古力娜扎, 马尔扎哈, 马尔扎哈, 迪丽热巴]
        //=============
        //将List集合存放在Set集合当中
        Set<String> mSet = new LinkedHashSet<>();  //保证有序,采用 LinkedHashSet
        //存在方法,直接将 list 和 set 来回倒手
        //来自于父亲的方法Collection
        //boolean addAll(Collection c);
        //boolean addAll(Collection c);
        mSet.addAll(mList);
        mList.clear();//清空集合
        mList.addAll(mSet);
        System.out.println("mList = " + mList);
        //mList = [真皮沙发, 迪丽热巴, 古力娜扎, 马尔扎哈]
}

3、 HashSet底层原理

1. hash 值
	hash值就是模拟的地址值。
	由 hashCode()方法控制的。如果没有重写,由系统计算分配,如果重写,返回的是重写后的值。
	后期都是重写的,重写的方式,由成员变量的信息控制。(hash值可能相同) "重地""通话" hash值相同。
	
2. hashSet底层原理
	JDK1.8之前。数组+链表
	JDK1.8之后。数组+链表+红黑树  (提升查询的效率)链表数目超过8个自动转换红黑树
	
3. hashSet 存储数据 add()方法原理(执行流程) //注意: 需要依赖两个方法。 hashCode 和 equals 
	A.先计算hash值,看hash值是否相同。//依赖于 hashCode 方法
		a.相同
			再比较 equals() 方法。 //依赖于 equals 方法
			I.  相同。系统认定为 重复元素,不能存储
			II. 不同。系统会存储在 对应hash值的下面,要么是链表,要么是红黑树
		b.不同
			如果不同,直接存储到 HashSet 集合当中

第四章 Collections 工具类

1、可变参数

1. 格式
    修饰符 返回值类型 方法名称(数据类型... 变量名称){
        ....
    }

2. 例如:
    public static void method(int... arr){
		System.out.println(arr.length); //实际上就是一个数组
    }

3. 含义
	在小括号里面的参数位置,数据类型的后面打上 三个点。不能多,不能少。本质是一个数组。

4. 注意事项
	A. 在一个方法当中,可变参数只能有一个。 
	//如果有多个,分不清楚,具体的前面几个参数是第一个,后面几个参数是第二个的
	B. 在一个方法当中,可变参数只能写在最后一个。
	//如果可变参数写在前面,那么系统也懵逼。不清楚到哪里才算是可变参数结尾的位置。
    //method(int... arr,int xx).  去调用方法 method(11,22,33,44);

2、Collections工具类对比

Collections 和 Collection 区别:
	A. Collections 他是工具类。单列集合的工具类  //带有 s 的是工具类
	B. Collection 他是单列集合的顶层父接口

3、Collections 工具类的方法

1. 常用的方法
	public static <T> boolean addAll(Collection<? super T> c, T... elements)//向集合当中添加元素
	public static void shuffle(List<?> list)  //随机置换元素的位置,打乱元素顺序
	public static void sort(List<T> list) //默认比较器【内部比较器】
	public static void sort(List<T> list, Comparator<? super T> c) //比较器【外部比较器】
	
2. 比较器规则:
	A. 内部比较器
		a. 当前this - 传入o  //升序排列(从小到大)
		b. 传入o - 当前this  //降序排列(从大到小)
	B. 外部比较器
		a.-//升序排列(从小到大)
		b.-//降序排列(从大到小)

你可能感兴趣的:(基础)