集合:
和数组都是容器
数组的特点在于:定义完之后类型确定,长度固定;
集合是Java中一种存储对象的容器(只能存储引用类型,存储基础类型时可以使用包装类),大小类型都可以不固定。
集合的优势在于:方便进行元素的增删操作
集合分类:
Collection单列集合,每个元素只有一个值
Map双列集合,每个元素包含两个值(键值对)
Collection:
package ThecollectionUseing;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
/**
* 目标:明确Collcetion集合体系的特点
* */
public class demo1 {
public static void main(String[] args) {
// 有序 可重复 有索引(List)
//多态的形式
Collection list = new ArrayList();
list.add("Java");
list.add("Java");
list.add("Mybatis");
list.add(23);
list.add(23);
list.add(false);
System.out.println(list);
/**
* 结果:[Java, Java, Mybatis, 23, 23, false]
* */
//无序,不重复,无索引(Set)
Collection list1 = new HashSet();
list1.add("Java");
list1.add("Java");
list1.add("Mybatis");
list1.add(23);
list1.add(23);
list1.add(false);
System.out.println(list1);
/**
* 结果:[Java, false, 23, Mybatis]
* 既不按照输入顺序,也不重复;
* */
//无序,不重复,无索引(Set)
Collection list2 = new LinkedHashSet();
list2.add("Java");
list2.add("Java");
list2.add("Mybatis");
list2.add(23);
list2.add(23);
list2.add(false);
System.out.println(list2);
/**
* 结果:[Java, Mybatis, 23, false]
* 按照输入顺序,但不重复;
* */
}
}
常用API:
package ThecollectionUseing;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class demo2 {
public static void main(String[] args) {
//0.新建集合对象:
Collection<String> list = new ArrayList<>();
//1.添加元素
list.add("Java");
list.add("Html");
list.add("C");
list.add("C++");
list.add("C#");
System.out.println(list.add("上面这行添加成功返回true"));
System.out.println(list);
//2.清空集合元素
// list.clear();
// System.out.println(list);
//3.判断集合是否为空
System.out.print(list.isEmpty());
System.out.println("\t←这里为空显示返回true,不空为false");
//4.获取集合大小
System.out.print(list.size());
System.out.println("\t←这里返回数字就是元素个数");
//5.检索元素
System.out.print(list.contains("Java"));
System.out.println("\t←含有检索的元素返回true,否则返回false");
//6.删除元素,若有多个元素则返回第一个
System.out.print(list.remove("java"));
System.out.println("\t←删除成功(含有该元素并删除)返回true,否则false");
//7.把集合转成数组
Object[] arrs = list.toArray();
System.out.println(Arrays.toString(arrs));
System.out.println("------------------扩展------------------");
//8.全部添加,为一个集合添加另一个集合的全部元素,添加过后另一个集合不变
Collection<String> c1 = new ArrayList<>();
c1.add("one");
c1.add("two");
Collection<String> c2 = new ArrayList<>();
c2.add("一");
c2.add("二");
c1.addAll(c2);
System.out.println(c1);
System.out.println(c2);
}
}
遍历方式一:迭代器
package ThecollectionUseing;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class demo3 {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
lists.add("one");
lists.add("two");
lists.add("three");
lists.add("four");
System.out.println(lists);
//1.得到当前集合的迭代器对象:
Iterator<String> it = lists.iterator();
//给ele赋第一个元素的值
// String ele = it.next();
// System.out.println(ele);
// //打印下一个元素
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
//2.定义循环遍历:
while(it.hasNext()){
//细节,不要写it.next(),而是用一个String类变量代指,方便多次调用
String ele = it.next();
//多次调用
System.out.println(ele+"+"+ele+"=?");
}
}
}
遍历方式二:foreach循环
package ThecollectionUseing;
import java.util.ArrayList;
import java.util.Collection;
public class demo4foreach {
public static void main(String[] args) {
Collection<String> lists = new ArrayList<>();
lists.add("one");
lists.add("two");
lists.add("three");
lists.add("four");
System.out.println(lists);
//foreach遍历:
for(String ele : lists){
System.out.println(ele);
}
//数组也可以使用:
double[] scores = {99.3, 78.3, 59.5};
for (double score : scores) {
//在这里更改数组数据时,只对循环内生效,for循环之外的数组并不会改变
if(score==59.5){
score = 100.0;
}
System.out.println(score);
}
//这里依然是59.5
System.out.println(scores[2]);
}
}
遍历方式三:lambda表达式
lists.forEach(s -> {
System.out.println(s);
});
使用Collection集合存储自定义类型的对象
案例:将三部电影存进集合中
package DefineNewClassAndReInColl;
import java.util.ArrayList;
import java.util.Collection;
public class TestDemo1 {
public static void main(String[] args) {
//1.定义一个电影类
Collection<Movie> movies = new ArrayList<>();
//2.添加对象
movies.add(new Movie("《你好,李焕英》",9.5,"张小斐,贾玲,沈腾,陈赫"));
movies.add(new Movie("《唐人街探案》",8.5,"王宝强,刘昊然,美女"));
movies.add(new Movie("《刺杀小说家》",8.6,"雷佳音,杨幂"));
//3.遍历集合中的每个电影对象(forEach的方式)
for(Movie movie:movies){
System.out.println("电影名:"+movie.getName());
System.out.println("得分:"+movie.getScore());
System.out.println("主演:"+movie.getActors()+"\n");
}
//3.这种方式也可以
movies.forEach(s->{
System.out.print("电影名:"+s.getName()+"\t");
System.out.print("得分:"+s.getScore()+"\t");
System.out.println("主演:"+s.getActors());
});
}
}
常见数据结构:
数据结构是计算机底层存储数据的方式,是指数据之间是以什么方式排列在一起的
通常情况下,精心选择数据结构可以带来更高的效率
常见的数据结构:
1.栈:
后进先出,先进后出。一端开口一端封闭。(类似于弹夹)
数据存入:压栈或者进栈;
数据离开:弹栈或者出栈;
2.队列:
先进先出,后进后出,单向流动。(类似于排队)
3.数组:
索引快,增删慢的数据类型
内存中的一块连续区域;
查询速度快:查詢數據通過地址值索引和定位,查詢任意數據耗時相同;
删除、添加元素效率低;
4.链表:
链表中的元素在内存中不连续,每个节点包括数据值和下一个元素的地址
查询速度慢
增删相对快(但是很多情况下要先找到再增删)
单向链表:中间节点包括下一个节点地址
双向链表:中间节点既包括上一个节点地址也包括下一个节点地址(增删首尾节点元素速度快)
5.二叉树:
二叉查找树:小的元素在左边,大的元素在右边,一样的不存
左子树所有值都小于根节点,右子树所有值都大于根节点
提高检索数据的性能
6.平衡二叉树:
二叉树存在问题:
如果一组数据已经按照顺序排好,存入二叉树,二叉树就成了链表。
所以我们希望这个树上的数据尽可能的平衡。
要求:任意节点左右两个子树高度差不超过1,任意节点左右两个字数都是一个平衡二叉树
7.红黑树:(基于红黑规则实现自平衡的排序二叉树)
不能两个红色相连。