当前位置: 首页 > news >正文

建个企业网站一年需要多少钱小程序推广运营的公司

建个企业网站一年需要多少钱,小程序推广运营的公司,芜湖网站建设网站制作公司,建设网站用什么软件排版大家好#xff0c;我是栗筝i#xff0c;从 2022 年 10 月份开始#xff0c;我持续梳理出了全面的 Java 技术栈内容#xff0c;一方面是对自己学习内容进行整合梳理#xff0c;另一方面是希望对大家有所帮助#xff0c;使我们一同进步。得到了很多读者的正面反馈。 而在 2… 大家好我是栗筝i从 2022 年 10 月份开始我持续梳理出了全面的 Java 技术栈内容一方面是对自己学习内容进行整合梳理另一方面是希望对大家有所帮助使我们一同进步。得到了很多读者的正面反馈。 而在 2023 年 10 月份开始我将推出 Java 面试题/知识点系列内容期望对大家有所助益让我们一起提升。 本篇是对 Java 基础系列的面试题 / 知识点的总结的上篇 系列相关链接 文章目录 1、Java基础面试题问题2、Java基础面试题解答2.1、JavaObject类相关2.2、Java深拷贝浅拷贝相关2.3、Java序列化反序列化相关2.4、Java数据类型相关2.5、Java字符串相关 1、Java基础面试题问题 Java基础面试题问题上篇 问题 1. Object 类在 Java 中是什么样的存在为何在 Java 中所有的类都会继承自 Object 类问题 2. Object 类有哪些主要的方法每个方法的作用是什么问题 3. Object 类 native 方法和非 native 方法区别是什么问题 4. Java 中 和 equals 的有什么区别问题 5. Java 中为什么重写 equals() 方法后还必须重写 hashCode()问题 6. 什么是深拷贝和浅拷贝问题 7. Java 中的 clone() 方法默认是深拷贝还是浅拷贝问题 8. 在实现深拷贝时如果遇到循环引用该如何处理问题 9. 在实现深拷贝时对于数组和集合类应该如何处理问题 10. Cloneable 接口在 Java 中的作用是什么问题 11. 为什么说 Cloneable 是一个标记接口问题 12. 什么是 Java 的序列化和反序列化问题 13.Java 中的 Serializable 接口有什么作用问题 14. 在 Java 中如果一个对象的某个字段不想被序列化应该如何处理问题 15. 如何自定义序列化与反序列化过程问题 16. 静态字段是否可以被序列化为什么问题 17. 在 Java 中默认的序列化机制是怎样的问题 18. Java 中的基本数据类型有哪些问题 19. Java 中的自动装箱和拆箱是什么问题 20. 在 Java 中什么是强制类型转换、隐式类型转换、显式类型转换问题 21. 为什么 Java 中的字符串不可变它有什么优势问题 22. 什么是 Java 中的字符串池问题 23. 简述 String str aaa 与 String str new String(i) 一样吗 问题 24. Java 中有哪些创建字符串的方式问题 25. 介绍一下 String、StringBuffer、StringBuilder 和他们之间的区别 2、Java基础面试题解答 2.1、JavaObject类相关 问题 1. Object 类在 Java 中是什么样的存在为何在 Java 中所有的类都会继承自 Object 类 解答Object 类在 Java 中被视为所有类的基础和起点。这是因为在 Java 中所有的类都默认继承自 Object 类无论是 Java 内置的类还是用户自定义的类。这种设计使得所有的 Java 对象都能够调用一些基本的方法例如 equals(), hashCode(), toString() 等这些方法都在 Object 类中被定义。 问题 2. Object 类有哪些主要的方法每个方法的作用是什么 解答Object 类中的方法可以分为两类native 方法和非 native 方法。 非 native 方法是 equals()判断与其他对象是否相等。clone()创建并返回此对象的一个副本。toString()返回该对象的字符串表示。finalize()当垃圾回收器确定不存在对该对象的更多引用时由对象的垃圾回收器调用此方法。 native 方法是 getClass()返回此 Object 的运行时类。hashCode()返回该对象的哈希码值。notify()唤醒在此对象监视器上等待的单个线程。notifyAll()唤醒在此对象监视器上等待的所有线程。wait(long timeout)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前导致当前线程等待。 问题 3. Object 类 native 方法和非 native 方法区别是什么 解答native 方法和非 native 方法的主要区别在于它们的实现方式和运行环境。 native 方法这些方法在 Java 代码中声明但是它们的实现是用其他语言通常是 C 或 C编写的并且在 Java 之外的环境中运行。native 方法可以访问系统特有的资源如硬件设备接口、系统调用等。在 Java 代码中native 方法通常用关键字 “native” 声明。非 native 方法这些方法完全在 Java 中声明和实现。它们在 Java 虚拟机JVM内部运行并且只能访问由 JVM 提供的资源。非 native 方法不能直接访问系统资源或执行系统调用。 问题 4. Java 中 和 equals 的有什么区别 在 Java 中 和 equals() 方法用于比较两个对象但它们的比较方式和使用场景有所不同。 对于基本数据类型 比较的是值是否相等对于引用类型 比较的是两个引用是否指向同一个对象即它们的地址是否相同。 equals()这是一个方法不是操作符。它的行为可能会根据它在哪个类中被调用而变化。在 Object 类中equals() 方法的行为和 相同比较的是引用是否指向同一个对象。但是在一些类如 String、Integer 等中equals() 方法被重写用于比较两个对象的内容是否相等。因此如果你想比较两个对象的内容是否相等应该使用 equals() 方法。 问题 5. Java 中为什么重写 equals() 方法后还必须重写 hashCode() 解答在 Java 中equals() 和 hashCode() 两个方法是密切相关的。如果你重写了 equals() 方法那么你也必须重写 hashCode() 方法以保证两个相等的对象必须有相同的哈希码。这是因为在 Java 集合框架中特别是哈希表相关的数据结构如 HashMap、HashSet 等在存储和检索元素时会使用到对象的 hashCode() 方法。 以下是 Java 中 equals() 和 hashCode() 方法的一般约定 如果两个对象相等即equals(Object) 方法返回 true那么调用这两个对象中任一对象的 hashCode() 方法都必须产生相同的整数结果。 如果两个对象不等即equals(Object) 方法返回 false那么调用这两个对象中任一对象的 hashCode() 方法不要求必须产生不同的整数结果。但是程序员应该意识到为不相等的对象生成不同的整数结果可能提高哈希表的性能。 因此如果你重写了 equals() 方法但没有重写 hashCode() 方法可能会导致违反上述的第一条约定从而影响到哈希表相关数据结构的正确性和性能。 2.2、Java深拷贝浅拷贝相关 问题 6. 什么是深拷贝和浅拷贝 解答深拷贝和浅拷贝是编程中常见的两种复制对象的方式主要区别在于是否复制对象内部的引用对象。 浅拷贝Shallow Copy当进行浅拷贝时如果对象中的字段是基本类型会直接复制其值如果对象中的字段是引用类型那么只复制其引用而不复制引用指向的对象。因此原对象和拷贝对象会共享同一个引用对象。这就意味着如果其中一个对象改变了这个引用对象的内容那么另一个对象的这个引用对象的内容也会随之改变。 深拷贝Deep Copy当进行深拷贝时无论对象中的字段是基本类型还是引用类型都会创建一个新的副本。对于引用类型会复制引用指向的对象而不仅仅是复制引用。因此原对象和拷贝对象不会共享任何一个引用对象。这就意味着无论哪一个对象改变了引用对象的内容都不会影响到另一个对象。 需要注意的是实现深拷贝可能会比较复杂特别是当对象的引用结构很复杂时例如存在循环引用。此外深拷贝可能会消耗更多的计算和存储资源。 问题 7. Java 中的 clone() 方法默认是深拷贝还是浅拷贝 解答在 Java 中clone() 方法默认进行的是浅拷贝。 这意味着如果你的对象中包含了对其他对象的引用那么 clone() 方法只会复制这个引用而不会复制引用指向的对象。因此原对象和克隆对象会共享这个引用指向的对象这就是所谓的浅拷贝。 如果你想实现深拷贝即完全复制一个新的对象包括其引用的所有对象那么你需要重写 clone() 方法手动复制这些对象。 问题 8. 在实现深拷贝时如果遇到循环引用该如何处理 解答在实现深拷贝时如果遇到循环引用需要特别小心否则可能会导致无限递归最终导致栈溢出。 处理循环引用的一种常见方法是使用一个哈希表来跟踪已经复制过的对象。具体来说每当你复制一个对象时都将原对象和复制的新对象放入哈希表中。然后在复制一个对象之前先检查这个对象是否已经在哈希表中。如果已经在哈希表中那么就直接返回哈希表中的复制对象而不再进行复制。 以下是一个简单的示例 public class Node {public Node next;// ... }public class DeepCopy {private HashMapNode, Node visited new HashMap();public Node clone(Node node) {if (node null) {return null;}if (visited.containsKey(node)) {return visited.get(node);}Node cloneNode new Node();visited.put(node, cloneNode);cloneNode.next clone(node.next);return cloneNode;} }在这个示例中DeepCopy 类使用了一个 visited 哈希表来跟踪已经复制过的 Node 对象。在 clone() 方法中每次复制一个 Node 对象之前都会先检查这个对象是否已经在 visited 哈希表中。这样就可以避免因为循环引用而导致的无限递归。 问题 9. 在实现深拷贝时对于数组和集合类应该如何处理 解答在实现深拷贝时对于数组和集合类的处理需要特别注意因为它们都可能包含引用类型的元素。 数组如果数组的元素是基本类型那么可以直接使用 clone() 方法或 System.arraycopy() 方法来复制数组。如果数组的元素是引用类型那么需要遍历数组对每个元素进行深拷贝。 MyClass[] copy new MyClass[array.length]; for (int i 0; i array.length; i) {copy[i] array[i].clone(); }集合类对于集合类如 ArrayList、HashSet 等需要创建一个新的集合然后遍历原集合对每个元素进行深拷贝并添加到新集合中。 ArrayListMyClass copy new ArrayList(); for (MyClass item : list) {copy.add(item.clone()); }需要注意的是实现深拷贝可能会比较复杂特别是当对象的引用结构很复杂时例如存在循环引用。此外深拷贝可能会消耗更多的计算和存储资源。 问题 10. Cloneable 接口在 Java 中的作用是什么 解答Cloneable 接口在 Java 中被称为标记接口Marker Interface它本身并没有定义任何方法但是它对于 Java 的对象克隆机制来说非常重要。 当一个类实现了 Cloneable 接口后它就表明它的对象是可以被克隆的即它的 clone() 方法可以被合法地调用。如果一个类没有实现 Cloneable 接口但是调用了它的 clone() 方法那么将会在运行时抛出 CloneNotSupportedException 异常。 实现 Cloneable 接口的目的是为了让 Object 的 clone() 方法知道它可以对这个类的对象进行字段对字段的复制。 需要注意的是虽然 Cloneable 接口本身并没有定义任何方法但是实现 Cloneable 接口的类通常需要重写 Object 类的 clone() 方法以提供公开的克隆方法并实现类特定的克隆行为例如深拷贝。 问题 11. 为什么说 Cloneable 是一个标记接口 Cloneable 接口被称为标记接口是因为它本身并没有定义任何方法它的作用主要是为了标记一个类的对象可以被克隆。 在 Java 中Cloneable 接口的主要作用是告诉 Object 的 clone() 方法它可以对实现了 Cloneable 接口的类的对象进行字段对字段的复制。 如果一个类没有实现 Cloneable 接口但是调用了它的 clone() 方法那么将会在运行时抛出 CloneNotSupportedException 异常。 因此Cloneable 接口虽然没有定义任何方法但是它对于 Java 的对象克隆机制来说非常重要它是一种标记表明一个类的对象可以被克隆。 2.3、Java序列化反序列化相关 问题 12. 什么是 Java 的序列化和反序列化 解答Java 的序列化Serialization和反序列化Deserialization是 Java 对象持久化的一种机制。 序列化序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化过程中对象将其当前状态写入到一个输出流中。 反序列化反序列化是从一个输入流中读取对象的状态信息并根据这些信息创建对象的过程。 序列化和反序列化在很多场景中都非常有用例如 在网络通信中序列化可以用于在网络上发送对象。在持久化数据时序列化可以用于将对象保存到磁盘然后在需要时通过反序列化重新创建。在 Java RMI远程方法调用技术中序列化和反序列化被用于在 JVM 之间传递对象。 在 Java 中如果一个类的对象需要支持序列化和反序列化那么这个类需要实现 java.io.Serializable 接口。这个接口是一个标记接口没有定义任何方法只是用来表明一个类的对象可以被序列化和反序列化。 问题 13.Java 中的 Serializable 接口有什么作用 解答在 Java 中Serializable 接口是一个标记接口用于表明一个类的对象可以被序列化和反序列化。 序列化是将对象的状态信息转换为可以存储或传输的形式的过程。反序列化则是从一个输入流中读取对象的状态信息并根据这些信息创建对象的过程。 如果一个类实现了 Serializable 接口那么它的对象可以被序列化即可以将对象的状态信息写入到一个输出流中。然后这个输出流可以被存储到磁盘或通过网络发送到另一个运行 JVM 的机器。在需要时可以从这个输出流中读取对象的状态信息并通过反序列化重新创建对象。 需要注意的是Serializable 接口本身并没有定义任何方法它只是一个标记接口。实际的序列化和反序列化过程是由 JVM 通过一些特殊的机制来完成的。 问题 14. 在 Java 中如果一个对象的某个字段不想被序列化应该如何处理 在 Java 中如果你不希望对象的某个字段被序列化你可以使用 transient 关键字来修饰这个字段。 transient 是 Java 的一个关键字用来表示一个字段不应该被序列化。在对象序列化的过程中被 transient 修饰的字段会被忽略不会被写入到输出流中。因此这个字段的状态信息不会被持久化。 例如 public class MyClass implements Serializable {private int field1;private transient int field2;// ... }在这个例子中field1 字段会被序列化而 field2 字段则不会被序列化。 需要注意的是如果一个字段被标记为 transient那么在反序列化的过程中这个字段的值会被初始化为其类型的默认值例如 null、0 或 false。 问题 15. 如何自定义序列化与反序列化过程 解答在 Java 中虽然默认的序列化机制已经足够强大但在某些情况下你可能需要自定义序列化过程。例如你可能需要对某些敏感信息进行加密或者需要以特定的格式写入对象的状态信息。 要自定义序列化过程你可以在类中添加一个名为 writeObject() 的方法。这个方法必须接受一个 ObjectOutputStream 类型的参数并且返回 void private void writeObject(ObjectOutputStream out) throws IOException {// 自定义序列化过程 }在这个方法中你可以自定义序列化过程。例如你可以选择只序列化部分字段或者对某些字段进行特殊处理。 需要注意的是writeObject() 方法必须是 private 的这是因为序列化机制会忽略 public 和 protected 的 writeObject() 方法。 同样如果你需要自定义反序列化过程你可以添加一个名为 readObject() 的方法 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {// 自定义反序列化过程 }在这个方法中你可以自定义反序列化过程。例如你可以选择只反序列化部分字段或者对某些字段进行特殊处理。 同样readObject() 方法必须是 private 的。 问题 16. 静态字段是否可以被序列化为什么 解答静态字段不能被序列化。这是因为静态字段不属于对象而是属于类。 在 Java 中静态字段是类级别的所有的对象实例共享同一个静态字段。因此静态字段的状态不应该被看作是对象的一部分所以在序列化对象时静态字段会被忽略。 序列化的主要目的是为了保存对象的状态以便在需要时可以恢复这个状态。但是静态字段的状态是与特定的对象无关的所以无需在序列化过程中保存和恢复。 如果你需要保存和恢复静态字段的状态你需要通过其他方式来实现例如你可以在序列化和反序列化过程中手动处理静态字段。 问题 17. 在 Java 中默认的序列化机制是怎样的 解答在 Java 中对象的默认序列化机制是通过实现 java.io.Serializable 接口来完成的。Serializable 是一个标记接口它本身并没有定义任何方法但是它告诉 Java 虚拟机JVM这个对象是可以被序列化的。 当一个对象被序列化时JVM 会将该对象的类信息、类的签名以及非静态和非瞬态字段的值写入到一个输出流中。这个过程是自动的不需要程序员进行任何特殊处理。 具体来说序列化过程如下 如果对象的类定义了 writeObject 方法那么 JVM 会调用这个方法进行序列化。否则JVM 会默认地进行序列化。 JVM 会检查每个需要序列化的字段。如果字段是基本类型那么 JVM 会直接写入其值。如果字段是引用类型那么 JVM 会递归地对这个字段指向的对象进行序列化。 如果对象的类实现了 Externalizable 接口那么 JVM 会调用 writeExternal 方法进行序列化。 反序列化过程与序列化过程相反。当一个对象被反序列化时JVM 会从输入流中读取类信息和字段的值然后根据这些信息创建新的对象。 需要注意的是静态字段和用 transient 关键字修饰的字段不会被序列化。静态字段属于类而不是对象。transient 关键字告诉 JVM 该字段不应该被序列化。 2.4、Java数据类型相关 问题 18. Java 中的基本数据类型有哪些 解答Java 中的数据类型可以分为 4 类 8 种4 类分别为整型、浮点型、字符型和布尔型。 整型包括 byte、short、int 和 long 四种类型主要用于表示没有小数部分的数值区别在于它们的取值范围和存储大小不同。 byte占用 1 字节取值范围为 -128 到 127 short占用 2 字节取值范围为 -32768 到 32767 int占用 4 字节取值范围为 -2147483648 到 2147483647 long占用 8 字节取值范围为 -9223372036854775808 到 9223372036854775807 浮点型包括 float 和 double 两种类型主要用于表示有小数部分的数值。 float单精度浮点型占用 4 字节取值范围为 1.4E-45 到 3.4028235E38 double双精度浮点型占用 8 字节取值范围为 4.9E-324 到 1.7976931348623157E308 字符型只有 char 一种类型主要用于表示单个字符。 char占用 2 字节取值范围为 0 到 65535可以表示 Unicode 编码中的任何字符。 布尔型只有 boolean 一种类型主要用于表示真或假的逻辑值。 boolean只有两个取值即 true 和 false。 问题 19. Java 中的自动装箱和拆箱是什么 解答自动装箱和拆箱是 Java 5.0 版本引入的新特性主要用于基本数据类型和对应的包装类之间的自动转换。 自动装箱和拆箱是 Java 编译器的特性它在编译阶段会自动为我们插入必要的代码来实现基本数据类型和包装类之间的转换。 自动装箱Autoboxing是指基本数据类型自动转换为对应的包装类。例如将 int 类型自动转换为 Integer 类型。 int i 10; Integer integer i; // 自动装箱 编译器会将这行代码转换为Integer integer Integer.valueOf(i);自动拆箱Unboxing是指包装类自动转换为对应的基本数据类型。例如将 Integer 类型自动转换为 int 类型。 Integer integer new Integer(10); int i integer; // 自动拆箱 编译器会将这行代码转换为int i integer.intValue();这两个特性使得基本数据类型和包装类在很多情况下可以互相替代大大提高了编程的便利性。 问题 20. 在 Java 中什么是强制类型转换、隐式类型转换、显式类型转换 解答 强制类型转换也称为显式类型转换是指程序员明确要求进行的类型转换。在 Java 中可以通过在表达式前加上类型名的方式来进行强制类型转换。例如 double d 10.5; int i (int) d; // 将 double 类型转换为 int 类型隐式类型转换也称为自动类型转换是指编译器在编译过程中自动进行的类型转换。在 Java 中当我们把一个表示范围小的类型赋值给一个表示范围大的类型时编译器会自动进行类型转换。例如 int i 10; double d i; // 将 int 类型自动转换为 double 类型显式类型转换和强制类型转换是同一个概念都是指程序员明确要求进行的类型转换。 2.5、Java字符串相关 问题 21. 为什么 Java 中的字符串不可变它有什么优势 解答Java 中的字符串被设计为不可变的这意味着一旦创建字符串对象其内容无法更改。这个设计决策具有一些重要的优势 线程安全性 不可变字符串是线程安全的因为多个线程可以同时访问一个字符串对象而无需担心并发修改导致的问题。这对于多线程应用程序来说是非常重要的。 安全性 不可变字符串可以用作参数传递给方法而不必担心方法在不经意间更改了字符串的内容。 性能优化 因为字符串不可变可以在运行时对其进行缓存以减少内存占用和提高性能。例如多个字符串变量可以共享相同的字符串字面值从而节省内存。 哈希码缓存 字符串的哈希码可以在创建时计算并缓存这样在后续哈希比较如在哈希表中查找字符串时会更加高效。 字符串池 不可变字符串使得字符串池的实现更容易从而可以共享字符串字面值减少内存占用。 安全性 不可变字符串对于安全性是有帮助的。例如当字符串用于密码或其他敏感数据时不可变性可以确保这些数据不会在内存中不经意地被修改。 简化字符串操作 不可变性简化了字符串操作。例如当你连接两个字符串时实际上是创建了一个新的字符串而不是修改原始字符串。 尽管不可变字符串有很多优势但它们也有一些劣势例如在频繁修改字符串内容时可能会导致性能下降因为每次修改都会创建新的字符串对象。为了解决这个问题Java 提供了 StringBuilder 和 StringBuffer 等可变字符串类以便更高效地进行字符串拼接和修改。然而在大多数情况下不可变字符串的优点远远超过了其劣势因此它们在 Java中得到广泛应用。 问题 22. 什么是 Java 中的字符串池 解答Java 中的字符串池String Pool是 Java 堆内存中的一个特殊区域用于存储所有由字面量创建的字符串对象。 当我们创建一个字符串字面量例如String str Hello;JVM 首先会检查字符串池中是否已经存在 “Hello” 这个字符串。如果存在那么 str 就会指向这个已存在的 “Hello” 字符串如果不存在JVM 就会在字符串池中创建一个新的 “Hello” 字符串然后 str 会指向这个新创建的字符串。 通过这种方式字符串池可以帮助我们节省内存因为它允许相同的字符串字面量共享同一个存储空间。 问题 23. 简述 String str aaa 与 String str new String(i) 一样吗 解答String str aaa; 和 String str new String(aaa); 在 Java 中并不完全相同。 String str aaa;这种方式创建的字符串会被放入字符串池中。如果字符串池中已经存在 “aaa” 这个字符串那么 str 就会指向这个已存在的字符串如果不存在JVM 就会在字符串池中创建一个新的 “aaa” 字符串然后 str 会指向这个新创建的字符串。 String str new String(aaa);这种方式会在堆内存中创建一个新的字符串对象然后 str 会指向这个新创建的对象。这时无论字符串池中是否存在 “aaa” 这个字符串都不会影响 str 的创建。 所以虽然这两种方式创建的字符串内容相同但是他们在内存中的存储位置可能不同。如果你使用 操作符比较这两个字符串可能会得到 false因为 操作符比较的是对象的引用而不是内容。如果你使用 equals() 方法比较这两个字符串会得到 true因为 equals() 方法比较的是字符串的内容 问题 24. Java 中有哪些创建字符串的方式 解答在 Java 中主要有以下几种创建字符串的方式 字符串字面量这是最常见的创建字符串的方式例如 String str Hello;。这种方式创建的字符串会被放入字符串池中。 使用 new 关键字例如 String str new String(Hello);。这种方式会在堆内存中创建一个新的字符串对象。 通过字符数组例如 char[] array {H, e, l, l, o}; String str new String(array);。这种方式会创建一个新的字符串内容是字符数组的内容。 通过 StringBuilder 或 StringBuffer例如 StringBuilder sb new StringBuilder(Hello); String str sb.toString();。这种方式可以创建一个可变的字符串然后再转换为不可变的 String。 通过 String.format() 方法例如 String str String.format(Hello %s, World);。这种方式可以创建一个格式化的字符串。 以上就是在 Java 中创建字符串的主要方式。 问题 25. 介绍一下 String、StringBuffer、StringBuilder 和他们之间的区别 解答 String在 Java 中String 是不可变的也就是说一旦一个 String 对象被创建我们就不能改变它的内容。每次对 String 类型进行修改都会生成一个新的 String 对象。这在需要大量修改字符串时会导致内存的大量占用和效率的降低。 StringBufferStringBuffer 是线程安全的可变字符序列。每个方法都是同步的可以被多个线程安全地调用。但是这种线程安全带来的缺点是效率相对较低。 StringBuilderStringBuilder 是一个可变字符序列它提供了 append、insert、delete、reverse、setCharAt 等方法来修改字符串。与 StringBuffer 相比StringBuilder 不是线程安全的因此在单线程环境下StringBuilder 的效率更高。 总结一下他们之间的区别主要在于 String 是不可变的而 StringBuffer 和 StringBuilder 是可变的。StringBuffer 是线程安全的而 StringBuilder 是非线程安全的。在单线程环境下如果需要对字符串进行大量修改应优先考虑使用 StringBuilder。在多线程环境下应使用 StringBuffer 来确保线程安全。如果字符串不需要修改那么使用 String 是最好的选择。
http://www.yayakq.cn/news/3819/

