泛型
泛型,即 “参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。
参数化类型:就是将类型由原来具体的类型参数化,类似于方法中的变量参数,此时类型也可以定义成参数形式(可以称之为类型参数),然后在使用/调用时传入具体的类型(类型实参)
数据结构和算法简介
数据结构概念
数据的逻辑结构和存储结构及运算
逻辑结构
数据元素和元素之间的关系(面向问题,针对具体问题,为了解决某个问题)
集合
线性(一对一)
树(一对多)
图(多对多)
物理结构
数据的逻辑结构在计算机的存储形式(面向计算机)
顺序存储结构
链式存储结构
索引存储
散列存储(Hash)
程序 =数据结构 + 算法
算法
概念:
算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法特点
输入输出
打印输出或者返回一个或多个值
有穷性
避免死循环,并不是纯数学意义的,而是在实际应用中合理的,可以接受的有边界
确定性
每一步都需要有确定的含义
可行性
算法设计的要求
正确性
可读性
写代码的目的:1,计算机执行。2,方便他人阅读,方便自己日后维护
健壮性
对输入数据不合法 情况做合适的处理
最优算法
时间效率高和存储量低(用最少的钱和时间办最大的事)
集合介绍
集合是java对数据结构及算法的封装
概念
现实生活中:很多事物凑在一起
数学中的集合:具有共同属性的事物的总体
Java中的集合类:
是一种工具类,就像是容器,存储任意数量的具有共同属性的对象。
java集合主要分类三种类型:
Set(集)
List(列表)
Map(映射)
集合的作用
在类的内部,对数据进行组织
简单而快速的搜索大量的条目
有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关元素。
有的集合接口,提供了映射关系,可以通过key 去快速查找唯一对象,而这个关键字可以是任意类型。
集合和数组的区别
数组的长度固定,集合长度可变
数组只能通过下标访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象,集合只能存放引用数据类型,不能存放基本数据类型。
Collection
Collection接口是list,set接口的父接口,定义了可用于操作ListSet的方法增删改查
List
List是元素有序并且可以重复的集合,被称为序列
List可以精确的控制每个元素的插入位置,或删除某个位置元素
ArrayList. LinkedList是list的两个实现类
LinkedList与ArrayList对比
相同点:
方法相同,方法运行结果相同(方法体不同)
元素顺序操作相同
同一个元素可以加入多次
线程不安全
区别:
ArrayList底层是数组,适于查询。
LinkedList底层是双向链表,适合删除与插入,线程不安全。
ArrayList中常用方法
对List的遍历有三种
For循环
Foreach
Iterator
集合Set
Set父接口为Collection,很多方法是继承过来的,所有很多方法与List相同它不允许出现重复元素
不保证集合中元素的顺序
允许包含值为null的元素,但最多只能有一个null元素
HashSet、TreeSet是Set的两个实现类, 两个类的方法相同,但是方法运行后结果有的不同
- HashSet和TreeSet对比
相同点
没有下标
不可手动排序
元素顺序与加入顺序无关
同一个元素不可加入多次
遍历方式相同
不同点
HashSet:元素顺序不可测,与数学上元素集合概念相同
TreeSet:元素顺序与元素的排序规则有关
HashSet对元素无要求,而TreeSet对元素有要求,即要求元素必须有排序规则。
元素排序规则与List中元素排序规则是相同的
HashSet:底层是算法是Hash算法:所以查询速度快,但是没有ArrayList快
TreeSet:底层算法是树: 查询慢,插入快些。
- HashSet相关操作
创建
HashSet<String> set = new HashSet<String>();
长度
set.size();
添加
String s = "a";
set.add(s);
删除
set.remove(s);
清空
set.clear();
- 遍历Set
foreach
iterator
集合Map
Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value。
键(key值)不可重复,value值可以
每个键最多只能映射到一个值
Map支持泛型,形式如:Map<K,V>
- HashMap与TreeMap对比
相同点:
方法相同(但方法运行后结果可能不同)
元素是键值对
没有下标
不可手动排序
元素顺序与加入顺序无关
同一个元素不可加入多次,键相同则认为是同一元素,与值无关
不同点
HashMap:元素顺序不可测
TreeMap:元素顺序与元素的键的排序规则有关
HashMap对元素无要求,而TreeMap对元素的键有要求,即要求元素的键必须有排序规则
HashMap:底层是算法是Hash算法:所以查询速度快,但是没有ArrayList快
TreeMap:底层算法是树: 查询慢,插入快些
- HashMap的相关操作
创建
HashMap<String, Book> map = new HashMap<String, Book>();
长度
map.size();
添加
map.put("01", new Book("think in java"));
获取
Book book = map.get("01");
删除
map.remove("01");
清空
map.clear();
*Map遍历有两种方式
foreach
HashMap<Integer, String> hashmap= new HashMap<Integer, String>();
hashmap.put(1, "一");
hashmap.put(2, "二");
hashmap.put(3, "三");
hashmap.put(4, "四");
for(Map.Entry<Integer, String> me: hashmap.entrySet()) {
//me是存放hashmap中取出的内容,并用Map.Entry<Integer, String> 指定其泛型
System.out.println(me.getKey() + "-->" + me.getKey());
}
Iterator
TreeMap<Integer, String> tm = new TreeMap<>();
tm.put(1, "a");
tm.put(4, "b");
tm.put(3, "c");
Iterator itMap = tm.entrySet().iterator();
while(itMap.hasNext()){
Map.Entry en = (Map.Entry) itMap.next();
Integer key = (Integer) en.getKey();
String value = en.getValue().toString();
System.out.println(key +" "+value);
}