- 数据结构------这个查看考研的笔记吧
- 线性表
- 顺序表
- 链表-----简单实现一个链表,并能增删改节点
- 栈-------栈满栈空 出栈入栈
- 队列-----队满队空 出队入队
- 树
- 二叉树------遍历 、增删改
- 图
- hash表
- 用于在大量的数据中快速定位到某个特定的数据。通常存放数据包含两部分:关键字key 作为存储和检索的索引,数据Data存放实际数据项
- 哈希函数:确定 key–Data(位置) 之间关系 hash(key)=位置
- 碰撞冲突:考虑好的哈希函数和处理冲突的方法
- 装载因子:hash表中已经存储的关键字个数,一般值越大越容易冲突
- 线性表
- 算法
- 穷举、递归
- 基本的排序算法 **
- 选择、冒泡、插入排序
- 深度优先遍历
- 广度优先遍历
- A*算法、蚁群算法
- Prim()、Dijkstra()—最小生成树问题
直接从泛型开始
-
泛型
-
泛型作用
-
本质是参数化类型,即将操作的数据类型指定为一个参数。可以使用在类、接口、方法中。
-
目的:安全简单,当运行时类型相关错误提前到编译期(在编译的时候检查类型安全)
没有泛型前 保存通用数据方式 class Simple{ private Object obj; public Simple(Object ob){ this.ob=ob } setter/getter方法 public static void main(String[] args){ Simple s=new Simple(new Integer(2)); Integer i=(Integer)s.getObj();//运行时可能会抛出ClassCastException异常 } } //使用泛型的改写版本 我们在编译阶段就可以发现异常的类型问题 class Simple2<T>{ private T obj; public Simple2(T ob){ this.ob=ob } setter/getter方法 public static void main(String[] args){ Simple<Integer> s=new Simple<Integer>(new Integer(2));//确定泛型类型为Integer,类中凡是T的地方均有Integer代替 Integer i=(Integer)s.getObj();//运行时可能会抛出ClassCastException异常 } }
-
-
Java泛型特点
-
类型擦除:在泛型类型中清除类型参数的相关信息,并且在必要时添加类型检查和类型转换方法。且只关联一份class字节码文件
- 擦除结果,可自行查看class字节码文件,记得反编译后查看。
-
无法使用同一泛型类的实例区分方法签名
public void test(List<String> ls) public void test(List<Integer> li)//这两者是一样的
-
泛型类的静态变量共享
-
总结:
- 泛型类的类型参数编译时都会被擦除,JVM中泛型,只有普通类和普通方法,是一种语法糖
- Java泛型不支持基本类型 ArrayList false
- 泛型代码内部没有泛型参数类型的信息;即如果传入类型参数为T,那么泛型代码内部是不知道T有哪些方法属性的。
-
-
泛型类与泛型方法
-
实现泛型的集合工具
-
-
集合接口 **
-
Collection接口
- 简介:
- 最基本的集合类型 接口
- 牢记集合框架组成 图在本文件夹中
- Collection接口重要抽象方法
- API l add/addAll remove/removeAll clear contains/containsAll retainAll size isEmpty iterator toArray
- Collection的遍历
- 增强型for循环/for循环
- 迭代器遍历
- 简介:
-
Map接口 —没有迭代器哦!
-
简介
- 键值对的集合 key-value
- 3种视图:可以键集、值集、键值集映射关系的形式查看映射内容。有些保证顺序如TreeMap类;另一些不保证顺序,如HashMap
-
Map接口重要方法
-
API put/putAll remove get containsKey containsValue isEmpty
keySet values entrysSet clear size
-
-
-
List–接口
-
简介
- 有序的Collection 可以对列表中每个元素的插入位置进行控制 类似数组
-
LIst API
add(int index,Element) //在列表指定位置插入指定元素 addAll(int index,Element) //同理 remove(int index) //移除指定位置元素,并返回该元素值 set(int index,E element) //指定元素替换列表指定位置元素 get(int index) subList(int fromIndex,int toIndex) //返回子列表 indexOf(Object o) lastIndexOf(Object o) listIterator(int index) //返回元素的迭代器从指定位置开始
-
-
Set —接口
-
不包含重复元素的Collection 维持内部排序 所以随机访问没有意义 允许null存在但只能有一个
-
Set API add/addAll remove/removeAll contains/contasAll iterator
isEmpty size clear—完全就是Collection的API啊!!!
-
-
Queue --接口
-
简介
- 先进先出的数据结构
offer--添加元素 poll/remove --移除队列头部元素 队列为空 poll返回null remove 抛出异常 element/peek---获取头部元素,不删除
-
Queue API add(入队) element offer(入队) peek(获取队列首元素) poll(获取队列首元素并移出) remove(出队)
-
通常使用LinkedList创建一个队列
-
PriorityQueue的类实现了一个优先队列,即队列中元素拥有优先级
-
这里请思考接口的关系
- 继承关系,以及每个接口或类的优缺点,例如:linkedList 和ArrayList 前者存取效率低,查询效率快。
-
-
List常见实现类
- ArrayList
- 简介
- 底层数据结构:数组
- 初始容量 :10。每次扩容 构建一个新的更大数组并将之前的内容拷贝到新数组中。所以最好明确一下插入元素的多少,指定一个初始容量值。
- 默认扩容后数组为原数组长度*3/2+1
- 随机访问 非线程安全
- 简介
- LinkedList
- 简介
- 底层数据结构:双向链表。所以额外提供get、remove、insert方法
- 不能随机访问。插入和删除元素效率高。
- 非线程安全。
- 简介
- Vector
- 简介
- 数据结构:数组实现
- 线程安全
- 扩容后数组:原数组长度*2
- 简介
- Stack
- 简介
- 继承自Vector
- 额外提供push、pop、peek、empty、search
- 创建后为一个空栈
- 简介
- ArrayList
-
Set常见实现类
- EnumSet 枚举专用Set-------所有元素都是枚举类型
- HashSet 查询速度最快的集合 -----内部以HashCode实现。
- TreeSet 维持内部排序状态的Set,内部以TreeMap实现。—使用外部排序器、内部排序器来指定排序策略
- 潜在的内存泄漏原因:HashSet的remove也依赖哈希值进行待删除节点定位,如果由于集合元素内容被修改导致hashCode方法返回值变更,那么remove就无法定位到原来的对象,导致删除不成功,从而导致内存泄漏。
-
Map常见实现类
-
HashMap
-
底层数据结构:JDK1.8中,HashMap采用数组+链表+红黑树实现。
当链表长度超过8,链表转换为红黑树,小于等于6,树结构还原为链表。
-
初始容量为16
-
扩容:并且当超过12的时候会进行扩容,每次扩容为原来的两倍。
-
-
TreeMap
- 底层数据结构:基于红黑树,键值可使用Comparable(内部排序器实现conpareTo方法)或Comparator接口(外部排序器 实现compare方法)
-
LinkedHashMap
- 继承自HashMap
- 集合类元素可按插入顺序排序,也可按最后一次访问顺序排序
-
WeakHashMap
- HashMap的一种实现
- 使用弱引用作为内部数据存储方案
- 作为简单缓存表的解决方案
-
总结:如果更新Map不需要保持图中元素顺序,使用HashMap,如果要维持Map元素的插入顺序或访问顺序,使用LinkedHashMap,如果按照键值排序,使用TreeMap
-
HashTable
- 同HashMap区别:为线程安全
-
Properties
- Hashtable类的子类
- 用来对属性文件进行处理。或ResourceBundle来读取属性文件
- 常用方法:
- load 加载文件
- getProperty(key) 通过key获取对应value
- setProperty(String key,String value) 写入properties文件
Properties props=new Properties(); try{ //1.加载文件 props.load(new FileInputStream(new File("test.properties"))); }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } //2.获取文件中name的值 props.getProperty("name"); //写入文件 Properties props = new Properties(); FileInputStream fis = null; FileOutputStream fos = null; File f = null; try { f = new File("D:\\ChinaSoft_Software\\chinasoft_javaee_workspace\\servletdemo\\src\\view.properties"); fis = new FileInputStream(f); props.load(fis); props.setProperty("viewCount", viewCount.toString()); fos = new FileOutputStream( new File("D:\\ChinaSoft_Software\\chinasoft_javaee_workspace\\servletdemo\\src\\view.properties")); props.store(fos, null); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } }
-
-
-
Iterator
- 迭代器模式
- 有心情的时候自己实现然后搞定
- Iterator接口
- 方法:hasNext next remove
- remove
- 为集合创建一个迭代器,然后我们又在迭代器完成迭代前更改该集合,那么在迭代时会抛出一个异常。
- 迭代器模式
-
Collections工具类
-
对象集合排序
-
同Arrays.sort Collection提供sort对集合内部元素排序
package com.qinhan.collections; import java.util.ArrayList; import java.util.Collections; import java.util.List; class User implements java.lang.Comparable<User> { String name; int age; public int compareTo(User that) { return age - that.age; } public User(String name, int age) { this.name = name; this.age = age; } public static void main(String[] args){ List<User> ulist=new ArrayList<User>(); ulist.add(new User("Jerry",26)); ulist.add(new User("Tom",31)); ulist.add(new User("Jim",12)); ulist.add(new User("Eric",30)); Collections.sort(ulist); for(User u:ulist) { System.out.println(u); } } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } }
-
-
线程安全的集合版本
- 带上synchronized的系列列方法获得 指定列表的线程安全的版本
-
补充:关于list、set、map能够存null的问题
- List都可以添加null元素
- HashMap可以有1个key为null的元素,TreeMap不能有key为null的元素
Set底层是Map - 所以HashSet可以有1个null的元素,TreeSet不能有key为null的元素
-