相关文章:

  • 免费行情软件app网站mnw直免费下载安装app
  • 公司网站建设为什么不直接买模版wordpress软文文件
  • 浦东新区建设工程安全质量监督站网站工商年检网上申报系统
  • 网站图片大小建设申请网站首页
  • 自建企业网站教程wordpress 备份云盘
  • 网站广告下悬浮代码怎么做wordpress安全教程
  • 商城网站设计说明书视频网站做视频节目赚钱吗
  • 网站开发前台与后台的交互俄罗斯乌克兰最新战况
  • 青岛做网站推广公司哪家好自己做软件的网站
  • 电商网站开发流程图平台设计标准
  • 网站制作 成都祥云网站建设
  • 网站建设嗟商文件外贸免费开发网站模板
  • 线上投票怎么做苏州网站建设优化
  • 企业网站建设价钱做微课常用的网站
  • 网站搭建十大品牌公司网站空间租用费用
  • 谈谈对网站建设的认识站长收录平台
  • 中国建筑公司网站成都网站建设优惠活动
  • 不是网站可以用云主机吗上海网站建设开发公司
  • 有哪些网站可以做ps挣钱免费建网站的服务器
  • 流媒体网站开发pdf如何在百度提交网站
  • 代理ip提取网站源码设计平台图片
  • 天津市建行网站全球做的比较好的网站有哪些
  • 模板建站的网站排名优化公司好不好
  • 北外网院网站建设作业上海哪家公司做网站最好
  • 上海手机网站建设报价表WordPress评论加签到
  • 北京各大网站推广平台哪家好网站建设氺金手指排名15
  • 自助式建站平台wordpress手机端怎么设置
  • 如何用front怕个做网站青海省住房和城乡建设厅 网站首页
  • 游戏网站怎么赚钱推荐几个高端大气上档次网站
  • 如何建一个自己的网站wordpress 入侵视频教程