Java SE 筆記
數(shù)據(jù)類型
基本數(shù)據(jù)類型
- boolean
- byte
- short
- char
- int
- long
- float
- double
數(shù)據(jù)類型轉(zhuǎn)換
-
boolean byte->short,char->int->long->float->double
-
強(qiáng)制類型轉(zhuǎn)換 (類型)變量名 高轉(zhuǎn)低
-
自動(dòng)類型轉(zhuǎn)換 低轉(zhuǎn)高
-
int year = 888888;
int sum = 888888;
long total = year * sum; //error:仍溢出
long total = year * (long)sum //right
流程控制
Scanner
Scanner s = new Scanner(System.in);
s.next(); //空白作為終止
s.nextLine(); //回車作為終止
面向?qū)ο?/h2>
本質(zhì):以類的方式組織代碼脂信,以對(duì)象組織(封裝)數(shù)據(jù)
-
構(gòu)造器
- 一旦有有參構(gòu)造器匹层,無參構(gòu)造器 必須顯示定義
- IDEA->"Alt+Insert" 快捷鍵
-
修飾符
- public -> protected -> default -> private
-
三大特性
-
封裝
-
高內(nèi)聚理盆,低耦合 屬性私有:get/set
- 提高程序的安全性
- 隱藏代碼的實(shí)現(xiàn)細(xì)節(jié)
- 統(tǒng)一接口
- 提高系統(tǒng)的可維護(hù)性
-
繼承
IDEA 快捷鍵 “Crtl+H" 繼承樹
Object類
-
super()
- super調(diào)用父類的構(gòu)造方法,必須是子類構(gòu)造方法的第一行
- super 和 this 不能在同一個(gè)構(gòu)造方法
私有(private)的無法被繼承
-
方法重寫
- 方法修飾符:范圍可以擴(kuò)大但不能縮小
- 拋出異常:范圍可以縮小不能擴(kuò)大
class A{
public void test1(){};
public static void test2(){};
}
class B extends A{
public void test1(){};
public static void test2(){};
}
A a = new B(); //父類的引用指向子類的對(duì)象
a.test1(); //調(diào)用B類的test1方法
a.test2(); //調(diào)用A類的test2方法
-
多態(tài)
- 有繼承關(guān)系|子類重寫父類方法|父類引用指向子類對(duì)象
- 方法的多態(tài)
- static final private 無法被重寫
- instanceof
抽象類
-
接口
- 約束和實(shí)現(xiàn)分離 interface
- 默認(rèn) public abstract 方法|默認(rèn)public static final 字段
-
內(nèi)部類
-
成員內(nèi)部類
public class Outer{
private int id;
public void out(){
System.out.println("這是外部類的方法");
}
public class Inner(){
public void in(){
System.out.println("這是內(nèi)部類的方法");
}
public void getId(){
//內(nèi)部類可獲得外部類的私有字段
System.out.println(id);
}
}
}
Outer out = new Outer();
//通過外部類構(gòu)造內(nèi)部類的對(duì)象
Outer.inner in = out.new Inner();
in.getId();
-
-
靜態(tài)內(nèi)部類
public class Outer{
private int id;
public void out(){
System.out.println("這是外部類的方法");
}
public static class Inner(){
public void in(){
System.out.println("這是內(nèi)部類的方法");
}
}
}
Outer out = new Outer();
//通過外部類構(gòu)造內(nèi)部類的對(duì)象
Outer.inner in = out.new Inner();
-
局部內(nèi)部類
public class Outer{
private int id;
public void method(){
class Inner{
public void in(){
}
}
}
}
-
匿名內(nèi)部類
- 不把實(shí)列保存到對(duì)象中
異常
- Throwable
- Error
- Exception
- IOException
- RuntimeException
- "Ctrl+Alt+T"
網(wǎng)絡(luò)編程
-
IP
-
公網(wǎng)(互聯(lián)網(wǎng))-私網(wǎng)(局域網(wǎng))
- 192.168.xx.xx
InetAddress
-
端口
公有端口:0~1023
程序注冊(cè)端口:1024~49151
動(dòng)態(tài)碍粥、私有端口:49152~65535
netstat -ano //查看所有端口
netstat -ano|findstr "端口號(hào)"
tasklist|findstr "端口號(hào)"
InetSocketAddress
-
TCP
客戶端-Socket
服務(wù)端-ServerSocket
package com.csf.net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClientDemo1 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
try {
InetAddress ip = InetAddress.getByName("127.0.0.1");
int port = 9999;
socket = new Socket(ip, port);
os = socket.getOutputStream();
os.write("Hello, World".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
----------------------------------------------------------------------------------
package com.csf.net;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo1 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
System.out.println("server is running");
serverSocket = new ServerSocket(9999);
socket = serverSocket.accept();
is = socket.getInputStream();
// byte[] buffer = new byte[1024];
// int len;
// while ((len=is.read(buffer)) != -1){
// String msg = new String(buffer,0,len);
// System.out.println(msg);
// }
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
-
TCP 文件上傳
- FileInputStream FileOutpuStream
-
UDP
- DatagramPacket
- DatagramSocket
URL
注解
-
元注解
@Target : 注解可以用在的地方
-
@Retention : SOURCE < CLASS < RUNTIME
默認(rèn)RUNTIME
@Document
@Inherit
注解中的方法實(shí)際上是申明了一個(gè)配置參數(shù)
方法名稱即為參數(shù)的名稱
方法返回值類型即為參數(shù)的類型(java 基本類型, Class, String, Enum)
采用default申明參數(shù)默認(rèn)值
若只有一個(gè)參數(shù)瓢棒,一般參數(shù)名為value
注解元素必須要有值再悼,一般采用0,""作為默認(rèn)值
反射
-
獲得class對(duì)象的方式
- Class.forName() 會(huì)被初始化
- getClass()
- 類名.class 不會(huì)被初始化
- 基本類型包裝類的Type屬性馅袁,如:Integer.Type
package com.csf.reflect;
import java.lang.annotation.ElementType;
public class Demo2 {
public static void main(String[] args) {
Class c1 = Object.class;
Class c2 = Comparable.class;
Class c3 = String[].class;
Class c4 = int[][].class;
Class c5 = void.class;
Class c6 = ElementType.class;
Class c7 = Override.class;
Class c8 = Integer.class;
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
//class java.lang.Object
//interface java.lang.Comparable
//class [Ljava.lang.String;
//class [[I
//void
//class java.lang.annotation.ElementType
//interface java.lang.Override
//class java.lang.Integer
}
}
-
類初始化
-
類的主動(dòng)引用:
- new
- main()方法所在的類
- 反射 Class.forName()
-
被動(dòng)引用不會(huì)初始化
- 常量
- 數(shù)組
- 通過子類獲得父類的靜態(tài)字段,子類不初始化
-
類加載器
-
分類
- 引導(dǎo)類加載器 BootStap Classload
- 擴(kuò)展類加載器 Extension Classload
- 系統(tǒng)類加載器 System Classload
- 自定義加載器
-
可以加載的路徑
System.out.println(System.getProperty("java.class.path"));
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\charsets.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\deploy.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-32.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;
// C:\Program Files(x86)\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\javaws.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jce.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jfr.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jsse.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\management-agent.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\plugin.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\resources.jar;
// C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\rt.jar;
// C:\Users\CSF\IdeaProjects\javaSE\out\production\javaSE;
// D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar
setAccessible 私有屬性严就,構(gòu)造器总寻,方法
獲取泛型
-
獲取注解
package com.csf.reflect;
import java.lang.annotation.*;
public class Demo5 {
public static void main(String[] args) throws NoSuchFieldException {
Class<Student> studentClass = Student.class;
Annotation[] annotations = studentClass.getAnnotations();
for (Annotation annotation: annotations){
System.out.println(annotation);
}
Table table = studentClass.getAnnotation(Table.class);
System.out.println(table.value());
java.lang.reflect.Field id = studentClass.getDeclaredField("id");
Field annotation = id.getAnnotation(Field.class);
System.out.println(annotation.column());
System.out.println(annotation.length());
System.out.println(annotation.type());
}
}
@Table("db_student")
class Student{
@Field(column = "db_id", type = "int", length = 10)
private int id;
@Field(column = "db_age", type = "int", length = 10)
private int age;
@Field(column = "db_name", type = "varchar", length = 3)
private String name;
public Student(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public Student() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Table{
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Field{
String column();
String type();
int length();
}
多線程
main —主線程
-
線程創(chuàng)建
繼承——Thread
實(shí)現(xiàn)——Runnable
-
實(shí)現(xiàn)——Callable
package com.csf.thread;
import java.util.concurrent.*;
public class Demo5 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//創(chuàng)建執(zhí)行服務(wù)
ExecutorService service = Executors.newFixedThreadPool(1);
//提交執(zhí)行
Future<Boolean> future = service.submit(new ThreadTest3());
//獲取結(jié)果
Boolean result = future.get();
System.out.println(result);
//關(guān)閉服務(wù)
service.shutdownNow();
}
}
class ThreadTest3 implements Callable<Boolean>{
@Override
public Boolean call() throws Exception {
for(int i=0; i<100000;i++){
}
return true;
}
}
-
線程同步問題
package com.csf.thread;
public class Demo4 implements Runnable {
private int ticket = 10;
public static void main(String[] args) {
Demo4 ticket = new Demo4();
new Thread(ticket, "小明").start();
new Thread(ticket, "小紅").start();
new Thread(ticket, "小光").start();
}
@Override
public void run() {
while (true){
if (ticket <= 0)
break;
System.out.println(Thread.currentThread().getName() + "==>拿到了第"+ (ticket--) + "張票");
}
}
}
//小紅==>拿到了第10張票
//小光==>拿到了第9張票
//小明==>拿到了第10張票
//小光==>拿到了第7張票
//小紅==>拿到了第8張票
//小光==>拿到了第5張票
//小明==>拿到了第6張票
//小紅==>拿到了第4張票
//小光==>拿到了第3張票
//小明==>拿到了第2張票
//小紅==>拿到了第1張票
-
靜態(tài)代理模式
package com.csf.thread;
public class StaticProxy {
public static void main(String[] args) {
// Marry you = new You();
// WeddingCompany weddingCompany = new WeddingCompany(you);
// weddingCompany.happyMarry();
new WeddingCompany(new You()).happyMarry();
new Thread(()->{ System.out.println("love"); }).start();
}
}
interface Marry{
void happyMarry();
}
class You implements Marry{
@Override
public void happyMarry() {
System.out.println("要結(jié)婚了了");
}
}
class WeddingCompany implements Marry{
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void happyMarry() {
before();
target.happyMarry();
after();
}
private void after() {
System.out.println("收錢");
}
private void before() {
System.out.println("布置現(xiàn)場(chǎng)");
}
}
-
lambda表達(dá)式
函數(shù)式接口:只包含唯一一個(gè)抽象方法 如Runnable接口
package com.csf.lambda;
public class Demo1 {
static class Like2 implements ILike{
@Override
public void func() {
System.out.println("love2");
}
}
public static void main(String[] args) {
// 方式一:最原始的方法
ILike way1 = new Like();
way1.func();
// 方式二:靜態(tài)內(nèi)部類
new Like2().func();
// 方式三:局部內(nèi)部類
class Like3 implements ILike{
@Override
public void func() {
System.out.println("love3");
}
}
new Like3().func();
// 方式四:匿名內(nèi)部類
ILike way4 = new ILike() {
@Override
public void func() {
System.out.println("love4");
}
};
way4.func();
// 方式五:lambda表達(dá)式
ILike way5 = () -> {
System.out.println("love lambda");
};
way5.func();
}
}
interface ILike{
void func();
}
class Like implements ILike{
@Override
public void func() {
System.out.println("love");
}
}
-
帶參數(shù)的lambda
package com.csf.lambda;
public class Dmo2 {
public static void main(String[] args) {
ILove love = (a -> {
System.out.println("I love " + a + " 元");
});
love.love(100);
}
}
interface ILove{
void love(int a);
}
-
線程狀態(tài)
- new
- 就緒
- 運(yùn)行
- 阻塞
- 死亡
yield
-
join
package com.csf.thread;
public class TestJoin {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Join(), "Vip");
t1.start();
for (int i=0; i<1000; i++){
if (i==300){
t1.join();
}
System.out.println("main"+ i);
}
}
}
class Join implements Runnable{
@Override
public void run() {
for (int i=0; i<1000; i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
}
IDEA 快捷鍵:100.for ——for(int i=0; i<100; i++)
synchronized
CopyOnWriteArrayList
死鎖
-
Lock
- ReentrantLock
生產(chǎn)者消費(fèi)者
-
線程池
- ExecutorService
- execute(Runnable)
- submit(Callable)
- Executors--線程池的工具類,創(chuàng)建不同類型的線程池
本質(zhì):以類的方式組織代碼脂信,以對(duì)象組織(封裝)數(shù)據(jù)
構(gòu)造器
- 一旦有有參構(gòu)造器匹层,無參構(gòu)造器 必須顯示定義
- IDEA->"Alt+Insert" 快捷鍵
修飾符
- public -> protected -> default -> private
三大特性
-
封裝
- 高內(nèi)聚理盆,低耦合 屬性私有:get/set
- 提高程序的安全性
- 隱藏代碼的實(shí)現(xiàn)細(xì)節(jié)
- 統(tǒng)一接口
- 提高系統(tǒng)的可維護(hù)性
-
繼承
IDEA 快捷鍵 “Crtl+H" 繼承樹
Object類
-
super()
- super調(diào)用父類的構(gòu)造方法,必須是子類構(gòu)造方法的第一行
- super 和 this 不能在同一個(gè)構(gòu)造方法
私有(private)的無法被繼承
-
方法重寫
- 方法修飾符:范圍可以擴(kuò)大但不能縮小
- 拋出異常:范圍可以縮小不能擴(kuò)大
class A{ public void test1(){}; public static void test2(){}; } class B extends A{ public void test1(){}; public static void test2(){}; } A a = new B(); //父類的引用指向子類的對(duì)象 a.test1(); //調(diào)用B類的test1方法 a.test2(); //調(diào)用A類的test2方法
-
多態(tài)
- 有繼承關(guān)系|子類重寫父類方法|父類引用指向子類對(duì)象
- 方法的多態(tài)
- static final private 無法被重寫
- instanceof
抽象類
接口
- 約束和實(shí)現(xiàn)分離 interface
- 默認(rèn) public abstract 方法|默認(rèn)public static final 字段
內(nèi)部類
-
成員內(nèi)部類
public class Outer{ private int id; public void out(){ System.out.println("這是外部類的方法"); } public class Inner(){ public void in(){ System.out.println("這是內(nèi)部類的方法"); } public void getId(){ //內(nèi)部類可獲得外部類的私有字段 System.out.println(id); } } } Outer out = new Outer(); //通過外部類構(gòu)造內(nèi)部類的對(duì)象 Outer.inner in = out.new Inner(); in.getId();
-
靜態(tài)內(nèi)部類
public class Outer{ private int id; public void out(){ System.out.println("這是外部類的方法"); } public static class Inner(){ public void in(){ System.out.println("這是內(nèi)部類的方法"); } } } Outer out = new Outer(); //通過外部類構(gòu)造內(nèi)部類的對(duì)象 Outer.inner in = out.new Inner();
-
局部內(nèi)部類
public class Outer{ private int id; public void method(){ class Inner{ public void in(){ } } } }
匿名內(nèi)部類
- 不把實(shí)列保存到對(duì)象中
- Error
- Exception
- IOException
- RuntimeException
IP
-
公網(wǎng)(互聯(lián)網(wǎng))-私網(wǎng)(局域網(wǎng))
- 192.168.xx.xx
InetAddress
端口
公有端口:0~1023
程序注冊(cè)端口:1024~49151
動(dòng)態(tài)碍粥、私有端口:49152~65535
netstat -ano //查看所有端口 netstat -ano|findstr "端口號(hào)" tasklist|findstr "端口號(hào)"
InetSocketAddress
TCP
客戶端-Socket
服務(wù)端-ServerSocket
package com.csf.net; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo1 { public static void main(String[] args) { Socket socket = null; OutputStream os = null; try { InetAddress ip = InetAddress.getByName("127.0.0.1"); int port = 9999; socket = new Socket(ip, port); os = socket.getOutputStream(); os.write("Hello, World".getBytes()); } catch (IOException e) { e.printStackTrace(); }finally { try { os.close(); } catch (IOException e) { e.printStackTrace(); } try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } ---------------------------------------------------------------------------------- package com.csf.net; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TcpServerDemo1 { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; InputStream is = null; ByteArrayOutputStream baos = null; try { System.out.println("server is running"); serverSocket = new ServerSocket(9999); socket = serverSocket.accept(); is = socket.getInputStream(); // byte[] buffer = new byte[1024]; // int len; // while ((len=is.read(buffer)) != -1){ // String msg = new String(buffer,0,len); // System.out.println(msg); // } baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len=is.read(buffer)) != -1){ baos.write(buffer, 0, len); } System.out.println(baos.toString()); } catch (IOException e) { e.printStackTrace(); }finally { try { baos.close(); } catch (IOException e) { e.printStackTrace(); } try { is.close(); } catch (IOException e) { e.printStackTrace(); } try { socket.close(); } catch (IOException e) { e.printStackTrace(); } try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
-
TCP 文件上傳
- FileInputStream FileOutpuStream
UDP
- DatagramPacket
- DatagramSocket
URL
元注解
@Target : 注解可以用在的地方
-
@Retention : SOURCE < CLASS < RUNTIME
默認(rèn)RUNTIME
@Document
@Inherit
注解中的方法實(shí)際上是申明了一個(gè)配置參數(shù)
方法名稱即為參數(shù)的名稱
方法返回值類型即為參數(shù)的類型(java 基本類型, Class, String, Enum)
采用default申明參數(shù)默認(rèn)值
若只有一個(gè)參數(shù)瓢棒,一般參數(shù)名為value
注解元素必須要有值再悼,一般采用0,""作為默認(rèn)值
獲得class對(duì)象的方式
- Class.forName() 會(huì)被初始化
- getClass()
- 類名.class 不會(huì)被初始化
- 基本類型包裝類的Type屬性馅袁,如:Integer.Type
package com.csf.reflect;
import java.lang.annotation.ElementType;
public class Demo2 {
public static void main(String[] args) {
Class c1 = Object.class;
Class c2 = Comparable.class;
Class c3 = String[].class;
Class c4 = int[][].class;
Class c5 = void.class;
Class c6 = ElementType.class;
Class c7 = Override.class;
Class c8 = Integer.class;
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println(c7);
System.out.println(c8);
//class java.lang.Object
//interface java.lang.Comparable
//class [Ljava.lang.String;
//class [[I
//void
//class java.lang.annotation.ElementType
//interface java.lang.Override
//class java.lang.Integer
}
}
類初始化
-
類的主動(dòng)引用:
- new
- main()方法所在的類
- 反射 Class.forName()
-
被動(dòng)引用不會(huì)初始化
- 常量
- 數(shù)組
- 通過子類獲得父類的靜態(tài)字段,子類不初始化
類加載器
-
分類
- 引導(dǎo)類加載器 BootStap Classload
- 擴(kuò)展類加載器 Extension Classload
- 系統(tǒng)類加載器 System Classload
- 自定義加載器
-
可以加載的路徑
System.out.println(System.getProperty("java.class.path")); // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\charsets.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\deploy.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-32.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar; // C:\Program Files(x86)\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\javaws.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jce.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jfr.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jfxswt.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\jsse.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\management-agent.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\plugin.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\resources.jar; // C:\Program Files (x86)\Java\jdk1.8.0_202\jre\lib\rt.jar; // C:\Users\CSF\IdeaProjects\javaSE\out\production\javaSE; // D:\Program Files\JetBrains\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar
setAccessible 私有屬性严就,構(gòu)造器总寻,方法
獲取泛型
獲取注解
package com.csf.reflect;
import java.lang.annotation.*;
public class Demo5 {
public static void main(String[] args) throws NoSuchFieldException {
Class<Student> studentClass = Student.class;
Annotation[] annotations = studentClass.getAnnotations();
for (Annotation annotation: annotations){
System.out.println(annotation);
}
Table table = studentClass.getAnnotation(Table.class);
System.out.println(table.value());
java.lang.reflect.Field id = studentClass.getDeclaredField("id");
Field annotation = id.getAnnotation(Field.class);
System.out.println(annotation.column());
System.out.println(annotation.length());
System.out.println(annotation.type());
}
}
@Table("db_student")
class Student{
@Field(column = "db_id", type = "int", length = 10)
private int id;
@Field(column = "db_age", type = "int", length = 10)
private int age;
@Field(column = "db_name", type = "varchar", length = 3)
private String name;
public Student(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public Student() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Table{
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Field{
String column();
String type();
int length();
}
main —主線程
線程創(chuàng)建
繼承——Thread
實(shí)現(xiàn)——Runnable
-
實(shí)現(xiàn)——Callable
package com.csf.thread; import java.util.concurrent.*; public class Demo5 { public static void main(String[] args) throws ExecutionException, InterruptedException { //創(chuàng)建執(zhí)行服務(wù) ExecutorService service = Executors.newFixedThreadPool(1); //提交執(zhí)行 Future<Boolean> future = service.submit(new ThreadTest3()); //獲取結(jié)果 Boolean result = future.get(); System.out.println(result); //關(guān)閉服務(wù) service.shutdownNow(); } } class ThreadTest3 implements Callable<Boolean>{ @Override public Boolean call() throws Exception { for(int i=0; i<100000;i++){ } return true; } }
線程同步問題
package com.csf.thread;
public class Demo4 implements Runnable {
private int ticket = 10;
public static void main(String[] args) {
Demo4 ticket = new Demo4();
new Thread(ticket, "小明").start();
new Thread(ticket, "小紅").start();
new Thread(ticket, "小光").start();
}
@Override
public void run() {
while (true){
if (ticket <= 0)
break;
System.out.println(Thread.currentThread().getName() + "==>拿到了第"+ (ticket--) + "張票");
}
}
}
//小紅==>拿到了第10張票
//小光==>拿到了第9張票
//小明==>拿到了第10張票
//小光==>拿到了第7張票
//小紅==>拿到了第8張票
//小光==>拿到了第5張票
//小明==>拿到了第6張票
//小紅==>拿到了第4張票
//小光==>拿到了第3張票
//小明==>拿到了第2張票
//小紅==>拿到了第1張票
靜態(tài)代理模式
package com.csf.thread; public class StaticProxy { public static void main(String[] args) { // Marry you = new You(); // WeddingCompany weddingCompany = new WeddingCompany(you); // weddingCompany.happyMarry(); new WeddingCompany(new You()).happyMarry(); new Thread(()->{ System.out.println("love"); }).start(); } } interface Marry{ void happyMarry(); } class You implements Marry{ @Override public void happyMarry() { System.out.println("要結(jié)婚了了"); } } class WeddingCompany implements Marry{ private Marry target; public WeddingCompany(Marry target) { this.target = target; } @Override public void happyMarry() { before(); target.happyMarry(); after(); } private void after() { System.out.println("收錢"); } private void before() { System.out.println("布置現(xiàn)場(chǎng)"); } }
lambda表達(dá)式
函數(shù)式接口:只包含唯一一個(gè)抽象方法 如Runnable接口
package com.csf.lambda; public class Demo1 { static class Like2 implements ILike{ @Override public void func() { System.out.println("love2"); } } public static void main(String[] args) { // 方式一:最原始的方法 ILike way1 = new Like(); way1.func(); // 方式二:靜態(tài)內(nèi)部類 new Like2().func(); // 方式三:局部內(nèi)部類 class Like3 implements ILike{ @Override public void func() { System.out.println("love3"); } } new Like3().func(); // 方式四:匿名內(nèi)部類 ILike way4 = new ILike() { @Override public void func() { System.out.println("love4"); } }; way4.func(); // 方式五:lambda表達(dá)式 ILike way5 = () -> { System.out.println("love lambda"); }; way5.func(); } } interface ILike{ void func(); } class Like implements ILike{ @Override public void func() { System.out.println("love"); } }
-
帶參數(shù)的lambda
package com.csf.lambda; public class Dmo2 { public static void main(String[] args) { ILove love = (a -> { System.out.println("I love " + a + " 元"); }); love.love(100); } } interface ILove{ void love(int a); }
線程狀態(tài)
- new
- 就緒
- 運(yùn)行
- 阻塞
- 死亡
yield
join
package com.csf.thread;
public class TestJoin {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Join(), "Vip");
t1.start();
for (int i=0; i<1000; i++){
if (i==300){
t1.join();
}
System.out.println("main"+ i);
}
}
}
class Join implements Runnable{
@Override
public void run() {
for (int i=0; i<1000; i++){
System.out.println(Thread.currentThread().getName() + i);
}
}
}
IDEA 快捷鍵:100.for ——for(int i=0; i<100; i++)
synchronized
CopyOnWriteArrayList
死鎖
Lock
- ReentrantLock
生產(chǎn)者消費(fèi)者
線程池
- ExecutorService
- execute(Runnable)
- submit(Callable)
- Executors--線程池的工具類,創(chuàng)建不同類型的線程池