当前位置: 代码迷 >> 综合 >> Day13
  详细解决方案

Day13

热度:46   发布时间:2024-02-05 03:16:01.0

Day13

  • 数据结构
    • 队列
    • 数组
    • 链表
    • 红黑树
  • 集合
    • List集合
    • List子类 ----ArrayList集合
    • List子类 ----LInkList集合
  • Set接口
    • HashSet
      • HashSet----哈希值
      • 哈希表
  • 可变参数
  • Collections集合方法

数据结构

入口和出口是一个
先进后出----存入和取出顺序相反

队列

入口出口在集合两侧
先进先出-----存入取出顺序一样

数组

  • 查询快:数组的地址时连续的,通过数组的首地址可以快速找到数组,通过索引可以快速查找某一个元素
  • 增删慢:长度固定,增删元素,需要先删除,后复制到新数组。

链表

  • 查询慢:地址不是连续的,每次查询必须从开始开始查询
  • 增删快:增加删除元素对链表结构没有影响
    在这里插入图片描述

单向链表:不能保证元素顺序,存储和取出元素顺序可能不一致
双向链表:有两条链子,一条用来记录顺序

红黑树

趋近于平衡树,查询速度很快,查询叶子节点的最大次数和最小次数不能超过二倍

集合

List集合

有序集合,存储和取出一样
有索引,可以使用索引方法
允许存储重复元素

import java.util.ArrayList;
import java.util.List;public class ListMain {public static void main(String[] args) {List<String> l=new ArrayList<>();//addl.add("a");l.add("b");
// l.add("c");l.add("d");l.add("a");System.out.println(l); 	//[a, b, d, a]//索引添加l.add(2, "c");System.out.println(l); //[a, b, c, d, a]//索引移除String remove = l.remove(2);System.out.println(remove); //cSystem.out.println(l); //[a, b, d, a]//索引替换String set = l.set(3, "e");System.out.println(set); //aSystem.out.println(l); //[a, b, d, e]//获取索引元素String str = l.get(2);System.out.println(str); //d}
}

List子类 ----ArrayList集合

底层为数组

List子类 ----LInkList集合

list的链表实现,底层时链表结构,查询慢,增删快
里面有很多操作首尾的方法

package java13;import java.util.LinkedList;public class LinkListMain {public static void main(String[] args) {method1();}private static void method1() {LinkedList<String> list = new LinkedList<String>();//addlist.add("a");list.add("b");list.add("c");System.out.println(list); 	//[a, b, c]//集合开头添加元素list.addFirst("A");System.out.println(list); 	//[A, a, b, c]list.push("B");System.out.println(list); 	//[B, A, a, b, c]//集合末尾添加元素list.add("e");System.out.println(list); 	//[B, A, a, b, c, e]list.addLast("f");System.out.println(list); 	//[B, A, a, b, c, e, f]//返回第一个元素String first = list.getFirst();System.out.println(first);  //B//返回最后一个String last = list.getLast();System.out.println(last); 	//f//移除第一个 removeFirst/popString removeFirst = list.removeFirst();System.out.println(removeFirst);	//B//移除最后一个String removeLast = list.removeLast();System.out.println(removeLast);		//f//清空元素list.clear();System.out.println(list); 		//[]//判断是否为空boolean empty = list.isEmpty();System.out.println(empty); 		//true}}

Set接口

  • 不允许存储重复元素
  • 没有索引,不能使用普通for循环遍历

HashSet

  • 底层是哈希表支持,查询速度快
  • 无序集合
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class SetMain {public static void main(String[] args) {//没有重复元素,无序集合Set<Integer> s=new HashSet<Integer>();s.add(1);s.add(3);s.add(2);s.add(1);//迭代器遍历Iterator<Integer> i = s.iterator();while(i.hasNext()) {System.out.println(i.next());}//增强for遍历for(Integer a:s) {System.out.println(a);}}
}

HashSet----哈希值

是一个十进制整数,由系统随即给出,对象的地址值,模拟出来得到的地址,不是数据实际存储的物理地址

public class PersonMain {public static void main(String[] args) {Person p=new Person();int hashCode1 = p.hashCode();System.out.println(hashCode1); //366712642Person p2=new Person();int hashCode2 = p2.hashCode();System.out.println(hashCode2); //1829164700String s1=new String("abc");String s2=new String("abc");String s3=new String("123");System.out.println(s1.hashCode());//96354System.out.println(s2.hashCode());//96354System.out.println(s3.hashCode());//48690}}

哈希表

提高查询速度
初始0-15,由16个位置

可变参数

参数类型确定,但是参数个数不确定,可以使用可变参数,定义方法时使用
修饰符 返回值类型 方法名(数据类型...变量名){ }
如果方法参数由好多,那么可变参数必须卸载参数列表的末尾
注:Object…Xxx 可以接受所有数据类型

public class VarAgeMain {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(add(1));	//1System.out.println(add(1,2));	//3System.out.println(add(1,2,3)); //6System.out.println(add(1,2,3,4));	//10System.out.println(add(1,2,3,4,5)); //15System.out.println(add(1,2,3,4,5,6)); //21}public static int add(int...arr) {int str=0;for (int i = 0; i < arr.length; i++) {str+=arr[i];}return str;}
}

Collections集合方法

注意:

  • Sort(list)方法对自定义元素排序的时候,里面存储的元素必须实现Comparable,重写方法,定义排序规则:升序:this-参数 例:this.age() - o.age();
  • Comparator和Comparable的区别:Comeparator:自己和别人比较,自己需要实现Comparable接口 ;Comparator:找一个第三方比较两个
package java13;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class CollectionMain {public static void main(String[] args) {ArrayList<String> arr=new ArrayList<String>();//添加元素
// arr.add("123");//添加多个元素----addAllCollections.addAll(arr, "1","3","4","2","5","7");	System.out.println(arr);//[1, 3, 4, 2, 5, 7]//打乱顺序Collections.shuffle(arr);System.out.println(arr);//[2, 5, 4, 1, 3, 7]//升序排列Collections.sort(arr);System.out.println(arr);//[1, 2, 3, 4, 5, 7]ArrayList<Integer> list=new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);//sortCollections.sort(list, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return 02-01 ;//降序//01-02 升序}});System.out.println(arr);} }