[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/UserXSX/JavaGuide/main/docs/java/basis/java-basic-questions-02.md [Back]  [Original]

--- title: Java() description: JavaObjectString/StringBuffer/StringBuilderJava OOP category: Java tag: - Java head: - - meta - name: keywords content: ,,,,,Object,equals,hashCode,String,,Java --- ## ### Procedural-Oriented ProgrammingPOPObject-Oriented ProgrammingOOP - **POP** - **OOP** POPOOP - ****OOP - ****OOP - **** POP POP OOP issue : [](https://github.com/Snailclimb/JavaGuide/issues/431) ![ POP OOP ](https://oss.javaguide.cn/github/javaguide/java/basis/pop-vs-oop-performance.png) **** ```java public class Circle { // private double radius; // public Circle(double radius) { this.radius = radius; } // public double getArea() { return Math.PI * radius * radius; } // public double getPerimeter() { return 2 * Math.PI * radius; } public static void main(String[] args) { // 3 Circle circle = new Circle(3.0); // System.out.println("" + circle.getArea()); System.out.println("" + circle.getPerimeter()); } } ``` `Circle` **** ```java public class Main { public static void main(String[] args) { // double radius = 3.0; // double area = Math.PI * radius * radius; double perimeter = 2 * Math.PI * radius; // System.out.println("" + area); System.out.println("" + perimeter); } } ``` ### ?? new new - 0 1 - n n ### - - ```java String str1 = "hello"; String str2 = new String("hello"); String str3 = "hello"; // == System.out.println(str1 == str2); System.out.println(str1 == str3); // equals System.out.println(str1.equals(str2)); System.out.println(str1.equals(str3)); ``` ```plain false true true true ``` - `str1` `str2` `str1` `str3` `==` - `str1` `str2``str3` `equals` ### ? Java ### override? - **** - **** `void` - **** **override****overload** ### #### ```java public class Student { private int id;//id private String name;//name //id public int getId() { return id; } //id public void setId(int id) { this.id = id; } //name public String getName() { return name; } //name public void setName(String name) { this.name = name; } } ``` #### ** 3 ** 1. **** 2. 3. #### **:** - / - - - ```mermaid flowchart LR subgraph OOP[""] style OOP fill:#F0F2F5,stroke:#E0E6ED,stroke-width:1.5px subgraph Encapsulation[" Encapsulation"] style Encapsulation fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px E1[""]:::core E2[""]:::core E3[""]:::core end subgraph Inheritance[" Inheritance"] style Inheritance fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px I1[""]:::core I2[""]:::core I3[""]:::highlight end subgraph Polymorphism[" Polymorphism"] style Polymorphism fill:#F5F7FA,stroke:#E0E6ED,stroke-width:1.5px P1[""]:::core P2[""]:::core P3[""]:::core end end classDef core fill:#4CA497,color:#fff,rx:10,ry:10 classDef highlight fill:#E99151,color:#fff,rx:10,ry:10 linkStyle default stroke-width:1.5px,opacity:0.8 ``` ### #### - **** - **** #### - **** - **** Java - **** `public static final` `private`, `protected`, `public` - **** - Java 8 `public abstract` Java 8 `default` `static` Java 9 `private` - Java 8 `default` `static` `private` Java 8 `default` ```java public interface MyInterface { default void defaultMethod() { System.out.println("This is a default method."); } } ``` Java 8 `static` `MyInterface.staticMethod()``static` ```java public interface MyInterface { static void staticMethod() { System.out.println("This is a static method in the interface."); } } ``` Java 9 `private` `private` ```java public interface MyInterface { // default default void defaultMethod() { commonMethod(); } // static static void staticMethod() { commonMethod(); } // static default private static void commonMethod() { System.out.println("This is a private method used internally."); } // default private void instanceCommonMethod() { System.out.println("This is a private instance method used internally."); } } ``` ### ```mermaid flowchart LR Copy[""] --> RefCopy["
"] Copy --> ShallowCopy["
"] Copy --> DeepCopy["
"] classDef main fill:#005D7B,color:#fff,rx:10,ry:10 class Copy main linkStyle default stroke-width:1.5px,opacity:0.8 ``` - **** - **** #### `Cloneable` `clone()` `clone()` `Object` `clone()` ```java public class Address implements Cloneable{ private String name; // Getter&Setter @Override public Address clone() { try { return (Address) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError(); } } } public class Person implements Cloneable { private Address address; // Getter&Setter @Override public Person clone() { try { Person person = (Person) super.clone(); return person; } catch (CloneNotSupportedException e) { throw new AssertionError(); } } } ``` ```java Person person1 = new Person(new Address("")); Person person1Copy = person1.clone(); // true System.out.println(person1.getAddress() == person1Copy.getAddress()); ``` `person1` `person1` `Address` #### `Person` `clone()` `Person` `Address` ```java @Override public Person clone() { try { Person person = (Person) super.clone(); person.setAddress(person.getAddress().clone()); return person; } catch (CloneNotSupportedException e) { throw new AssertionError(); } } ``` ```java Person person1 = new Person(new Address("")); Person person1Copy = person1.clone(); // false System.out.println(person1.getAddress() == person1Copy.getAddress()); ``` `person1` `person1` `Address` **** ![](https://oss.javaguide.cn/github/javaguide/java/basis/shallow&deep-copy.png) ## Object ### Object Object 11 ```java /** * native Class final */ public final native Class getClass() /** * native JDK HashMap */ public native int hashCode() /** * 2 String */ public boolean equals(Object obj) /** * native */ protected native Object clone() throws CloneNotSupportedException /** * 16 Object */ public String toString() /** * native () */ public final native void notify() /** * native notify */ public final native void notifyAll() /** * nativesleep wait timeout */ public final native void wait(long timeout) throws InterruptedException /** * nanos 0-999999 nanos */ public final void wait(long timeout, int nanos) throws InterruptedException /** * 2wait */ public final void wait() throws InterruptedException /** * */ protected void finalize() throws Throwable { } ``` ### == equals() **`==`** - `==` - `==` > Java == **`equals()`** `equals()``Object``Object``equals()` `Object` `equals()` ```java public boolean equals(Object obj) { return (this == obj); } ``` `equals()` - ** `equals()`**`equals()`== `Object``equals()` - ** `equals()`** `equals()` true() IDEA IDE `==` `equals()` ```java String a = new String("ab"); // a String b = new String("ab"); // b, String aa = "ab"; // String bb = "ab"; // System.out.println(aa == bb);// true System.out.println(a == b);// false System.out.println(a.equals(b));// true System.out.println(42 == 42.0);// true ``` `String` `equals` `Object` `equals` `String` `equals` `String` `String aa = "ab"` `String` `new``String a = new String("ab")`**** "ab" `String``equals()` ```java public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; } ``` ### hashCode() `hashCode()` `int` ![hashCode() ](https://oss.javaguide.cn/github/javaguide/java/basis/java-hashcode-method.png) `hashCode()` JDK `Object` Java `hashCode()` `Object` `hashCode()` C C++ > **Oracle OpenJDK8** " Marsaglia's xor-shift ", "" "", JDK/VM **Oracle OpenJDK8** (), VM : -XX:hashCode=4 : > > - 1127 > - 537 ```java public native int hashCode(); ``` (key-value)**** ### hashCode HashSet hashCode HashSet HashSet `hashCode()` bucket 1. 2. HashSet - **** - **** equals() `equals()` true`HashSet` false **** `hashCode()` `equals()` `HashSet` `equals()` ** JDK ** `HashMap``HashSet` `hashCode()` `HashSet` `HashSet` `HashSet` `hashCode` `equals()` `hashCode` ** `hashCode()` ** `hashCode` ** `hashCode` ** `hashCode()` `hashCode` ) - `hashCode` - `hashCode` `equals()` `true` - `hashCode` `hashCode()` `equals()` ### equals() hashCode() `hashCode` `equals` `hashCode` `equals()` `hashCode()` `equals` `hashCode` **** `equals()` `hashCode()` `HashMap` **** - `equals` `hashCode` - `hashCode` `hashCode()` `equals()` [Java hashCode() equals()](https://www.cnblogs.com/skywang12345/p/3324958.html) ## String ### StringStringBufferStringBuilder **** `String` `StringBuilder` `StringBuffer` `AbstractStringBuilder` `AbstractStringBuilder` `final` `private` `AbstractStringBuilder` `append` ```java abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this; } //... } ``` **** `String` `AbstractStringBuilder` `StringBuilder` `StringBuffer` `expandCapacity``append``insert``indexOf` `StringBuffer` `StringBuilder` stringbuffer-methods.png [stringbuffer-methods.png] **** `String` `String` `String` `StringBuffer` `StringBuffer` `StringBuilder` `StringBuffer` 10%~15% **** - : `String` - : `StringBuilder` - : `StringBuffer` ### String ? `String` `final` ~~`String` ~~ ```java public final class String implements java.io.Serializable, Comparable, CharSequence { private final char value[]; //... } ``` > `final` `final` `String` `final` > > `String` > > 1. `final` `String` / > 2. `String` `final` `String` > > [ String - ](https://www.zhihu.com/question/20618891/answer/114125846) > > [issue 675](https://github.com/Snailclimb/JavaGuide/issues/675) Java 9 `String``StringBuilder` `StringBuffer` `byte` > > ```java > public final class String implements java.io.Serializable,Comparable, CharSequence { > // @Stable > @Stable > private final byte[] value; > } > > abstract class AbstractStringBuilder implements Appendable, CharSequence { > byte[] value; > > } > ``` > > **Java 9 `String` `char[]` `byte[]` ?** > > String Latin-1 UTF-16 Latin-1 Latin-1 Latin-1 `byte` (8 )`char` 2 16`byte` `char` > > JDK Latin-1 > > ![](https://oss.javaguide.cn/github/javaguide/jdk9-string-latin1.png) > > Latin-1 `byte` `char` > > ### + StringBuilder? Java ++= String Java ```java String str1 = "he"; String str2 = "llo"; String str3 = "world"; String str4 = str1 + str2 + str3; ``` ![](https://oss.javaguide.cn/github/javaguide/java/image-20220422161637929.png) + `StringBuilder` `append()` `toString()` `String` +** `StringBuilder` `StringBuilder` ** ```java String[] arr = {"he", "llo", "world"}; String s = ""; for (int i = 0; i < arr.length; i++) { s += arr[i]; } System.out.println(s); ``` `StringBuilder` `StringBuilder` ![](https://oss.javaguide.cn/github/javaguide/java/image-20220422161320823.png) `StringBuilder` ```java String[] arr = {"he", "llo", "world"}; StringBuilder s = new StringBuilder(); for (String value : arr) { s.append(value); } System.out.println(s); ``` ![](https://oss.javaguide.cn/github/javaguide/java/image-20220422162327415.png) IDEA IDEA JDK 9 + `makeConcatWithConstants()` `a+b+c` append StringBuilder JDK9 [JEP 280](https://openjdk.org/jeps/280) [StringBuilder](https://juejin.cn/post/7182872058743750715) [issue#2442](https://github.com/Snailclimb/JavaGuide/issues/2442) ### String#equals() Object#equals() `String` `equals` String `Object` `equals` ### **** JVM String ```java // 1. "ab""ab" // 2. "ab" aa String aa = "ab"; // "ab" bb String bb = "ab"; System.out.println(aa==bb); // true ``` [Java ](https://javaguide.cn/java/jvm/memory-area.html) ### String s1 = new String("abc"); 1 2 1. "abc" 2 `ldc` `new String()` "abc" 2. "abc" 1 `new String()` "abc" 1 abc "abc" "abc" JDK 1.8 ```java String s1 = new String("abc"); ``` ```java // String // #2 java/lang/String // java/lang/String 0 new #2 // String // 3 dup // JVM "abc" // "abc" // "abc" JVM // 4 ldc #3 // "abc" String // String "abc" 6 invokespecial #4 // String 9 astore_1 // 10 return ``` `ldc (load constant)` `ldc` 1. ****`ldc` 2. ****`ldc` 3. ****JVM 2abc 1 abc JDK 1.8 ```java // abc String s1 = "abc"; // 1 abc String s2 = new String("abc"); ``` ```java 0 ldc #2 2 astore_1 3 new #3 6 dup 7 ldc #2 9 invokespecial #4 12 astore_2 13 return ``` 7 `ldc` abc 0 `ldc` abc7 `ldc` abc ### String#intern ? `String.intern()` `native` () 1. **** `intern()` `String` `intern()` 2. **** `intern()` `intern()` - `intern()` - `intern()` JDK 1.8 : ```java // s1 "Java" String s1 = "Java"; // s2 "Java" s1 String s2 = s1.intern(); // "Java" s3 String s3 = new String("Java"); // s4 "Java" s1 String s4 = s3.intern(); // s1 s2 System.out.println(s1 == s2); // true // s3 s4 System.out.println(s3 == s4); // false // s1 s4 System.out.println(s1 == s4); // true ``` ### String + `final` JDK1.8 ```java String str1 = "str"; String str2 = "ing"; String str3 = "str" + "ing"; String str4 = str1 + str2; String str5 = "string"; System.out.println(str3 == str4);//false System.out.println(str3 == str5);//true System.out.println(str4 == str5);//false ``` > **** String `equals()` `String` `equals` `Object` `equals` `String` `equals` `==` IDEA `equals()` ![](https://oss.javaguide.cn/java-guide-blog/image-20210817123252441.png) ** jvm ** Javac **(Constant Folding)** Java ![](https://oss.javaguide.cn/javaguide/image-20210817142715396.png) Javac () `String str3 = "str" + "ing";` `String str3 = "string";` - ( `byte``boolean``short``char``int``float``long``double`) - `final` - +\>>> **** + `StringBuilder` `append()` `toString()` `String` ```java String str4 = new StringBuilder().append(str1).append(str2).toString(); ``` `StringBuilder` `StringBuffer` `final` ```java final String str1 = "str"; final String str2 = "ing"; // String c = "str" + "ing";// String d = str1 + str2; // System.out.println(c == d);// true ``` `final` `String` `str2` ```java final String str1 = "str"; final String str2 = getStr(); String c = "str" + "ing";// String d = str1 + str2; // System.out.println(c == d);// false public static String getStr() { return "ing"; } ``` ## - String#intern - Java String - R RednaxelaFX
Web Proxy Viewer  |  New URL  |  Original Page