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

集合

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,371评论 0 4
  • 一、集合入门总结 集合框架: Java中的集合框架大类可分为Collection和Map;两者的区别: 1、Col...
    程序员欧阳阅读 11,550评论 2 61
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,925评论 0 13
  • mongodb命令行操作 开启mongodb假设希望a文件夹是存放数据库的地方a文件夹下面新建一个存放数据的文件夹...
    亲爱的孟良阅读 350评论 0 0
  • 上一章 下一章 首页 静飞说,绍峰一定有他的苦衷。绍峰是很爱她的,就像她爱绍峰一样。虽然他俩在一起的时间有限,...
    GentleC阅读 227评论 0 1