图论:
要素:
顶点(Vertex) 边(Edge) 边权(Weight)**
度
无向图:边数
有向图:出度和入度
树为一种比较特殊的图
四个基本容器
基本的容器有四个,分别对应四个接口:
List:按照插入的顺序保存元素,可以有重复的元素。
Set:不可以有重复的元素,可以理解为哈希表。
Queue:按照队列规则先进先出。
Map:将两个元素相关联,可以用键来查找值。
其中List、Set、Queue这三个接口继承了Collection接口。
Map则是自成一家,没有继承别人。
各接口的常用实现类
List:ArrayList、LinkedList
Set:HashSet、TreeSet、LinkedHashSet
Map:HashMap、TreeMap、LinkedHashMap
Queue:PriorityQueue、LinkedList
ArrayList和LinkedList这两个是实现类,实现了List接口,这两个类可能会增加一些接口没有的新方法(刷题时一般用不到)。
同理、Set、Queue、Map的实现类也一样。
1,类的定义方式:
如果需要用到一个List容器可以像下面这样子定义
ArrayList<Integer> list = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
List<Integer> list = new ArrayList<>();//接口实现的对象方法少一点
ArrayList<Integer> list = new ArrayList<>()//类实现的对象多一点
Set和Map和Queue的定义也和list一样。
List容器
ArrayList:底层使用数组实现的,查找快,插入数据和删除数据慢(常用)
LinkedList:底层使用链表实现的,查找慢,插入数据和删除数据快(常用)
1,创建一个List容器
List<Integer> list = new ArrayList<>();
ArrayList<Character> hui=new ArrayList<>();
ArrayList<String> ans=new ArrayList<>();
ans.add("qiao ben zhong.\n");//可以实现加入回车
ArrayList[] arrayList = new ArrayList[n];
//每一个一维数组都要实例化
for(int i=0;i<n;i++)
{
a[i]=new ArrayList<>();
}
for (int j = 0; j < arrayList[i].size(); j++)
List(可用arraylist也可以用linkedlist)常用方法有
arrayList[i].get(j)//二维数组
list.add(int element)//添加元素(常用)
list.get(int index)//根据索引查找元素
list.size()//反回元素的数量(常用)
list.isEmpty()//判断是否为空(常用)
list.remove()//根据下标删除元素
list.clear();//清空元素
2,模拟栈:
LinkedList<Integer> a=new LinkedList<>();
a.add(12);a.add(13);a.add(133);a.add(21);
int z=a.get(a.size()-1);//返回栈顶元素
a.remove(a.size()-1);//清除栈顶元素
System.out.println(a);
2,模拟队列:
LinkedList<Integer> b=new LinkedList<>();//队列
b.add(1);b.add(3);b.add(12);
int x=b.poll();//返回队首元素,删除队首元素
int y=b.peek();//返回队首元素
b.removeFirst();//直接删除队首元素
System.out.println(b);
Stack容器
//创建堆栈对象
Stack stack=new Stack();
System.out.println("aaaa,bbbb,cccc三个元素入栈");
//向栈中压入字符串aaaa
stack.push("aaaa");
//显示栈中的所有元素
printStack(stack);
stack.push("bbbb");
printStack(stack);
stack.push("cccc");
printStack(stack);
String s=new String("aaaa");
System.out.println("元素aaaa在堆栈的位置"+stack.search(s));
s=new String("bbbb");
System.out.println("元素bbbb在堆栈的位置"+stack.search(s));
System.out.println("aaaa,bbbb,cccc三个元素出栈");
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
System.out.println("元素"+stack.pop()+"出栈");
printStack(stack);
}
Set容器(可去重)
Set接口实现类有
HashSet:使用散列函数查找快速(也就是常说的哈希查找)(常用)
TreeSet:排序默认从小到大(去重并排序)
LinkedHashSet:使用链表维护元素的插入顺序
Set set = new HashSet<>();
可以直接取数
(缺点:取数困难,一般用新容器通过addAll()再存一遍,后取数,不知道当时怎么想的,也不知道看了哪里的资料)
Set常用方法有
set.add()//添加元素
set.remove(Object o)//删除一个对象的引用
set.clear()//清空容器
set.isEmpty()//判断容器是否为空
set.contains(Object o)//判断容器是否包含o(常用)
set.size()//返回容器中元素的数目
Map容器
Map接口实现类有
HashMap:用于快速访问,常用与哈希有关的(常用)
TreeMap:键处于排序状态
LinkedHashMap:保持元素插入的顺序
Map<String,Integer> map = new HashMap<>();
Map常用方法有
map.putIfAbsent()//添加键值对,可以去重value
map.put()//添加键值对,直接覆盖
1.使用put方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则会覆盖旧值,value为新的值。
2.使用putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。
map.get()