Java基础九之Java的集合框架简单介绍

  • 数据结构------这个查看考研的笔记吧
    • 线性表
      • 顺序表
      • 链表-----简单实现一个链表,并能增删改节点
      • 栈-------栈满栈空 出栈入栈
      • 队列-----队满队空 出队入队
      • 二叉树------遍历 、增删改
    • 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
        • 简介
          1. 底层数据结构:数组
          2. 初始容量 :10。每次扩容 构建一个新的更大数组并将之前的内容拷贝到新数组中。所以最好明确一下插入元素的多少,指定一个初始容量值。
          3. 默认扩容后数组为原数组长度*3/2+1
          4. 随机访问 非线程安全
      • LinkedList
        • 简介
          1. 底层数据结构:双向链表。所以额外提供get、remove、insert方法
          2. 不能随机访问。插入和删除元素效率高。
          3. 非线程安全。
      • Vector
        • 简介
          1. 数据结构:数组实现
          2. 线程安全
          3. 扩容后数组:原数组长度*2
      • Stack
        • 简介
          1. 继承自Vector
          2. 额外提供push、pop、peek、empty、search
          3. 创建后为一个空栈
    • Set常见实现类

      • EnumSet 枚举专用Set-------所有元素都是枚举类型
      • HashSet 查询速度最快的集合 -----内部以HashCode实现。
      • TreeSet 维持内部排序状态的Set,内部以TreeMap实现。—使用外部排序器、内部排序器来指定排序策略
      • 潜在的内存泄漏原因:HashSet的remove也依赖哈希值进行待删除节点定位,如果由于集合元素内容被修改导致hashCode方法返回值变更,那么remove就无法定位到原来的对象,导致删除不成功,从而导致内存泄漏。
    • Map常见实现类

      • HashMap

        1. 底层数据结构:JDK1.8中,HashMap采用数组+链表+红黑树实现。

          当链表长度超过8,链表转换为红黑树,小于等于6,树结构还原为链表。

        2. 初始容量为16

        3. 扩容:并且当超过12的时候会进行扩容,每次扩容为原来的两倍。

      • TreeMap

        1. 底层数据结构:基于红黑树,键值可使用Comparable(内部排序器实现conpareTo方法)或Comparator接口(外部排序器 实现compare方法)
      • LinkedHashMap

        1. 继承自HashMap
        2. 集合类元素可按插入顺序排序,也可按最后一次访问顺序排序
      • WeakHashMap

        • HashMap的一种实现
        • 使用弱引用作为内部数据存储方案
        • 作为简单缓存表的解决方案
      • 总结:如果更新Map不需要保持图中元素顺序,使用HashMap,如果要维持Map元素的插入顺序或访问顺序,使用LinkedHashMap,如果按照键值排序,使用TreeMap

      • HashTable

        1. 同HashMap区别:为线程安全
      • Properties

        1. Hashtable类的子类
        2. 用来对属性文件进行处理。或ResourceBundle来读取属性文件
        3. 常用方法:
          1. load 加载文件
          2. getProperty(key) 通过key获取对应value
          3. 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的元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值