美文网首页Java
Java散乱(二、集合,泛型,IO)

Java散乱(二、集合,泛型,IO)

作者: 强某某 | 来源:发表于2018-06-07 07:24 被阅读6次

    集合

    Collection接口

    • Set接口(元素无序,不可重复的集合,无序性:针对的是元素在底层存储的位置是无序的)

    set存储自定义类,一定要重写equals()和hashcode()方法,当向set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象的set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置,若此位置已有对象存储,再通过equals()比较两个对象是否相同,如果相同,后一个对象就不能再添加进来。

    • HashSet

      时HashMap的一个特别的实现

    • LinkedHashSet

      使用链表维护了一个添加进集合中的顺序,遍历集合元素是,是按照添加时的顺序遍历的。插入性能略低于HashSet,但是在迭代访问Set里面的全部元素时有很好的性能。

    • TreeSet
      • 添加的元素必须时同一个类的(其他例如,list,HashSet等都是可以添加任意类型的)
      • 可以按照添加进集合的元素的指定的顺序遍历,例如String,包装类等默认按照从小到大的顺序遍历。
      • 当自定义类没有实现Comparable接口时,当向TreeSet添加该类对应的对象时候,会报错,因为,TreeSet存储必须有个顺序,这个顺序计算规则就是实现Comparable接口后,重写的compareTo()方法
    • List接口(元素有序,可重复的集合)
      • ArrayList

        底层是数据,增删慢,查找快
        - LinkedList
        > 底层是链表,增删快,查找慢
        - Vector
        > 是线程安全的

    Map接口(键值对集合)

    • HashMap:遍历顺序和添加顺序不见得相同(可以null键和值)
    • LinkedHashMap:使用链表维护添加的顺序,保证遍历顺序和添加顺序相同
    • TreeMap:按照添加进Map中的元素key的指定属性进行排序,key必须时同一个类的对象
    • HashTable:线程安全(不可以null键和值)
    • Properties:常用来处理属性文件,键和值都为String类型(例如:jdbc.properties文件)

    Collections工具类(操作Map和Collection)

    • 排序操作(均为static方法)
      • reverse(List):反转List中元素的顺序
      • shuffle(List):对List集合元素进行随机排序
      • sort(List):根据元素的自然顺序对指定的List集合按照升序排序
        -swap(List,int i,int j):将指定的List集合中的i处元素和j处元素互换
    • 查找 替换
      • Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
      • Object max(Collection,Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素
      • 类似的有Object min(Collection)/Object min(Collection,Comparator)
      • int frequency(Collection,Object):返回指定集合中指定元素出现的次数
      • void copy(List dest,List src):将src内容复制到dest
      • boolean replaceAll(List list,Object oldval,Object newval):使用新值替换list对象的所有旧值.
    • Collections类中提供了多个synchronizedXXX()方法,该方法可使将指定集合包装成线程同步的集合,从而解决线程安全问题

      例如:Collections.syncchronizedList(list)

    泛型

    解决元素存储的安全性问题(任何类型都可以添加到集合中,类型不安全)
    解决获取数据元素时,需要类型强制转换的问题

    注解Annotation

    • JDK内置的基本注解类型(3个)
      • Override:限定重写父类方法,该注释只能用于
      • Deprecated:用于表示某个程序元素(类,方法等)已过时
      • SupperessWarnings:抑制编译器警告
    • 其他还有自定义注解和元注解,不常用

    File

    • File的API
    File f=new File("E.java");
    File f1=new File("C:/Users/Administrator/Desktop/C.java");
    boolean flag=f.renameTo(f1);
    说明:修改文件名,其实时剪切文件并改名,要求:f必须存在而f1必须不存在
    
    • 文件流
      • 字节流
      • FileInputStream
      • FileOutputStream
      • 字符流
      • FileReader
      • FileWriter
    • 缓冲流
      • BufferedInputStream
      • BufferedOutputStream(写完之后要加上flush())
      • BufferedReader(除了通用的read()之外还有readLine())
      • BufferedWriter(写完之后要加上flush())

      如果针对两个输出的缓冲流不手动flush,则在缓冲区满了之后会自动刷到文件中,但是此时总会在遗失最后一次的缓冲区未满的内容。所以每次读取都要手动调用flush()

    • 转换流(字节流和字符流之间的相互转换)

    字节流中数据都是字符时,转成字符流操作更高效
    - InputStreamReader
    - OutputStreamWriter

    • 打印流(可以打印到对应文件中)
      • PrintStream 字节流
      • PrintWriter 字符流
    • 数据流

    为了方便操作基本数据类型的数据(读写),套接在InputStream和OutputStream上
    - DataInputStream
    - DataOutputStream

    • 对象流(涉及序列化反序列化)
      • ObjectInputStream

        反序列化:用ObjectInputStream类从IO流中恢复该java对象
        - ObjectOutputStream
        > 序列化:用ObjectOutputStream类将一个java对象写入IO流中

    • 随机存取文件流

    程序可以直接跳到文件的任意地方来读、写文件

    • RandomAccessFile
    • long getFilePointer():获取文件记录指针的当前位置
    • void seek(long pos):将文件记录指针定位到pos位置
    • 构造器
    • public RandomAccessFile(File file,String mode)
    • public RandomAccessFile(String name,String mode)

    r:只读方式打开,rw:打开以便读取和写入(是使用buffer的,只有cache满的或者使用RandomAccessFile.close()关闭流的时候儿才真正的写到文件),rwd:打开以便读取和写入,同步文件内容的更新(每个更新都会同步),rws:打开以便读取和写入,同步文件内容和元数据的更新。
    readline:读取的内容会忽略换行符

    换行符消失问题,原内容图一,执行后内容图二
    File f1=new File("a.txt");
        RandomAccessFile ra=null;
        try {
            ra=new RandomAccessFile(f1, "rw");
            ra.seek(10);
            ra.write("csabcahc".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(ra!=null){
                try {
                    ra.close();
                } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    说明:因为RandomAccessFile写内容其实是覆盖而不是插入,seek之后,第一行写入了"csabcahc"
    这些字符,自动会向后,会覆盖掉本来第一行的换行符,导致第二行挤上来。
    解决方案:使用字符读取的方式,先读取seek之后的内容(可以用StringBuffer存储),然后写"csabcahc",然后把读取的内容在从sb中在写入到文件中(之所以不用readline,是因为会忽略换行符,而sb作用就是可以保留换行符)。
    
    图一.png 图二.png

    相关文章

      网友评论

        本文标题:Java散乱(二、集合,泛型,IO)

        本文链接:https://www.haomeiwen.com/subject/dejwsftx.html