Java小记4

本周的Java学习进度比较慢了,主要是由于考试周忙于复习,但主要的任务还算完成的不错,以下是我本周的学习小结。

目录

容器

ArrayList特点和底层实现

LinkedList特点和底层实现

Vector向量

Map接口

HashMap底层实现详解

 二叉树和红黑二叉树

TreeMap的使用和底层实现

Set接口 

HashSet底层实现

 迭代器遍历容器

 

Collections工具类

io流

数据源

 第一个简单的io流


容器

ArrayList特点和底层实现

ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。我们一般使用它。

我们可以看出ArrayList底层使用Object数组来存储元素数据。

LinkedList特点和底层实现

    class  Node {
        Node  previous;     //前一个节点
        Object  element;    //本节点保存的数据
        Node  next;         //后一个节点
}

entry在英文中表示“进入、词条、条目”的意思。在计算机英语中一般表示“项、条目”的含义。

Vector向量

1. 需要线程安全时,用Vector。

2. 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。

3. 不存在线程安全问题时,增加或删除元素较多用LinkedList。

Map接口

HashMap底层实现详解

  (1) 数组:占用空间连续。 寻址容易,查询速度快。但是,增加和删除效率非常低。

  (2) 链表:占用空间不连续。 寻址困难,查询速度慢。但是,增加和删除效率非常高。

public class Test {
    public static void main(String[] args) {
        int h = 25860399;
        int length = 16;//length为2的整数次幂,则h&(length-1)相当于对length取模
        myHash(h, length);
    }
   
    public static  int myHash(int h,int length){
        System.out.println(h&(length-1));
        System.out.println(h%length);//取余数
        return h&(length-1);
    }
}

 二叉树和红黑二叉树

本节仅了解,无需深入学习。

TreeMap的使用和底层实现

核心代码

private transient Entry<K,V> root = null;

 可以看到里面存储了本身数据、左节点、右节点、父节点、以及节点颜色。 TreeMap的put()/remove()方法大量使用了红黑树的理论。本书限于篇幅,不再展开。需要了解更深入的,可以参考专门的数据结构书籍。

Set接口 

 Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。

Set容器特点:无序、不可重复。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。更确切地讲,新元素如果和Set中某个元素通过equals()方法对比为true,则不能加入;甚至,Set中也只能放入一个null元素,不能多个。

HashSet底层实现

     HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。我们来看一下HashSet的源码:

      我们发现里面有个map属性,这就是HashSet的核心秘密。我们再看add()方法,发现增加一个元素说白了就是在map中增加一个键值对,键对象就是这个元素,值对象是名为PRESENT的Object对象。说白了,就是“往set中加入元素,本质就是把这个元素作为key加入到了内部的map中”。

      由于map中key都是不可重复的,因此,Set天然具有“不可重复”的特性。

 迭代器遍历容器

public class Test {
    public static void main(String[] args) {
        List<String> aList = new ArrayList<String>();
        for (int i = 0; i < 5; i++) {
            aList.add("a" + i);
        }
        System.out.println(aList);
        for (Iterator<String> iter = aList.iterator(); iter.hasNext();) {
            String temp = iter.next();
            System.out.print(temp + "\t");
            if (temp.endsWith("3")) {// 删除3结尾的字符串
                iter.remove();
            }
        }
        System.out.println();
        System.out.println(aList);
    }
}

 

Collections工具类

      1. void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。

      2. void shuffle(List) //对List容器内的元素进行随机排列。

      3. void reverse(List) //对List容器内的元素进行逆续排列 。

      4. void fill(List, Object) //用一个特定的对象重写整个List容器。

      5. int binarySearch(List, Object)//对于顺序的List容器,采用折半查找的方法查找特定对象。

io流

数据源

 第一个简单的io流

import java.io.*;
public class TestIO1 {
    public static void main(String[] args) {
        try {
            //创建输入流
            FileInputStream fis = new FileInputStream("d:/a.txt"); // 文件内容是:abc
            //一个字节一个字节的读取数据
            int s1 = fis.read(); // 打印输入字符a对应的ascii码值97
            int s2 = fis.read(); // 打印输入字符b对应的ascii码值98
            int s3 = fis.read(); // 打印输入字符c 对应的ascii码值99
            int s4 = fis.read(); // 由于文件内容已经读取完毕,返回-1
            System.out.println(s1);
            System.out.println(s2);
            System.out.println(s3);
            System.out.println(s4);
            // 流对象使用完,必须关闭!不然,总占用系统资源,最终会造成系统崩溃!
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 文件字节流

import java.io.FileOutputStream;
import java.io.IOException;
public class TestFileOutputStream {
    public static void main(String[] args) {
        FileOutputStream fos = null;
        String string = "北京尚学堂欢迎您!";
        try {
            // true表示内容会追加到文件末尾;false表示重写整个文件内容。
            fos = new FileOutputStream("d:/a.txt", true);
            //该方法是直接将一个字节数组写入文件中; 而write(int n)是写入一个字节
            fos.write(string.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 本周任务完成,下周完成全部任务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值