## ç®å½
* [ä¸ãæ°æ®ç±»å](#䏿°æ®ç±»å)
* [åºæ¬ç±»å](#åºæ¬ç±»å)
* [å
è£
ç±»å](#å
è£
ç±»å)
* [ç¼åæ± ](#ç¼åæ± )
* [äºãString](#äºstring)
* [æ¦è§](#æ¦è§)
* [ä¸å¯åç好å¤](#ä¸å¯åç好å¤)
* [String, StringBuffer and StringBuilder](#string,-stringbuffer-and-stringbuilder)
* [String Pool](#string-pool)
* [new String("abc")](#new-string"abc")
* [ä¸ãè¿ç®](#ä¸è¿ç®)
* [åæ°ä¼ é](#åæ°ä¼ é)
* [float ä¸ double](#float-ä¸-double)
* [éå¼ç±»å转æ¢](#éå¼ç±»å转æ¢)
* [switch](#switch)
* [åãç»§æ¿](#åç»§æ¿)
* [è®¿é®æé](#è®¿é®æé)
* [æ½è±¡ç±»ä¸æ¥å£](#æ½è±¡ç±»ä¸æ¥å£)
* [super](#super)
* [éåä¸éè½½](#éåä¸éè½½)
* [äºãObject éç¨æ¹æ³](#äºobject-éç¨æ¹æ³)
* [æ¦è§](#æ¦è§)
* [equals()](#equals)
* [hashCode()](#hashcode)
* [toString()](#tostring)
* [clone()](#clone)
* [å
ãå
³é®å](#å
å
³é®å)
* [final](#final)
* [static](#static)
* [ä¸ãåå°](#ä¸åå°)
* [å
«ãå¼å¸¸](#å
«å¼å¸¸)
* [ä¹ãæ³å](#乿³å)
* [åãæ³¨è§£](#åæ³¨è§£)
* [åä¸ãç¹æ§](#åä¸ç¹æ§)
* [Java åçæ¬çæ°ç¹æ§](#java-åçæ¬çæ°ç¹æ§)
* [Java ä¸ C++ çåºå«](#java-ä¸-c-çåºå«)
* [JRE or JDK](#jre-or-jdk)
* [Lambda表达å¼](#Lambda表达å¼)
* [åèèµæ](#åèèµæ)
## é¢è¯é¢
# ä¸ãæ°æ®ç±»å
## åºæ¬ç±»å
- byte/8bit
- char/16bit
- short/16bit
- int/32bit
- float/32bit
- long/64bit
- double/64bit
- boolean/\~
boolean åªæä¸¤ä¸ªå¼ï¼trueãfalseï¼å¯ä»¥ä½¿ç¨ 1 bit æ¥åå¨ï¼ä½æ¯å
·ä½å¤§å°æ²¡ææç¡®è§å®ãJVM ä¼å¨ç¼è¯æ¶æå° boolean ç±»åçæ°æ®è½¬æ¢ä¸º intï¼ä½¿ç¨ 1 æ¥è¡¨ç¤º trueï¼0 表示 falseãJVM æ¯æ boolean æ°ç»ï¼ä½æ¯æ¯éè¿è¯»å byte æ°ç»æ¥å®ç°çã
1byte=8bit, 8ä½ä½ä¸ºä¸ä¸ªåèï¼å符ï¼charï¼æ¯Javaä¸çä¸ç§åºæ¬æ°æ®ç±»åï¼ç±2个åèç»æãå¨UTF-8ç¼ç ä¸ï¼ä¸ä¸ªè±æå符å ä¸ä¸ªåèï¼ä¸ä¸ªä¸æï¼å«ç¹ä½ï¼å 3个åèï¼è±ææ ç¹å ä¸ä¸ªåèï¼ä¸ææ ç¹å 3个åèï¼èUnicodeç¼ç ä¸è±æå䏿齿¯å 2个åèï¼æ ç¹ä¹æ¯ä¸æ ·ã
## å
è£
ç±»å
åºæ¬ç±»å齿坹åºçå
è£
ç±»åï¼åºæ¬ç±»åä¸å
¶å¯¹åºçå
è£
ç±»åä¹é´çèµå¼ä½¿ç¨èªå¨è£
ç®±ä¸æç®±å®æã
```java
Integer x = 2; // è£
ç®±
int y = x; // æç®±
```
## ç¼åæ±
new Integer(123) ä¸ Integer.valueOf(123) çåºå«å¨äºï¼
- new Integer(123) æ¯æ¬¡é½ä¼æ°å»ºä¸ä¸ªå¯¹è±¡ï¼
- Integer.valueOf(123) ä¼ä½¿ç¨ç¼åæ± ä¸ç对象ï¼å¤æ¬¡è°ç¨ä¼åå¾åä¸ä¸ªå¯¹è±¡çå¼ç¨ã
```java
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
Integer a = 121;
Integer b = 121;
System.out.println(a==b); // true
Integer c = 200;
Integer d = 200;
System.out.println(c==d); // falseï¼æ³¨æintçåå¼èå´
```
valueOf() æ¹æ³çå®ç°æ¯è¾ç®åï¼å°±æ¯å
夿弿¯å¦å¨ç¼åæ± ä¸ï¼å¦æå¨çè¯å°±ç´æ¥è¿åç¼åæ± çå
容ã
```java
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
```
å¨ Java 8 ä¸ï¼Integer ç¼åæ± ç大å°é»è®¤ä¸º -128\~127ã
```java
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
```
ç¼è¯å¨ä¼å¨èªå¨è£
ç®±è¿ç¨è°ç¨ valueOf() æ¹æ³ï¼å æ¤å¤ä¸ªå¼ç¸åä¸å¼å¨ç¼åæ± èå´å
ç Integer å®ä¾ä½¿ç¨èªå¨è£
ç®±æ¥å建ï¼é£ä¹å°±ä¼å¼ç¨ç¸åç对象ã
```java
Integer m = 123;
Integer n = 123;
System.out.println(m == n); // true
```
åºæ¬ç±»å对åºçç¼å²æ± å¦ä¸ï¼
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
- char in the range \u0000 to \u007F
å¨ä½¿ç¨è¿äºåºæ¬ç±»å对åºçå
è£
ç±»åæ¶ï¼å°±å¯ä»¥ç´æ¥ä½¿ç¨ç¼å²æ± ä¸ç对象ã
[StackOverflow : Differences between new Integer(123), Integer.valueOf(123) and just 123
](https://stackoverflow.com/questions/9030817/differences-between-new-integer123-integer-valueof123-and-just-123)
# äºstring
## æ¦è§
String 被声æä¸º finalï¼å æ¤å®ä¸å¯è¢«ç»§æ¿ã
å¨ Java 8 ä¸ï¼String å
é¨ä½¿ç¨ char æ°ç»å卿°æ®ã
```java
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
```
å¨ Java 9 ä¹åï¼String ç±»çå®ç°æ¹ç¨ byte æ°ç»åå¨å符串ï¼åæ¶ä½¿ç¨ `coder` æ¥æ è¯ä½¿ç¨äºåªç§ç¼ç ã
```java
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final byte[] value;
/** The identifier of the encoding used to encode the bytes in {@code value}. */
private final byte coder;
}
```
value æ°ç»è¢«å£°æä¸º finalï¼è¿æå³ç value æ°ç»åå§åä¹åå°±ä¸è½åå¼ç¨å
¶å®æ°ç»ãå¹¶ä¸ String å
鍿²¡ææ¹å value æ°ç»çæ¹æ³ï¼å æ¤å¯ä»¥ä¿è¯ String ä¸å¯åã
## ä¸å¯åç好å¤
**1. å¯ä»¥ç¼å hash å¼**
å 为 String ç hash å¼ç»å¸¸è¢«ä½¿ç¨ï¼ä¾å¦ String ç¨å HashMap ç keyãä¸å¯åçç¹æ§å¯ä»¥ä½¿å¾ hash å¼ä¹ä¸å¯åï¼å æ¤åªéè¦è¿è¡ä¸æ¬¡è®¡ç®ã
**2. String Pool çéè¦**
妿ä¸ä¸ª String 对象已ç»è¢«å建è¿äºï¼é£ä¹å°±ä¼ä» String Pool ä¸åå¾å¼ç¨ãåªæ String æ¯ä¸å¯åçï¼æå¯è½ä½¿ç¨ String Poolã
**3. å®å
¨æ§**
String ç»å¸¸ä½ä¸ºåæ°ï¼String ä¸å¯åæ§å¯ä»¥ä¿è¯åæ°ä¸å¯åãä¾å¦å¨ä½ä¸ºç½ç»è¿æ¥åæ°çæ
åµä¸å¦æ String æ¯å¯åçï¼é£ä¹å¨ç½ç»è¿æ¥è¿ç¨ä¸ï¼String 被æ¹åï¼æ¹å String 对象çé£ä¸æ¹ä»¥ä¸ºç°å¨è¿æ¥çæ¯å
¶å®ä¸»æºï¼èå®é
æ
åµå´ä¸ä¸å®æ¯ã
**4. 线ç¨å®å
¨**
String ä¸å¯åæ§å¤©çå
·å¤çº¿ç¨å®å
¨ï¼å¯ä»¥å¨å¤ä¸ªçº¿ç¨ä¸å®å
¨å°ä½¿ç¨ã
[Program Creek : Why String is immutable in Java?](https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/)
## String, StringBuffer and StringBuilder
**1. å¯åæ§**
- String ä¸å¯å
- StringBuffer å StringBuilder å¯å
**2. 线ç¨å®å
¨**
- String ä¸å¯åï¼å æ¤æ¯çº¿ç¨å®å
¨ç
- StringBuilder 䏿¯çº¿ç¨å®å
¨ç
- StringBuffer æ¯çº¿ç¨å®å
¨çï¼å
é¨ä½¿ç¨ synchronized è¿è¡åæ¥
```java
public synchronized StringBuffer append(char c) {
super.append(c);
return t
}
```
[StackOverflow : String, StringBuffer, and StringBuilder](https://stackoverflow.com/questions/2971315/string-stringbuffer-and-stringbuilder)
## String Pool
åç¬¦ä¸²å¸¸éæ± ï¼String Poolï¼ä¿åçææå符串åé¢éï¼literal stringsï¼ï¼è¿äºåé¢éå¨ç¼è¯æ¶æå°±ç¡®å®ãä¸ä»
妿¤ï¼è¿å¯ä»¥ä½¿ç¨ String ç intern() æ¹æ³å¨è¿è¡è¿ç¨ä¸å°å符串添å å° String Pool ä¸ã
å½ä¸ä¸ªå符串è°ç¨ intern() æ¹æ³æ¶ï¼å¦æ String Pool ä¸å·²ç»åå¨ä¸ä¸ªå符串å该å符串å¼ç¸çï¼ä½¿ç¨ equals() æ¹æ³è¿è¡ç¡®å®ï¼ï¼é£ä¹å°±ä¼è¿å String Pool ä¸å符串çå¼ç¨ï¼å¦åï¼å°±ä¼å¨ String Pool 䏿·»å ä¸ä¸ªæ°çå符串ï¼å¹¶è¿åè¿ä¸ªæ°å符串çå¼ç¨ã
ä¸é¢ç¤ºä¾ä¸ï¼s1 å s2 éç¨ new String() çæ¹å¼æ°å»ºäºä¸¤ä¸ªä¸åå符串ï¼è s3 å s4 æ¯éè¿ s1.intern() æ¹æ³åå¾ä¸ä¸ªå符串å¼ç¨ãintern() é¦å
æ s1 å¼ç¨çå符串æ¾å° String Pool ä¸ï¼ç¶åè¿åè¿ä¸ªå符串å¼ç¨ãå æ¤ s3 å s4 å¼ç¨çæ¯åä¸ä¸ªå符串ã
```java
String s1 = new String("aaa");
String s2 = new String("aaa");
System.out.println(s1 == s2); // false
String s3 = s1.intern();
String s4 = s1.intern();
System.out.println(s3 == s4); // true
```
妿æ¯éç¨ "bbb" è¿ç§åé¢éçå½¢å¼å建å符串ï¼ä¼èªå¨å°å°å符串æ¾å
¥ String Pool ä¸ã
```java
String s5 = "bbb";
String s6 = "bbb";
System.out.println(s5 == s6); // true
```
å¨ Java 7 ä¹åï¼String Pool 被æ¾å¨è¿è¡æ¶å¸¸éæ± ä¸ï¼å®å±äºæ°¸ä¹
代ãèå¨ Java 7ï¼String Pool 被移å°å ä¸ãè¿æ¯å 为永ä¹
代çç©ºé´æéï¼å¨å¤§é使ç¨å符串çåºæ¯ä¸ä¼å¯¼è´ OutOfMemoryError é误ã
- [StackOverflow : What is String interning?](https://stackoverflow.com/questions/10578984/what-is-string-interning)
- [æ·±å
¥è§£æ String#intern](https://tech.meituan.com/in_depth_understanding_string_intern.html)
å¨ jdk6ä¸StringTableæ¯åºå®çï¼å°±æ¯1009çé¿åº¦ï¼æä»¥å¦æå¸¸éæ± ä¸çå符串è¿å¤å°±ä¼å¯¼è´æçä¸éå¾å¿«ãå¨jdk7ä¸ï¼StringTableçé¿åº¦å¯ä»¥éè¿ä¸ä¸ªåæ°æå®ï¼
-XX:StringTableSize=99991
## new String("abc")
使ç¨è¿ç§æ¹å¼ä¸å
±ä¼å建两个å符串对象ï¼åææ¯ String Pool ä¸è¿æ²¡æ "abc" å符串对象ï¼ã
- "abc" å±äºå符串åé¢éï¼å æ¤ç¼è¯æ¶æä¼å¨ String Pool ä¸å建ä¸ä¸ªåç¬¦ä¸²å¯¹è±¡ï¼æåè¿ä¸ª "abc" å符串åé¢éï¼
- èä½¿ç¨ new çæ¹å¼ä¼å¨å ä¸å建ä¸ä¸ªå符串对象ã
å建ä¸ä¸ªæµè¯ç±»ï¼å
¶ main æ¹æ³ä¸ä½¿ç¨è¿ç§æ¹å¼æ¥å建å符串对象ã
```java
public class NewStringTest {
public static void main(String[] args) {
String s = new String("abc");
}
}
```
使ç¨javacå°NewStringTestç¼è¯ä¸ºclassæä»¶ï¼ç¶å使ç¨javap -verbose NewStringTest.class è¿è¡åç¼è¯ï¼å¾å°ä»¥ä¸å
容ï¼
```java
// ...
Constant pool:
// ...
#2 = Class #18 // java/lang/String
#3 = String #19 // abc
// ...
#18 = Utf8 java/lang/String
#19 = Utf8 abc
// ...
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: new #2 // class java/lang/String
3: dup
4: ldc #3 // String abc å¼ç¨çæ¯#3
6: invokespecial #4 // Method java/lang/String."":(Ljava/lang/String;)V
9: astore_1
// ...
```
å¨ Constant Pool ä¸ï¼#19 åå¨è¿å符串åé¢é "abc"ï¼#3 æ¯ String Pool çå符串对象ï¼å®æå #19 è¿ä¸ªå符串åé¢éãå¨ main æ¹æ³ä¸ï¼0: è¡ä½¿ç¨ new #2 å¨å ä¸å建ä¸ä¸ªå符串对象ï¼å¹¶ä¸ä½¿ç¨ ldc #3 å° String Pool ä¸çå符串对象ä½ä¸º String æé 彿°çåæ°ã
以䏿¯ String æé 彿°çæºç ï¼å¯ä»¥çå°ï¼å¨å°ä¸ä¸ªå符串对象ä½ä¸ºå¦ä¸ä¸ªå符串对象çæé 彿°åæ°æ¶ï¼å¹¶ä¸ä¼å®å
¨å¤å¶ value æ°ç»å
容ï¼èæ¯é½ä¼æååä¸ä¸ª value æ°ç»ã
```java
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
```
# ä¸ãè¿ç®
## åæ°ä¼ é
Java çåæ°æ¯ä»¥å¼ä¼ éçå½¢å¼ä¼ å
¥æ¹æ³ä¸ï¼è䏿¯å¼ç¨ä¼ éã
以ä¸ä»£ç ä¸ Dog dog ç dog æ¯ä¸ä¸ªæéï¼åå¨çæ¯å¯¹è±¡çå°åãå¨å°ä¸ä¸ªåæ°ä¼ å
¥ä¸ä¸ªæ¹æ³æ¶ï¼æ¬è´¨ä¸æ¯å°å¯¹è±¡çå°å以å¼çæ¹å¼ä¼ éå°å½¢åä¸ãå æ¤å¨æ¹æ³ä¸ä½¿æéå¼ç¨å
¶å®å¯¹è±¡ï¼é£ä¹è¿ä¸¤ä¸ªæéæ¤æ¶æåçæ¯å®å
¨ä¸åç对象ï¼å¨ä¸æ¹æ¹åå
¶ææå对象çå
容æ¶å¯¹å¦ä¸æ¹æ²¡æå½±åã
```java
public class Dog {
String name;
Dog(String name) {
this.name = name;
}
String getName() {
return this.name;
}
void setName(String name) {
this.name = name;
}
String getObjectAddress() {
return super.toString();
}
}
```
```java
public class PassByValueExample {
public static void main(String[] args) {
Dog dog = new Dog("A");
System.out.println(dog.getObjectAddress()); // Dog@4554617c
func(dog);
System.out.println(dog.getObjectAddress()); // Dog@4554617c
System.out.println(dog.getName()); // A
}
private static void func(Dog dog) {
System.out.println(dog.getObjectAddress()); // Dog@4554617c
dog = new Dog("B");
System.out.println(dog.getObjectAddress()); // Dog@74a14482
System.out.println(dog.getName()); // B
}
}
```
妿卿¹æ³ä¸æ¹å对象çåæ®µå¼ä¼æ¹ååå¯¹è±¡è¯¥åæ®µå¼ï¼å 为æ¹åçæ¯åä¸ä¸ªå°åæåçå
容ã
```java
class PassByValueExample {
public static void main(String[] args) {
Dog dog = new Dog("A");
func(dog);
System.out.println(dog.getName()); // B
}
private static void func(Dog dog) {
dog.setName("B");
}
}
```
[StackOverflow: Is Java âpass-by-referenceâ or âpass-by-valueâ?](https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value)
## float ä¸ double
Java ä¸è½é弿§è¡åä¸è½¬åï¼å 为è¿ä¼ä½¿å¾ç²¾åº¦éä½ã
1.1 åé¢éå±äº double ç±»åï¼ä¸è½ç´æ¥å° 1.1 ç´æ¥èµå¼ç» float åéï¼å ä¸ºè¿æ¯åä¸è½¬åã
```java
// float f = 1.1;
```
1.1f åé¢éææ¯ float ç±»åã
```java
float f = 1.1f;
```
## éå¼ç±»å转æ¢
å 为åé¢é 1 æ¯ int ç±»åï¼å®æ¯ short ç±»å精度è¦é«ï¼å æ¤ä¸è½éå¼å°å° int ç±»åä¸è½¬å为 short ç±»åã
```java
short s1 = 1;
// s1 = s1 + 1;
```
使¯ä½¿ç¨ += æè
++ è¿ç®ç¬¦å¯ä»¥æ§è¡éå¼ç±»å转æ¢ã
```java
s1 += 1;
// s1++;
```
ä¸é¢çè¯å¥ç¸å½äºå° s1 + 1 ç计ç®ç»æè¿è¡äºåä¸è½¬åï¼
```java
s1 = (short) (s1 + 1);
```
[StackOverflow : Why don't Java's +=, -=, *=, /= compound assignment operators require casting?](https://stackoverflow.com/questions/8710619/why-dont-javas-compound-assignment-operators-require-casting)
## switch
ä» Java 7 å¼å§ï¼å¯ä»¥å¨ switch æ¡ä»¶å¤æè¯å¥ä¸ä½¿ç¨ String 对象ã
```java
String s = "a";
switch (s) {
case "a":
System.out.println("aaa");
break;
case "b":
System.out.println("bbb");
break;
}
```
switch 䏿¯æ longï¼æ¯å 为 switch ç设计åè¡·æ¯å¯¹é£äºåªæå°æ°çå 个å¼è¿è¡çå¼å¤æï¼å¦æå¼è¿äºå¤æï¼é£ä¹è¿æ¯ç¨ if æ¯è¾åéã
```java
// long x = 111;
// switch (x) { // Incompatible types. Found: 'long', required: 'char, byte, short, int, Character, Byte, Short, Integer, String, or an enum'
// case 111:
// System.out.println(111);
// break;
// case 222:
// System.out.println(222);
// break;
// }
```
[StackOverflow : Why can't your switch statement data type be long, Java?](https://stackoverflow.com/questions/2676210/why-cant-your-switch-statement-data-type-be-long-java)
# åãç»§æ¿
## è®¿é®æé
Java䏿4ä¸ªè®¿é®æé修饰符ï¼privateãdefaultãprotected 以å publicï¼å¦æä¸å 访é®ä¿®é¥°ç¬¦ï¼è¡¨ç¤ºå
级å¯è§ã

注æprotectedçè®¿é®æéï¼
protectedçå¯è§æ§å¨äºä¸¤ç¹ï¼
* åºç±»çprotectedæåæ¯å
å
å¯è§çï¼å¹¶ä¸å¯¹åç±»å¯è§ï¼
* è¥åç±»ä¸åºç±»ä¸å¨åä¸å
ä¸ï¼é£ä¹å¨åç±»ä¸ï¼åç±»å®ä¾å¯ä»¥è®¿é®å
¶ä»åºç±»ç»§æ¿èæ¥çprotectedæ¹æ³ï¼èä¸è½è®¿é®åºç±»å®ä¾çprotectedæ¹æ³ã
```java
//示ä¾ä¸
package p1;
public class Father1 {
protected void f() {} // ç¶ç±»Father1ä¸çprotectedæ¹æ³
}
package p1;
public class Son1 extends Father1 {}
package p11;
public class Son11 extends Father1{}
package p1;
public class Test1 {
public static void main(String[] args) {
Son1 son1 = new Son1();
son1.f(); // Compile OK ----ï¼1ï¼
son1.clone(); // Compile Error ----ï¼2ï¼
Son11 son = new Son11();
son11.f(); // Compile OK ----ï¼3ï¼
son11.clone(); // Compile Error ----ï¼4ï¼
}
}
/*
对äºä¸é¢ç示ä¾ï¼é¦å
ç(1)(3)ï¼å
¶ä¸çf()æ¹æ³ä»ç±»Father1ç»§æ¿èæ¥ï¼å
¶å¯è§æ§æ¯å
p1åå
¶åç±»Son1åSon11ï¼èç±äºè°ç¨f()æ¹æ³çç±»Test1æå¨çå
乿¯p1ï¼å æ¤ï¼1ï¼(3)å¤ç¼è¯éè¿ãå
¶æ¬¡ç(2)(4)ï¼å
¶ä¸çclone()æ¹æ³çå¯è§æ§æ¯java.langå
åå
¶ææåç±»ï¼å¯¹äºè¯å¥âson1.clone();âåâson11.clone();âï¼äºè
çclone()å¨ç±»Son1ãSon11䏿¯å¯è§çï¼ä½å¯¹Test1æ¯ä¸å¯è§çï¼å æ¤ï¼1ï¼(3)å¤ç¼è¯ä¸éè¿
*/
```
## æ½è±¡ç±»ä¸æ¥å£
**1. æ½è±¡ç±»**
æ½è±¡ç±»åæ½è±¡æ¹æ³é½ä½¿ç¨ abstract å
³é®åè¿è¡å£°æã妿ä¸ä¸ªç±»ä¸å
嫿½è±¡æ¹æ³ï¼é£ä¹è¿ä¸ªç±»å¿
须声æä¸ºæ½è±¡ç±»ã
æ½è±¡ç±»åæ®éç±»æå¤§çåºå«æ¯ï¼æ½è±¡ç±»ä¸è½è¢«å®ä¾åï¼éè¦ç»§æ¿æ½è±¡ç±»æè½å®ä¾åå
¶åç±»ã
```java
public abstract class AbstractClassExample {
protected int x;
private int y;
public abstract void func1();
public void func2() {
System.out.println("func2");
}
}
```
```java
public class AbstractExtendClassExample extends AbstractClassExample {
@Override
public void func1() {
System.out.println("func1");
}
}
```
```java
// AbstractClassExample ac1 = new AbstractClassExample(); // 'AbstractClassExample' is abstract; cannot be instantiated
AbstractClassExample ac2 = new AbstractExtendClassExample();
ac2.func1();
```
**2. æ¥å£**
æ¥å£æ¯æ½è±¡ç±»ç延伸ï¼å¨ Java 8 ä¹åï¼å®å¯ä»¥çææ¯ä¸ä¸ªå®å
¨æ½è±¡çç±»ï¼ä¹å°±æ¯è¯´å®ä¸è½æä»»ä½çæ¹æ³å®ç°ã
ä» Java 8 å¼å§ï¼æ¥å£ä¹å¯ä»¥æ¥æé»è®¤çæ¹æ³å®ç°ï¼è¿æ¯å ä¸ºä¸æ¯æé»è®¤æ¹æ³çæ¥å£çç»´æ¤ææ¬å¤ªé«äºãå¨ Java 8 ä¹åï¼å¦æä¸ä¸ªæ¥å£æ³è¦æ·»å æ°çæ¹æ³ï¼é£ä¹è¦ä¿®æ¹ææå®ç°äºè¯¥æ¥å£çç±»ã
æ¥å£çæåï¼å段 + æ¹æ³ï¼é»è®¤é½æ¯ public çï¼å¹¶ä¸ä¸å
许å®ä¹ä¸º private æè
protectedã
æ¥å£çåæ®µé»è®¤é½æ¯ static å final çã
```java
public interface InterfaceExample {
void func1();
default void func2(){
System.out.println("func2");
}
int x = 123;
// int y; // Variable 'y' might not have been initialized
public int z = 0; // Modifier 'public' is redundant for interface fields
// private int k = 0; // Modifier 'private' not allowed here
// protected int l = 0; // Modifier 'protected' not allowed here
// private void fun3(); // Modifier 'private' not allowed here
}
```
```java
public class InterfaceImplementExample implements InterfaceExample {
@Override
public void func1() {
System.out.println("func1");
}
}
```
```java
// InterfaceExample ie1 = new InterfaceExample(); // 'InterfaceExample' is abstract; cannot be instantiated
InterfaceExample ie2 = new InterfaceImplementExample();
ie2.func1();
System.out.println(InterfaceExample.x);
```
**3. æ¯è¾**
- ä»è®¾è®¡å±é¢ä¸çï¼æ½è±¡ç±»æä¾äºä¸ç§ IS-A å
³ç³»ï¼é£ä¹å°±å¿
须满足é弿¿æ¢ååï¼å³å类对象å¿
é¡»è½å¤æ¿æ¢æææç¶ç±»å¯¹è±¡ãèæ¥å£æ´åæ¯ä¸ç§ LIKE-A å
³ç³»ï¼å®åªæ¯æä¾ä¸ç§æ¹æ³å®ç°å¥çº¦ï¼å¹¶ä¸è¦æ±æ¥å£åå®ç°æ¥å£çç±»å
·æ IS-A å
³ç³»ã
- ä»ä½¿ç¨ä¸æ¥çï¼ä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£ï¼ä½æ¯ä¸è½ç»§æ¿å¤ä¸ªæ½è±¡ç±»ã
- æ¥å£çåæ®µåªè½æ¯ static å final ç±»åçï¼èæ½è±¡ç±»çåæ®µæ²¡æè¿ç§éå¶ã
- æ¥å£çæååªè½æ¯ public çï¼èæ½è±¡ç±»çæåå¯ä»¥æå¤ç§è®¿é®æéã
**4. 使ç¨éæ©**
ä½¿ç¨æ¥å£ï¼
- éè¦è®©ä¸ç¸å
³çç±»é½å®ç°ä¸ä¸ªæ¹æ³ï¼ä¾å¦ä¸ç¸å
³çç±»é½å¯ä»¥å®ç° Compareable æ¥å£ä¸ç compareTo() æ¹æ³ï¼
- éè¦ä½¿ç¨å¤éç»§æ¿ã
ä½¿ç¨æ½è±¡ç±»ï¼
- éè¦å¨å 个ç¸å
³çç±»ä¸å
±äº«ä»£ç ã
- éè¦è½æ§å¶ç»§æ¿æ¥çæåçè®¿é®æéï¼è䏿¯é½ä¸º publicã
- éè¦ç»§æ¿ééæåé常éåæ®µã
å¨å¾å¤æ
åµä¸ï¼æ¥å£ä¼å
äºæ½è±¡ç±»ãå 为æ¥å£æ²¡ææ½è±¡ç±»ä¸¥æ ¼çç±»å±æ¬¡ç»æè¦æ±ï¼å¯ä»¥çµæ´»å°ä¸ºä¸ä¸ªç±»æ·»å è¡ä¸ºãå¹¶ä¸ä» Java 8 å¼å§ï¼æ¥å£ä¹å¯ä»¥æé»è®¤çæ¹æ³å®ç°ï¼ä½¿å¾ä¿®æ¹æ¥å£çææ¬ä¹åçå¾ä½ã
- [Abstract Methods and Classes](https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)
- [æ·±å
¥çè§£ abstract class å interface](https://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/)
- [When to Use Abstract Class and Interface](https://dzone.com/articles/when-to-use-abstract-class-and-intreface)
### Javaä¸è¿æä¸ä¸ªå«æ è®°æ¥å£ï¼æ¥å£ä¸æ²¡æä»»ä½æ¹æ³ï¼å¦Cloneable, RandomAccess, Serializableï¼
æ è®°æ¥å£ï¼Markerï¼ï¼è¿å°±è¯´æäº RandomAccess 为空çåå ï¼è¿ä¸ªæ¥å£çåè½ä»
ä»
èµ·å°æ è®°çä½ç¨ã
è¿ä¸æ¯ä¸åºååæ¥å£ Serializable å·®ä¸å¤åï¼ åªè¦ä½ 认çè§å¯ï¼ å
¶å®ä¸åªè¿ä¸ä¸ªæ è®°æ¥å£ï¼ å®é
ä¸ ArrayList è¿å®ç°äºå¦å¤ä¸¤ä¸ªè¿æ ·ç空æ¥å£ï¼
Cloneable æ¥å£ ï¼å®ç°äº Cloneable æ¥å£ï¼ä»¥æç¤º Object.clone() æ¹æ³å¯ä»¥åæ³å°å¯¹è¯¥ç±»å®ä¾è¿è¡æå段å¤å¶ã 妿卿²¡æå®ç° Cloneable æ¥å£çå®ä¾ä¸è°ç¨ Object ç clone æ¹æ³ï¼åä¼å¯¼è´æåº CloneNotSupportedException å¼å¸¸ã
Serializable æ¥å£ï¼ ç±»éè¿å®ç° java.io.Serializable æ¥å£ä»¥å¯ç¨å
¶åºåååè½ãæªå®ç°æ¤æ¥å£çç±»å°æ æ³ä½¿å
¶ä»»ä½ç¶æåºååæååºååã
## super
- 访é®ç¶ç±»çæé 彿°ï¼å¯ä»¥ä½¿ç¨ super() 彿°è®¿é®ç¶ç±»çæé 彿°ï¼ä»èå§æç¶ç±»å®æä¸äºåå§åçå·¥ä½ã
- 访é®ç¶ç±»çæåï¼å¦æåç±»éåäºç¶ç±»çæä¸ªæ¹æ³ï¼å¯ä»¥éè¿ä½¿ç¨ super å
³é®åæ¥å¼ç¨ç¶ç±»çæ¹æ³å®ç°ã
```java
public class SuperExample {
protected int x;
protected int y;
public SuperExample(int x, int y) {
this.x = x;
this.y = y;
}
public void func() {
System.out.println("SuperExample.func()");
}
}
```
```java
public class SuperExtendExample extends SuperExample {
private int z;
public SuperExtendExample(int x, int y, int z) {
super(x, y);
this.z = z;
}
@Override
public void func() {
super.func();
System.out.println("SuperExtendExample.func()");
}
}
```
```java
SuperExample e = new SuperExtendExample(1, 2, 3);
e.func();
```
```html
SuperExample.func()
SuperExtendExample.func()
```
[Using the Keyword super](https://docs.oracle.com/javase/tutorial/java/IandI/super.html)
## éåä¸éè½½
**1. éåï¼Overrideï¼**
åå¨äºç»§æ¿ä½ç³»ä¸ï¼æåç±»å®ç°äºä¸ä¸ªä¸ç¶ç±»å¨æ¹æ³å£°æä¸å®å
¨ç¸åçä¸ä¸ªæ¹æ³ã
ä¸ºäºæ»¡è¶³é弿¿æ¢ååï¼éåæä»¥ä¸ä¸ä¸ªéå¶ï¼
- åç±»æ¹æ³çè®¿é®æéå¿
须大äºçäºç¶ç±»æ¹æ³ï¼
- åç±»æ¹æ³çè¿åç±»åå¿
é¡»æ¯ç¶ç±»æ¹æ³è¿åç±»åæä¸ºå
¶åç±»åã
- åç±»æ¹æ³æåºçå¼å¸¸ç±»åå¿
é¡»æ¯ç¶ç±»æåºå¼å¸¸ç±»åæä¸ºå
¶åç±»åã
ä½¿ç¨ @Override 注解ï¼å¯ä»¥è®©ç¼è¯å¨å¸®å¿æ£æ¥æ¯å¦æ»¡è¶³ä¸é¢çä¸ä¸ªéå¶æ¡ä»¶ã
ä¸é¢ç示ä¾ä¸ï¼SubClass 为 SuperClass çåç±»ï¼SubClass éåäº SuperClass ç func() æ¹æ³ãå
¶ä¸ï¼
- åç±»æ¹æ³è®¿é®æé为 publicï¼å¤§äºç¶ç±»ç protectedã
- åç±»çè¿åç±»å为 ArrayListï¼æ¯ç¶ç±»è¿åç±»å List çåç±»ã
- åç±»æåºçå¼å¸¸ç±»å为 Exceptionï¼æ¯ç¶ç±»æåºå¼å¸¸ Throwable çåç±»ã
- åç±»éåæ¹æ³ä½¿ç¨ @Override 注解ï¼ä»è让ç¼è¯å¨èªå¨æ£æ¥æ¯å¦æ»¡è¶³éå¶æ¡ä»¶ã
```java
class SuperClass {
protected List func() throws Throwable {
return new ArrayList<>();
}
}
class SubClass extends SuperClass {
@Override
public ArrayList func() throws Exception {
return new ArrayList<>();
}
}
```
å¨è°ç¨ä¸ä¸ªæ¹æ³æ¶ï¼å
仿¬ç±»ä¸æ¥æ¾çæ¯å¦æå¯¹åºçæ¹æ³ï¼å¦ææ²¡ææ¥æ¾å°åå°ç¶ç±»ä¸æ¥çï¼çæ¯å¦æç»§æ¿æ¥çæ¹æ³ãå¦åå°±è¦å¯¹åæ°è¿è¡è½¬åï¼è½¬æç¶ç±»ä¹åçæ¯å¦æå¯¹åºçæ¹æ³ãæ»çæ¥è¯´ï¼æ¹æ³è°ç¨çä¼å
级为ï¼
- this.func(this)
- super.func(this)
- this.func(super)
- super.func(super)
```java
/*
A
|
B
|
C
|
D
*/
class A {
public void show(A obj) {
System.out.println("A.show(A)");
}
public void show(C obj) {
System.out.println("A.show(C)");
}
}
class B extends A {
@Override
public void show(A obj) {
System.out.println("B.show(A)");
}
}
class C extends B {
}
class D extends C {
}
```
```java
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
D d = new D();
// å¨ A ä¸åå¨ show(A obj)ï¼ç´æ¥è°ç¨
a.show(a); // A.show(A)
// å¨ A ä¸ä¸åå¨ show(B obj)ï¼å° B 转åæå
¶ç¶ç±» A
a.show(b); // A.show(A)
// å¨ B ä¸åå¨ä» A ç»§æ¿æ¥ç show(C obj)ï¼ç´æ¥è°ç¨
b.show(c); // A.show(C)
// å¨ B ä¸ä¸åå¨ show(D obj)ï¼ä½æ¯åå¨ä» A ç»§æ¿æ¥ç show(C obj)ï¼å° D 转åæå
¶ç¶ç±» C
b.show(d); // A.show(C)
// å¼ç¨çè¿æ¯ B å¯¹è±¡ï¼æä»¥ ba å b çè°ç¨ç»æä¸æ ·
A ba = new B();
ba.show(c); // A.show(C)
ba.show(d); // A.show(C)
}
```
**2. éè½½ï¼Overloadï¼**
åå½ä¸åå - åå¨äºåä¸ä¸ªç±»ä¸ï¼æä¸ä¸ªæ¹æ³ä¸å·²ç»åå¨çæ¹æ³åç§°ä¸ç¸åï¼ä½æ¯åæ°ç±»åã个æ°ã顺åºè³å°æä¸ä¸ªä¸åã
åºè¯¥æ³¨æçæ¯ï¼è¿åå¼ä¸åï¼å
¶å®é½ç¸åä¸ç®æ¯éè½½ã
# äºãObject éç¨æ¹æ³
## æ¦è§
```java
public native int hashCode()
public boolean equals(Object obj)
protected native Object clone() throws CloneNotSupportedException
public String toString()
public final native Class> getClass()
protected void finalize() throws Throwable {}
public final native void notify()
public final native void notifyAll()
public final native void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
public final void wait() throws InterruptedException
```
## equals()
**1. çä»·å
³ç³»**
â
èªåæ§
```java
x.equals(x); // true
```
â
¡ 对称æ§
```java
x.equals(y) == y.equals(x); // true
```
â
¢ ä¼ éæ§
```java
if (x.equals(y) && y.equals(z))
x.equals(z); // true;
```
â
£ ä¸è´æ§
夿¬¡è°ç¨ equals() æ¹æ³ç»æä¸å
```java
x.equals(y) == x.equals(y); // true
```
â
¤ ä¸ null çæ¯è¾
对任ä½ä¸æ¯ null ç对象 x è°ç¨ x.equals(null) ç»æé½ä¸º false
```java
x.equals(null); // false;
```
**2. çä»·ä¸ç¸ç**
1. åºç¡æ°æ®ç±»å没æequalsæ¹æ³ï¼åªè½ä½¿ç¨==æ¥å¤æï¼å¤æçæ¶åæ¯å¤æå¼æ¯å¦ç¸ç
2. å¼ç¨ç±»åå¯ä»¥ä½¿ç¨==åequallsãå¦æå¯¹è±¡ä¸éåObjectä¸çequalsæ¹æ³ï¼é£ä¹==åequals没æåºå«ï¼å 为Objectä¸çequals乿¯ä½¿ç¨==æ¥å¤æï¼å¦æéåäºequalsæ¹æ³ï¼é£å°±ä½¿ç¨å¯¹è±¡éåçequalsæ¹æ³æ¥å¤æã==æ¯è¾çæ¯ä¸¤ä¸ªå¯¹è±¡å¨å ä¸åæ¾æ°æ®çå
åå°åæ¯å¦ç¸çã
3. Stringéè¦æ¿æ¥ç¹æ®è¯´æï¼Stringæ¯Javaä¸ä¸éè¦newå°±å¯ä»¥äº§ç对象çç¹ä¾ã使ç¨Stringæ¥ç³æä¸ä¸ªåéçæ¶åï¼JVMä¼å¨å¸¸éæ± ä¸æ¥æ¾æ¯å¦å·²ç»åå¨è¿ä¸ªå¼ï¼å¦æåå¨å°±æå
åå°åè¿åç»åéï¼å¦æä¸åå¨ï¼ä¼æ°å¼è¾ä¸ä¸ªç©ºé´æ¥åå¨è¿ä¸ªå¼ï¼ç¶åæå
åå°åè¿åãé£ä¹æä»¬åæ¥çStringä¸==åequalsçåºå«ï¼Stringä¸ä½¿ç¨==æ¯è¾çæ¯å
åå°åæ¯å¦ç¸çï¼StringéåäºObjectä¸çequalsæ¹æ³ï¼ä½¿ç¨equalsæ¶å
æ¯è¾å¯¹è±¡æ¯å¦ç¸çï¼å¦æç¸çå°±è¿åtrueï¼å¦åæ¯è¾å¼æ¯å¦ç¸çã
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;
}
```java
Integer x = new Integer(1);
Integer y = new Integer(1);
System.out.println(x.equals(y)); // true
System.out.println(x == y); // false
```
**3. å®ç°**
- æ£æ¥æ¯å¦ä¸ºåä¸ä¸ªå¯¹è±¡çå¼ç¨ï¼å¦ææ¯ç´æ¥è¿å trueï¼
- æ£æ¥æ¯å¦æ¯åä¸ä¸ªç±»åï¼å¦æä¸æ¯ï¼ç´æ¥è¿å falseï¼
- å° Object 对象è¿è¡è½¬åï¼
- 夿æ¯ä¸ªå
³é®åæ¯å¦ç¸çã
```java
public class EqualExample {
private int x;
private int y;
private int z;
public EqualExample(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
EqualExample that = (EqualExample) o;
if (x != that.x) return false;
if (y != that.y) return false;
return z == that.z;
}
}
```
## hashCode()
hashCode() è¿åæ£åå¼ï¼è equals() æ¯ç¨æ¥å¤æä¸¤ä¸ªå¯¹è±¡æ¯å¦çä»·ãçä»·ç两个对象æ£åå¼ä¸å®ç¸åï¼ä½æ¯æ£åå¼ç¸åç两个对象ä¸ä¸å®çä»·ã
[
1. å 为hashCode()并䏿¯å®å
¨å¯é ï¼ææ¶åä¸åç对象ä»ä»¬çæçhashcodeä¹ä¼ä¸æ ·ï¼çæhashå¼å¾å
¬å¼å¯è½åå¨çé®é¢ï¼ï¼æä»¥hashCode()åªè½è¯´æ¯å¤§é¨åæ¶åå¯é ï¼å¹¶ä¸æ¯ç»å¯¹å¯é ã
2. ä½ å¯ä»¥éåhashCode()
]
å¨è¦ç equals() æ¹æ³æ¶åºå½æ»æ¯è¦ç hashCode() æ¹æ³ï¼ä¿è¯çä»·ç两个对象æ£åå¼ä¹ç¸çã
ä¸é¢ç代ç ä¸ï¼æ°å»ºäºä¸¤ä¸ªçä»·ç对象ï¼å¹¶å°å®ä»¬æ·»å å° HashSet ä¸ãæä»¬å¸æå°è¿ä¸¤ä¸ªå¯¹è±¡å½æä¸æ ·çï¼åªå¨éå䏿·»å ä¸ä¸ªå¯¹è±¡ï¼ä½æ¯å 为 EqualExample 没æå®ç° hasCode() æ¹æ³ï¼å æ¤è¿ä¸¤ä¸ªå¯¹è±¡çæ£å弿¯ä¸åçï¼æç»å¯¼è´éåæ·»å äºä¸¤ä¸ªçä»·ç对象ã
```java
EqualExample e1 = new EqualExample(1, 1, 1);
EqualExample e2 = new EqualExample(1, 1, 1);
System.out.println(e1.equals(e2)); // true
HashSet set = new HashSet<>();
set.add(e1);
set.add(e2);
System.out.println(set.size()); // 2
```
çæ³çæ£å彿°åºå½å
·æååæ§ï¼å³ä¸ç¸çç对象åºå½åååå¸å°ææå¯è½çæ£åå¼ä¸ãè¿å°±è¦æ±äºæ£å彿°è¦æææåçå¼é½èèè¿æ¥ãå¯ä»¥å°æ¯ä¸ªåé½å½æ R è¿å¶çæä¸ä½ï¼ç¶åç»æä¸ä¸ª R è¿å¶çæ´æ°ãR ä¸è¬å 31ï¼å ä¸ºå®æ¯ä¸ä¸ªå¥ç´ æ°ï¼å¦ææ¯å¶æ°çè¯ï¼å½åºç°ä¹æ³æº¢åºï¼ä¿¡æ¯å°±ä¼ä¸¢å¤±ï¼å ä¸ºä¸ 2 ç¸ä¹ç¸å½äºå左移ä¸ä½ã
ä¸ä¸ªæ°ä¸ 31 ç¸ä¹å¯ä»¥è½¬æ¢æç§»ä½ååæ³ï¼`31*x == (x<<5)-x`ï¼ç¼è¯å¨ä¼èªå¨è¿è¡è¿ä¸ªä¼åã
```java
@Override
public int hashCode() {
int result = 17;
result = 31 * result + x;
result = 31 * result + y;
result = 31 * result + z;
return result;
}
```
## toString()
é»è®¤è¿å ToStringExample@4554617c è¿ç§å½¢å¼ï¼å
¶ä¸ @ åé¢çæ°å¼ä¸ºæ£åç çæ ç¬¦å·åå
è¿å¶è¡¨ç¤ºã
```java
public class ToStringExample {
private int number;
public ToStringExample(int number) {
this.number = number;
}
}
```
```java
ToStringExample example = new ToStringExample(123);
System.out.println(example.toString());
```
```html
ToStringExample@4554617c
```
## clone()
**1. cloneable**
clone() æ¯ Object ç protected æ¹æ³ï¼å®ä¸æ¯ publicï¼ä¸ä¸ªç±»ä¸æ¾å¼å»éå clone()ï¼å
¶å®ç±»å°±ä¸è½ç´æ¥å»è°ç¨è¯¥ç±»å®ä¾ç clone() æ¹æ³ã
```java
public class CloneExample {
private int a;
private int b;
}
```
```java
CloneExample e1 = new CloneExample();
// CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object'
```
éå clone() å¾å°ä»¥ä¸å®ç°ï¼
```java
public class CloneExample {
private int a;
private int b;
@Override
public CloneExample clone() throws CloneNotSupportedException {
return (CloneExample)super.clone();
}
}
```
```java
CloneExample e1 = new CloneExample();
try {
CloneExample e2 = e1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
```
```html
java.lang.CloneNotSupportedException: CloneExample
```
以䏿åºäº CloneNotSupportedExceptionï¼è¿æ¯å 为 CloneExample 没æå®ç° Cloneable æ¥å£ã
åºè¯¥æ³¨æçæ¯ï¼clone() æ¹æ³å¹¶ä¸æ¯ Cloneable æ¥å£çæ¹æ³ï¼èæ¯ Object çä¸ä¸ª protected æ¹æ³ãCloneable æ¥å£åªæ¯è§å®ï¼å¦æä¸ä¸ªç±»æ²¡æå®ç° Cloneable æ¥å£åè°ç¨äº clone() æ¹æ³ï¼å°±ä¼æåº CloneNotSupportedExceptionã
```java
public class CloneExample implements Cloneable {
private int a;
private int b;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
```
**2. æµ
æ·è´**
æ·è´å¯¹è±¡ååå§å¯¹è±¡çå¼ç¨ç±»åå¼ç¨åä¸ä¸ªå¯¹è±¡ã
```java
public class ShallowCloneExample implements Cloneable {
private int[] arr;
public ShallowCloneExample() {
arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
}
public void set(int index, int value) {
arr[index] = value;
}
public int get(int index) {
return arr[index];
}
@Override
protected ShallowCloneExample clone() throws CloneNotSupportedException {
return (ShallowCloneExample) super.clone();
}
}
```
```java
ShallowCloneExample e1 = new ShallowCloneExample();
ShallowCloneExample e2 = null;
try {
e2 = e1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
e1.set(2, 222);
System.out.println(e2.get(2)); // 222
```
**3. æ·±æ·è´**
æ·è´å¯¹è±¡ååå§å¯¹è±¡çå¼ç¨ç±»åå¼ç¨ä¸å对象ã
```java
public class DeepCloneExample implements Cloneable {
private int[] arr;
public DeepCloneExample() {
arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
}
public void set(int index, int value) {
arr[index] = value;
}
public int get(int index) {
return arr[index];
}
@Override
protected DeepCloneExample clone() throws CloneNotSupportedException {
DeepCloneExample result = (DeepCloneExample) super.clone();
result.arr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
result.arr[i] = arr[i];
}
return result;
}
}
```
```java
DeepCloneExample e1 = new DeepCloneExample();
DeepCloneExample e2 = null;
try {
e2 = e1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
e1.set(2, 222);
System.out.println(e2.get(2)); // 2
```
**4. clone() çæ¿ä»£æ¹æ¡**
ä½¿ç¨ clone() æ¹æ³æ¥æ·è´ä¸ä¸ªå¯¹è±¡å³å¤æåæé£é©ï¼å®ä¼æåºå¼å¸¸ï¼å¹¶ä¸è¿éè¦ç±»å转æ¢ãEffective Java 书ä¸è®²å°ï¼æå¥½ä¸è¦å»ä½¿ç¨ clone()ï¼å¯ä»¥ä½¿ç¨æ·è´æé 彿°æè
æ·è´å·¥åæ¥æ·è´ä¸ä¸ªå¯¹è±¡ã
```java
public class CloneConstructorExample {
private int[] arr;
public CloneConstructorExample() {
arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
}
public CloneConstructorExample(CloneConstructorExample original) {
arr = new int[original.arr.length];
for (int i = 0; i < original.arr.length; i++) {
arr[i] = original.arr[i];
}
}
public void set(int index, int value) {
arr[index] = value;
}
public int get(int index) {
return arr[index];
}
}
```
```java
CloneConstructorExample e1 = new CloneConstructorExample();
CloneConstructorExample e2 = new CloneConstructorExample(e1);
e1.set(2, 222);
System.out.println(e2.get(2)); // 2
```
# å
ãå
³é®å
## è®¿é®æ§å¶
`private`
`protected`
`public`
## ç±»ãæ¹æ³ååé修饰符
`abstract`
`class`
`extends`
`final`
`implements`
`interface`
`native`
`new`
`static`
`strictfp`
`synchronized`
`transient`
å°ä¸éè¦åºååç屿§åæ·»å å
³é®åtransientï¼åºååå¯¹è±¡çæ¶åï¼è¿ä¸ªå±æ§å°±ä¸ä¼è¢«åºååãã对象åºå忝ä¸ä¸ªç¨äºå°å¯¹è±¡ç¶æè½¬æ¢ä¸ºåèæµçè¿ç¨ï¼å¯ä»¥å°å
¶ä¿åå°ç£çæä»¶ä¸æéè¿ç½ç»åéå°ä»»ä½å
¶ä»ç¨åºï¼ä»åèæµå建对象çç¸åçè¿ç¨ç§°ä¸ºååºååã
为ä»ä¹è¦ä¸åºååï¼
ä¸äºææä¿¡æ¯ï¼æ¯å¦å¯ç åé¶è¡å¡å·çå¨java对象åºååæ¶ä¸å¸æè¢«åºååï¼ä¸è¢«åºååç屿§å°±ä¸ä¼è¢«åå¨å°ç£çä¸ï¼æéè¿ç½ç»ä¼ è¾ã为äºå®ç°å±æ§ä¸è¢«åºååï¼åªéè¦å¨å±æ§åå ä¸transientå
³é®åå°±è½è¾¾å°ç®çã
`volatile`
volatileåªè½ä¿®é¥°åéï¼è¢«ä¿®é¥°çåé对å
¶ä»çº¿ç¨æ¯âå¯è§çâï¼åæ¶volatile修饰çåéç¦æ¢æä»¤éæï¼ä¿è¯äºæåºæ§ï¼
## ç¨åºæ§å¶
`break`
`continue`
`return`
`do`
`while`
`if`
`else`
`for`
`instanceof`
`switch`
`case`
`default`
## é误å¤ç
`try` `catch` `throw` `throws`
## å
ç¸å
³
`import` `package`
## åºç¡ç±»å
`boolean` `byte` `char` `double` `float` `int` `long` `short` `null` `true` `false`
## åéå¼ç¨
`super` `this` `void`
## ä¿çå
`goto` `const`
## final
**1. æ°æ®**
å£°ææ°æ®ä¸ºå¸¸éï¼å¯ä»¥æ¯ç¼è¯æ¶å¸¸éï¼ä¹å¯ä»¥æ¯å¨è¿è¡æ¶è¢«åå§ååä¸è½è¢«æ¹åç常éã
- 对äºåºæ¬ç±»åï¼final 使æ°å¼ä¸åï¼
- 对äºå¼ç¨ç±»åï¼final 使å¼ç¨ä¸åï¼ä¹å°±ä¸è½å¼ç¨å
¶å®å¯¹è±¡ï¼ä½æ¯è¢«å¼ç¨ç对象æ¬èº«æ¯å¯ä»¥ä¿®æ¹çã
```java
final int x = 1;
// x = 2; // cannot assign value to final variable 'x'
final A y = new A();
y.a = 1;
```
**2. æ¹æ³**
å£°ææ¹æ³ä¸è½è¢«åç±»éåã
private æ¹æ³éå¼å°è¢«æå®ä¸º finalï¼å¦æå¨åç±»ä¸å®ä¹çæ¹æ³ååºç±»ä¸çä¸ä¸ª private æ¹æ³ç¾åç¸åï¼æ¤æ¶åç±»çæ¹æ³ä¸æ¯éååºç±»æ¹æ³ï¼èæ¯å¨åç±»ä¸å®ä¹äºä¸ä¸ªæ°çæ¹æ³ã
**3. ç±»**
声æç±»ä¸å
许被继æ¿ã
## static
**1. éæåé**
- éæåéï¼å称为类åéï¼ä¹å°±æ¯è¯´è¿ä¸ªåéå±äºç±»çï¼ç±»ææçå®ä¾é½å
±äº«éæåéï¼å¯ä»¥ç´æ¥éè¿ç±»åæ¥è®¿é®å®ãéæåéå¨å
åä¸åªåå¨ä¸ä»½ã
- å®ä¾åéï¼æ¯å建ä¸ä¸ªå®ä¾å°±ä¼äº§çä¸ä¸ªå®ä¾åéï¼å®ä¸è¯¥å®ä¾åçå
±æ»ã
```java
public class A {
private int x; // å®ä¾åé
private static int y; // éæåé
public static void main(String[] args) {
// int x = A.x; // Non-static field 'x' cannot be referenced from a static context
A a = new A();
int x = a.x;
int y = A.y;
}
}
```
**2. éææ¹æ³**
éææ¹æ³å¨ç±»å è½½çæ¶åå°±åå¨äºï¼å®ä¸ä¾èµäºä»»ä½å®ä¾ãæä»¥éææ¹æ³å¿
é¡»æå®ç°ï¼ä¹å°±æ¯è¯´å®ä¸è½æ¯æ½è±¡æ¹æ³ã
```java
public abstract class A {
public static void func1(){
}
// public abstract static void func2(); // Illegal combination of modifiers: 'abstract' and 'static'
}
```
åªè½è®¿é®æå±ç±»çéæå段åéææ¹æ³ï¼æ¹æ³ä¸ä¸è½æ this å super å
³é®åã
```java
public class A {
private static int x;
private int y;
public static void func1(){
int a = x;
// int b = y; // Non-static field 'y' cannot be referenced from a static context
// int b = this.y; // 'A.this' cannot be referenced from a static context
}
}
```
**3. éæè¯å¥å**
éæè¯å¥åå¨ç±»åå§åæ¶è¿è¡ä¸æ¬¡ãè¿éæClassLoaderåClassForNameä¸¤ç§æ¹å¼æ¥å 载类ï¼ClassLoaderå è½½æ¶ä¸åå§åï¼ClassForNameå è½½æ¶åå§å
```java
public class A {
static {
System.out.println("123");
}
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
}
}
```
```html
123
```
**4. éæå
é¨ç±»**
ééæå
é¨ç±»ä¾èµäºå¤é¨ç±»çå®ä¾ï¼èéæå
é¨ç±»ä¸éè¦ã
```java
public class OuterClass {
class InnerClass {
}
static class StaticInnerClass {
}
public static void main(String[] args) {
// InnerClass innerClass = new InnerClass(); // 'OuterClass.this' cannot be referenced from a static context
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.new InnerClass();
StaticInnerClass staticInnerClass = new StaticInnerClass();
}
}
```
éæå
é¨ç±»ä¸è½è®¿é®å¤é¨ç±»çééæçåéåæ¹æ³ã
**5. éæå¯¼å
**
å¨ä½¿ç¨éæåéåæ¹æ³æ¶ä¸ç¨åææ ClassNameï¼ä»èç®å代ç ï¼ä½å¯è¯»æ§å¤§å¤§éä½ã
```java
import static com.xxx.ClassName.*
```
**6. åå§å顺åº**
éæåéåéæè¯å¥åä¼å
äºå®ä¾åéåæ®éè¯å¥åï¼éæåéåéæè¯å¥åçåå§å顺åºåå³äºå®ä»¬å¨ä»£ç ä¸ç顺åºã
```java
public static String staticField = "éæåé";
```
```java
static {
System.out.println("éæè¯å¥å");
}
```
```java
public String field = "å®ä¾åé";
```
```java
{
System.out.println("æ®éè¯å¥å");
}
```
æåææ¯æé 彿°çåå§åã
```java
public InitialOrderTest() {
System.out.println("æé 彿°");
}
```
åå¨ç»§æ¿çæ
åµä¸ï¼åå§å顺åºä¸ºï¼
- ç¶ç±»ï¼éæåéãéæè¯å¥åï¼
- åç±»ï¼éæåéãéæè¯å¥åï¼
- ç¶ç±»ï¼å®ä¾åéãæ®éè¯å¥åï¼
- ç¶ç±»ï¼æé 彿°ï¼
- åç±»ï¼å®ä¾åéãæ®éè¯å¥åï¼
- åç±»ï¼æé 彿°ï¼
## transient
被transientå
³é®å修饰çåéä¸åä¸åºååï¼å¦ArrayListä¸ç elementDataåé
```java
private transient Object[] elementData;
```
# ä¸ãåå°
æ¯ä¸ªç±»é½æä¸ä¸ª **Class** 对象ï¼å
å«äºä¸ç±»æå
³çä¿¡æ¯ãå½ç¼è¯ä¸ä¸ªæ°ç±»æ¶ï¼ä¼äº§çä¸ä¸ªååç .class æä»¶ï¼è¯¥æä»¶å
容ä¿åç Class 对象ã
ç±»å è½½ç¸å½äº Class 对象çå è½½ï¼ç±»å¨ç¬¬ä¸æ¬¡ä½¿ç¨æ¶æå¨æå è½½å° JVM ä¸ãä¹å¯ä»¥ä½¿ç¨ `Class.forName("com.mysql.jdbc.Driver")` è¿ç§æ¹å¼æ¥æ§å¶ç±»çå è½½ï¼è¯¥æ¹æ³ä¼è¿åä¸ä¸ª Class 对象ã
åå°å¯ä»¥æä¾è¿è¡æ¶ç类信æ¯ï¼å¹¶ä¸è¿ä¸ªç±»å¯ä»¥å¨è¿è¡æ¶æå è½½è¿æ¥ï¼çè³å¨ç¼è¯æ¶æè¯¥ç±»ç .class ä¸åå¨ä¹å¯ä»¥å è½½è¿æ¥ã
Class å java.lang.reflect ä¸èµ·å¯¹åå°æä¾äºæ¯æï¼java.lang.reflect ç±»åºä¸»è¦å
å«äºä»¥ä¸ä¸ä¸ªç±»ï¼
- **Field** ï¼å¯ä»¥ä½¿ç¨ get() å set() æ¹æ³è¯»ååä¿®æ¹ Field 对象å
³èçåæ®µï¼
- **Method** ï¼å¯ä»¥ä½¿ç¨ invoke() æ¹æ³è°ç¨ä¸ Method 对象å
³èçæ¹æ³ï¼
- **Constructor** ï¼å¯ä»¥ç¨ Constructor å建æ°ç对象ã
**åå°çä¼ç¹ï¼**
* **坿©å±æ§** ï¼åºç¨ç¨åºå¯ä»¥å©ç¨å
¨éå®ååå»ºå¯æ©å±å¯¹è±¡çå®ä¾ï¼æ¥ä½¿ç¨æ¥èªå¤é¨çç¨æ·èªå®ä¹ç±»ã
* **ç±»æµè§å¨åå¯è§åå¼åç¯å¢** ï¼ä¸ä¸ªç±»æµè§å¨éè¦å¯ä»¥æä¸¾ç±»çæåãå¯è§åå¼åç¯å¢ï¼å¦ IDEï¼å¯ä»¥ä»å©ç¨åå°ä¸å¯ç¨çç±»åä¿¡æ¯ä¸åçï¼ä»¥å¸®å©ç¨åºåç¼åæ£ç¡®ç代ç ã
* **è°è¯å¨åæµè¯å·¥å
·** ï¼ è°è¯å¨éè¦è½å¤æ£æ¥ä¸ä¸ªç±»éçç§ææåãæµè¯å·¥å
·å¯ä»¥å©ç¨åå°æ¥èªå¨å°è°ç¨ç±»éå®ä¹çå¯è¢«åç°ç API å®ä¹ï¼ä»¥ç¡®ä¿ä¸ç»æµè¯ä¸æè¾é«ç代ç è¦ççã
**åå°ç缺ç¹ï¼**
尽管åå°é常强大ï¼ä½ä¹ä¸è½æ»¥ç¨ã妿ä¸ä¸ªåè½å¯ä»¥ä¸ç¨åå°å®æï¼é£ä¹æå¥½å°±ä¸ç¨ãå¨æä»¬ä½¿ç¨åå°ææ¯æ¶ï¼ä¸é¢å æ¡å
容åºè¯¥ç¢è®°äºå¿ã
* **æ§è½å¼é** ï¼åå°æ¶åäºå¨æç±»åçè§£æï¼æä»¥ JVM æ æ³å¯¹è¿äºä»£ç è¿è¡ä¼åãå æ¤ï¼åå°æä½çæçè¦æ¯é£äºéåå°æä½ä½å¾å¤ãæä»¬åºè¯¥é¿å
å¨ç»å¸¸è¢«æ§è¡çä»£ç æå¯¹æ§è½è¦æ±å¾é«çç¨åºä¸ä½¿ç¨åå°ã
* **å®å
¨éå¶** ï¼ä½¿ç¨åå°ææ¯è¦æ±ç¨åºå¿
é¡»å¨ä¸ä¸ªæ²¡æå®å
¨éå¶çç¯å¢ä¸è¿è¡ã妿ä¸ä¸ªç¨åºå¿
须卿å®å
¨éå¶çç¯å¢ä¸è¿è¡ï¼å¦ Appletï¼é£ä¹è¿å°±æ¯ä¸ªé®é¢äºã
* **å
鍿´é²** ï¼ç±äºåå°å
è®¸ä»£ç æ§è¡ä¸äºå¨æ£å¸¸æ
åµä¸ä¸è¢«å
许çæä½ï¼æ¯å¦è®¿é®ç§æç屿§åæ¹æ³ï¼ï¼æä»¥ä½¿ç¨åå°å¯è½ä¼å¯¼è´ææä¹å¤çå¯ä½ç¨ï¼è¿å¯è½å¯¼è´ä»£ç åè½å¤±è°å¹¶ç ´åå¯ç§»æ¤æ§ãåå°ä»£ç ç ´åäºæ½è±¡æ§ï¼å æ¤å½å¹³å°åçæ¹åçæ¶åï¼ä»£ç çè¡ä¸ºå°±æå¯è½ä¹éçååã
- [Trail: The Reflection API](https://docs.oracle.com/javase/tutorial/reflect/index.html)
- [æ·±å
¥è§£æ Java åå°ï¼1ï¼- åºç¡](http://www.sczyh30.com/posts/Java/java-reflection-1/)
# å
«ãå¼å¸¸
Throwable å¯ä»¥ç¨æ¥è¡¨ç¤ºä»»ä½å¯ä»¥ä½ä¸ºå¼å¸¸æåºçç±»ï¼å为两ç§ï¼ **Error** å **Exception**ãå
¶ä¸ Error ç¨æ¥è¡¨ç¤º JVM æ æ³å¤ççé误ï¼Exception å为两ç§ï¼
- **忣å¼å¸¸** ï¼éè¦ç¨ try...catch... è¯å¥æè·å¹¶è¿è¡å¤çï¼å¹¶ä¸å¯ä»¥ä»å¼å¸¸ä¸æ¢å¤ï¼
- **é忣å¼å¸¸** ï¼æ¯ç¨åºè¿è¡æ¶é误ï¼ä¾å¦é¤ 0 ä¼å¼å Arithmetic Exceptionï¼æ¤æ¶ç¨åºå´©æºå¹¶ä¸æ æ³æ¢å¤ã
- [Java å
¥é¨ä¹å¼å¸¸å¤ç](https://www.tianmaying.com/tutorial/Java-Exception)
- [Java å¼å¸¸çé¢è¯é®é¢åçæ¡ -Part 1](http://www.importnew.com/7383.html)
* IllegalStateException
```
å¨ä¸åçæä¸æ£ç¡®æ¶é´å
å¤éä¸ä¸ªæ¹æ³æ¶åºç°çå¼å¸¸ä¿¡æ¯ï¼è±ææææ¯æ æç¶æå¼å¸¸ï¼æ¯å¦å¨æå¡å¨å·²ç»è¿åæ°æ®ç»å®¢æ·ç«¯äºï¼è¿æ¶åæ³ä¿®æ¹å符éåæ°ï¼å°±ä¼æ¥è¿æ ·çé误ã
```
# ä¹ãæ³å
ç±»åçåæ°åï¼å°±æ¯å¯ä»¥æç±»ååæ¹æ³ç忰飿 ·ä¼ éãæ³å使ç¼è¯å¨å¯ä»¥å¨ç¼è¯æé´å¯¹ç±»åè¿è¡æ£æ¥ä»¥æé«ç±»åå®å
¨ï¼åå°è¿è¡æ¶ç±äºå¯¹è±¡ç±»åä¸å¹é
å¼åçå¼å¸¸ã
## 为ä»ä¹è¦å¼å
¥æ³åï¼æ³åçå¼å
¥è§£å³äºä»ä¹é®é¢
* å¨è¿è¡æ¶åç±»åæ£æ¥ï¼ä¿è¯äºè¿è¡æ¶çç±»åå®å
¨ï¼é¿å
äºå¾å¤è¿è¡æ¶çClassCastExceptionå¼å¸¸ã
```java
public class Box {
// T stands for "Type"
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
```
- [Java æ³å详解](http://www.importnew.com/24029.html)
- [10 é Java æ³åé¢è¯é¢](https://cloud.tencent.com/developer/article/1033693)
## æçæ³å
* éå®Tæ¯AnimalæAnimalçåç±»
* éå®Tæ¯DogæDogçè¶
ç±»
## æ³åéé
符
* extends Animal> éå®Tæ¯AnimalæAnimalçåç±»
# åãæ³¨è§£
Java 注解æ¯éå å¨ä»£ç ä¸çä¸äºå
ä¿¡æ¯ï¼ç¨äºä¸äºå·¥å
·å¨ç¼è¯ãè¿è¡æ¶è¿è¡è§£æå使ç¨ï¼èµ·å°è¯´æãé
ç½®çåè½ã注解ä¸ä¼ä¹ä¸è½å½±å代ç çå®é
é»è¾ï¼ä»
ä»
èµ·å°è¾
婿§çä½ç¨ã
[注解 Annotation å®ç°åçä¸èªå®ä¹æ³¨è§£ä¾å](https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html)
# åä¸ãç¹æ§
## Java åçæ¬çæ°ç¹æ§
**New highlights in Java SE 8**
1. Lambda Expressions
2. Pipelines and Streams
3. Date and Time API
4. Default Methods
5. Type Annotations
6. Nashhorn JavaScript Engine
7. Concurrent Accumulators
8. Parallel operations
9. PermGen Error Removed
**New highlights in Java SE 7**
1. Strings in Switch Statement
2. Type Inference for Generic Instance Creation
3. Multiple Exception Handling
4. Support for Dynamic Languages
5. Try with Resources
6. Java nio Package
7. Binary Literals, Underscore in literals
8. Diamond Syntax
- [Difference between Java 1.8 and Java 1.7?](http://www.selfgrowth.com/articles/difference-between-java-18-and-java-17)
- [Java 8 ç¹æ§](http://www.importnew.com/19345.html)
# åäºãJDBCæä½æ°æ®åº
# å
¶ä»
## Java ä¸ C++ çåºå«
- Java æ¯çº¯ç²¹çé¢å对象è¯è¨ï¼ææç对象é½ç»§æ¿èª java.lang.Objectï¼C++ 为äºå
¼å®¹ C 峿¯æé¢åå¯¹è±¡ä¹æ¯æé¢åè¿ç¨ã
- Java éè¿èææºä»èå®ç°è·¨å¹³å°ç¹æ§ï¼ä½æ¯ C++ ä¾èµäºç¹å®çå¹³å°ã
- Java 没ææéï¼å®çå¼ç¨å¯ä»¥ç解为å®å
¨æéï¼è C++ å
·æå C 䏿 ·çæéã
- Java æ¯æèªå¨åå¾åæ¶ï¼è C++ éè¦æå¨åæ¶ã
- Java 䏿¯æå¤éç»§æ¿ï¼åªè½éè¿å®ç°å¤ä¸ªæ¥å£æ¥è¾¾å°ç¸åç®çï¼è C++ æ¯æå¤éç»§æ¿ã
- Java 䏿¯ææä½ç¬¦éè½½ï¼è½ç¶å¯ä»¥å¯¹ä¸¤ä¸ª String 对象æ§è¡å æ³è¿ç®ï¼ä½æ¯è¿æ¯è¯è¨å
ç½®æ¯æçæä½ï¼ä¸å±äºæä½ç¬¦éè½½ï¼è C++ å¯ä»¥ã
- Java ç goto æ¯ä¿çåï¼ä½æ¯ä¸å¯ç¨ï¼C++ å¯ä»¥ä½¿ç¨ gotoã
- Java 䏿¯ææ¡ä»¶ç¼è¯ï¼C++ éè¿ #ifdef #ifndef çé¢å¤çå½ä»¤ä»èå®ç°æ¡ä»¶ç¼è¯ã
[What are the main differences between Java and C++?](http://cs-fundamentals.com/tech-interview/java/differences-between-java-and-cpp.php)
## JRE or JDK
- JRE is the JVM program, Java application need to run on JRE.
- JDK is a superset of JRE, JRE + tools for developing java programs. e.g, it provides the compiler "javac"
## Lambda表达å¼
Lambda è¡¨è¾¾å¼æ¯ä¸ç§å¿å彿°(对 Java èè¨è¿å¹¶ä¸å®å
¨æ£ç¡®ï¼ä½ç°å¨å§ä¸è¿ä¹è®¤ä¸º)ï¼ç®åå°è¯´ï¼å®æ¯æ²¡æå£°æçæ¹æ³ï¼ä¹å³æ²¡æè®¿é®ä¿®é¥°ç¬¦ãè¿åå¼å£°æåååã
Java ä¸ç Lambda 表达å¼éå¸¸ä½¿ç¨ `(argument) -> (body)` è¯æ³ä¹¦åï¼ä¾å¦ï¼
```java
(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }
(int a, int b) -> { return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> 42
() -> { return 3.1415 };
```
# åèèµæ
- Eckel B. Java ç¼ç¨ææ³[M]. æºæ¢°å·¥ä¸åºç社, 2002.
- Bloch J. Effective java[M]. Addison-Wesley Professional, 2017.
- åè https://github.com/CyC2018/CS-Notes å¹¶å 以æ©å±
# *JavaEE*
## `åºç¡è¯æ³`
### ç±»
### æ¥å£
### æ°ç»
### æ¹æ³éè½½
### æ¹æ³éå
### é¢å对象
### 常ç¨å
### IO
https://juejin.im/post/5af79bcc51882542ad771546
https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html
### å¤çº¿ç¨
### åå°æºå¶
### æ³å
### éåæ¡æ¶
### å¼å¸¸å¤ç
### JAVA8æ°ç¹æ§
### JAVA8æ°ç¹æ§
## é¢è¯é¢
* Integeråintçåºå«
* String a = new String("abc");å
±å建äºå 个对象
## 注æç¹
1. BigDecimalæ¯è¾å¼ï¼ä¸è¦ä½¿ç¨equalsï¼å 为0å0.00æ¯è¾equalsä¼å¤æfalseï¼è¦ä½¿ç¨compareTo()ãCompares this BigDecimal with the specified BigDecimal. Two BigDecimal objects that are equal in value but have a different scale (like 2.0 and 2.00) are considered equal by this method.
2. String.split()å¨åå². |çæ¶éè¦æ³¨æï¼å 为splitåå²çæ¶å使ç¨äºæ£å, ç¹éè¦ä½¿ç¨\\.ç±»å¤çï¼å
·ä½ä½¿ç¨æ¶ç¾åº¦ä¸
3. é®ç®±æ ¡éª 建议使ç¨å¾®è½¯çæ ¼å¼è§è https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format
```
^[^@\s]+@[^@\s]+\.[^@\s]+$
^ ä»å符串çå¼å¤´é¨åå¼å§å¹é
ã
[^@\s]+ å¹é
䏿¬¡æå¤æ¬¡åºç°çä»»ä½å符ï¼@ å符æç©ºæ ¼é¤å¤ã
@ å¹é
@ å符ã
[^@\s]+ å¹é
䏿¬¡æå¤æ¬¡åºç°çä»»ä½å符ï¼@ å符æç©ºæ ¼é¤å¤ã
\. å¹é
ä¸ä¸ªå¥ç¹å符ã
[^@\s]+ å¹é
䏿¬¡æå¤æ¬¡åºç°çä»»ä½å符ï¼@ å符æç©ºæ ¼é¤å¤ã
$ å¨å符串çç»å°¾ç»æå¹é
ã
```
4. è·åç³»ç»ä¸´æ¶ç®å½ File tmpdir = new File(AccessController.doPrivileged(new GetPropertyAction("java.io.tmpdir"))); AccessController.doPrivilegedä¸æäºæ æ£æ¥è¿ç¨ï¼ä½¿å¾åç»åæ¬æ²¡ææéç代ç ä¹å¯ä»¥æ£å¸¸æ§è¡ https://blog.csdn.net/jiangtianjiao/article/details/87909065
5. ParserConfig.getGlobalInstance().setAutoTypeSupport(true); ç¨äºè§£å³fastjsonæ¼æ´ï¼é²æ¢è¢«è¿ç¨æ§è¡
6. å¨æçæ§JVMå
åï¼å¹¶è§¦ågcï¼å¯å¼ä¸ªå®æ¶ä»»å¡
```java
long totalMemory = Runtime.getRunTime().totalMemory() / 1024 /1024;
long freeMemory = Runtime.getRunTime().freeMemory() / 1024 /1024;
System.gc(); // å¯è§¦ågc
```