2018暑期实习生 58集团后台开发工程师(实习)技术一面

String、StringBuffer与StringBuilder

    String的内部结构是通过StringBuilder实现的。使用private final char value[]来实现字符串的存储,而且在String对象创建之后,就不能在修改此对象中存储的字符串内容,也就是说String类型是不可变的(immutable),所以经常改变内容的字符串最好不要用 String。

    如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

    所以在大部分情况下 StringBuffer > String

    关于StringBuffer:Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

    StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

    StringBufferd支持并发操作,线性安全的,适 合多线程中使用。

    StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

    StringBuilder可以操作StringBuffer,但是StringBuffer不可以操作StringBuilder

   String的创建方法有如下几种:(1)直接使用“”引号创建。(2)使用new String()创建。(3)使用new String("someString")创建以及其他的一些重载构造方法创建。(4)使用重载的字符串连接操作符“+”创建。

    StringBuffer扮演了String的可变配套类角色,非可变类本质上是线程安全的,它们不要求做同步处理,可以将其共享给所有的用户,让所有的“客户端程序员”都可以直接使用此类而不需要做任何额外的工作。

Collection和Map

    Collection和Map的区别在于容器中每个“槽”所存储的元素个数不同。Collection类型中,每个“槽”只有一个元素,Map类型中,持有key-value关联。所有的Java容器类都可以自动调整自己的尺寸。

    Collection的子类有:

        List:将以特定次序存储元素。所以取出来的顺序可能和放入的顺序不同。

            ArrayList:擅长随机访问元素,但在List中间插入、删除、移动元素较慢

            LinkedList:插入、删除、移动元素方便,随机访问元素差。

        Set:每个值只能保存一个对象,不能含有重复的元素

            HashSet:使用散列函数

           TreeSet:使用红黑树

            LinkedHashSet:使用链表结合散列函数

        Queue:先进先出的容器

    Map的子类:

        HashMap

        HashTable

        TreeMap

    List、Set、Map将所有的对象一律视为Object类型

    Collections是针对集合类的一个帮助类,它提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。

    容器类仅能持有对象引用(指向对象的指针),而不是将对象信息复制一份至数列某位置。

    在各种List中,最好的做法是以ArrayList作为默认选择,当插入、删除频繁时,使用LinkedList();Vector总是比ArrayList慢;在各种Set中,HashSet通常优于HashTree(插入、查找).只有当需要产生一个经过排序的序列时,采用TreeSet。HashTree的意义是用来维护其内元素的排序状态;在各种Map中,HashMap用于快速查找,当元素个数固定时,最好使用Array。

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

关于数据库设计方面需要考虑的问题:

    (1)建立索引;(2)分区(MySQL,比如按时间分区);(3)尽量使用固定长度的字段;(4)限制字段长度

关于Linux方面:

    查看内存使用情况:top、free、ps aux --sort -rss、vmstat -s

    查看当前CPU使用率最高的进程:ps、top

关于TCP状态:

    LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN

    SYN_SENT:客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT

    SYN_RECV:服务端应发出ACK确认客户端的SYN,同时自己向客户端发送一个SYN.之后状态置为SYN_RECV

    ESTABLISHED: 代表一个打开的连接,双方可以进行或已经在数据交互了

    FIN_WAIT1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态

    CLOSE_WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT

    FIN_WAIT2:主动关闭端接到ACK后,就进入了FIN-WAIT-2

    LAST_ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK

    TIME_WAIT:在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态

    CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束

猜你喜欢

转载自blog.csdn.net/arpospf/article/details/80266095