JavaIO流和数据结构

2022-08-11 08:05:39

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
String 覆盖了 equals 方法和 hashCode 方法,而 StringBuffer 没有覆盖 equals 方法和 hashCode 方法,
所以,将 StringBuffer 对象存储进 Java集合类中时会出现问题。

Scanner和BufferedReader的选择

用Scanner获得用户的输入非常的方便,但是Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一键时,Scanner就会返回下一个输入。当你输入的内容中间包括空格时,使用Scanner就不能完整的获得你输入的字符串。这时候我们可以考虑使用BufferedReader类取得输入。

缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流, 关闭流之前,缓冲输出流将缓冲区数据一次性写出。

java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。
按类型来分:字节流和字符流。

字节流和字符流的区别:

每次读写的字节数不同;字节流是只读取一个字节,字符流是读取2个字节。
字符流是块读写,字节流是字节读写;
字符流带有缓存,字节流没有。
java流在处理上分为字符流和字节流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,
而字节流处理单元为1个字节,操作字节和字节数组。
字符流和字节流,一个属性范围小,一个属性范围大,字符流只能是字符这一种类型,但是字节流中可以是字符,可以是二进制文件,可以是音频,可以是各种各样的类型,只要符合字节形式存储的都可以接字节流,而字符流只能接字符。

OutputstreamWriter,是writer的子类,将输出的字符流变为字节流 InputStreamReader,是Reader的子类,将输入的字节流变为字符流

使用 newline 函数换行,应该注意:

在本机测试的时候,因为是 windows 环境,换行符是 \r\n ,打开文件时候自然文件是换行处理,没有问题。
当我们部署到服务器时候,服务器是 linux 环境,newline 读取系统换行符是 \r ,导出到文件,
文件的换行符是 \r,当我们把这个文件通过浏览器下载到 windows 时候,再打开文件将会出现没有换行的问题。因为 windows 下对于 \r 的解释并不是换行符。

数组的特点:有序、数据类型统一

List集合存储元素特点:有序、可以重复

Set集合特点:无序唯一

map特点:key唯一

ArrayList 和 LinkedList 的区别是什么?

最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,
而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

查询用ArrayList 增加和删除用LinkList

add()和put()方法都是集合框架中的添加元素的方法

但是put()方法应用于map集合中,add()方法应用于collection集合中。
二者的主要区别是:返回值类型不一样。
add()返回布尔(boolean)类型。因为像Set集合中不允许添加重复的元素。
当HashSet调用add()方法时,会先获取该元素的hashcode值,,如果返回false,表示添加不成功。
put()的使用是:添加时出现相同的键,那么后添加的值会覆盖掉此键对应的原来的值。并返回此键对应的原来的值。

remove(1) 指的的删除下标为1的数据,如果删除集合中数值1的内容,应该:remove(new Integer(1))

数组有没有 length()这个方法? String 有没有 length()这个方法?

数组没有 length()这个方法,有 length 的属性。String 有有 length()这个方法。

如何实现数组和 List 之间的转换?

List转换成为数组:调用ArrayList的toArray方法。
数组转换成为List:调用Arrays的asList方法。

List、Set、Map 是否继承自 Collection 接口?

List、Set 是,Map 不是。Map 是键值对映射容器,与 List 和 Set 有明显的区别, 而 Set 存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

Collection 和 Collections 的区别?

Collection 是一个接口,它是 Set、List 等容器的父接口;
Collections 是一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等。

阐述 ArrayList、Vector、LinkedList 的存储性能和特性。

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 中的方法由于添加了 synchronized 修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此是Java中的遗留容器。LinkedList 使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector 属于遗留容器(Java 早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList 和 LinkedList都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections 中的synchronizedList 方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。

Java 中的 TreeMap 是使用红黑树实现的。

Hashtable 与 HashMap 有什么不同之处?

这两个类有许多不同的地方,下面列出了一部分:
a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。
b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。
c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。

Java 中的 HashSet,内部是如何工作的?

HashSet 的内部采用 HashMap 来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。
类似于 HashMap,HashSet 不允许重复的key,只允许有一个 null key,意思就是 HashSet 中只允许存储一个 null 对象。HashSet在存放某个元素时,会先获取该元素的hashcode值,然后进行一系列的运算,之后确定将元素存放在什么位置;当存入相同对象时,会放在相同位置,也就是覆盖了。

  • 作者:星河浮世
  • 原文链接:https://blog.csdn.net/qq_44872502/article/details/119519462
    更新时间:2022-08-11 08:05:39