├── data-algorithm
└── .gitkeep
├── design-pattern
├── 设计模式.xmind
└── src
│ └── com
│ └── miracle
│ └── pattern
│ ├── bridge
│ ├── Color.java
│ ├── BlueColor.java
│ ├── RedColor.java
│ ├── YellowColor.java
│ ├── Phone.java
│ ├── ApplePhone.java
│ └── HuaweiPhone.java
│ ├── command
│ ├── Command.java
│ ├── OnCommand.java
│ ├── OffCommand.java
│ ├── CoolCommand.java
│ ├── WarmCommand.java
│ ├── ConditionReceiver.java
│ └── ConditionInvoker.java
│ ├── proxy
│ ├── DigitalSell.java
│ ├── DigitalSellReal.java
│ └── DigitalSellProxy.java
│ ├── observer
│ ├── Observer.java
│ ├── ConcreteSubject.java
│ ├── ConcreteObserver.java
│ └── Subject.java
│ ├── facade
│ ├── MessageManager.java
│ ├── MailMessageManager.java
│ ├── SmsMessageManager.java
│ ├── WechatMessageManager.java
│ └── MessageFacade.java
│ ├── factory
│ ├── method
│ │ ├── PayFactory.java
│ │ ├── Pay.java
│ │ ├── AliPay.java
│ │ ├── AliPayFactory.java
│ │ ├── WechatPay.java
│ │ └── WechatPayFactory.java
│ ├── simple
│ │ ├── Pay.java
│ │ ├── PayType.java
│ │ ├── AliPay.java
│ │ ├── WechatPay.java
│ │ └── PayFactory.java
│ └── abstracted
│ │ ├── FactoryType.java
│ │ ├── Pay.java
│ │ ├── Refund.java
│ │ ├── OrderFactory.java
│ │ ├── ali
│ │ ├── AliPay.java
│ │ ├── AliRefund.java
│ │ └── AliOrderFactory.java
│ │ ├── wechat
│ │ ├── WechatPay.java
│ │ ├── WechatRefund.java
│ │ └── WechatOrderFactory.java
│ │ └── FactoryProducer.java
│ ├── decorator
│ ├── Bike.java
│ ├── BigBike.java
│ ├── BikeDecorator.java
│ ├── SmallBike.java
│ ├── RSCBikeDecorator.java
│ └── AlarmBikeDecorator.java
│ ├── chain
│ ├── RequestType.java
│ ├── RiskControlManager.java
│ ├── Request.java
│ ├── NormalRiskControlManager.java
│ ├── HighRiskControlManager.java
│ └── MiddleRiskControlManager.java
│ ├── flyweight
│ ├── CloudWebsite.java
│ ├── Company.java
│ ├── ConcreteWebsite.java
│ └── WebsiteFactory.java
│ ├── strategy
│ ├── PromotionStrategy.java
│ ├── NormalStrategy.java
│ ├── DiscountStrategy.java
│ ├── PromotionContext.java
│ ├── VoucherStrategy.java
│ └── ProductOrder.java
│ ├── adapter
│ ├── TargetModule.java
│ ├── OldModule.java
│ ├── PayGateway.java
│ ├── ProductVideoOrder.java
│ ├── ClassAdapter.java
│ ├── PayGatewayAdapter.java
│ ├── ProductVipOrder.java
│ └── ObjectAdapter.java
│ ├── iterator
│ ├── Iterator.java
│ ├── Collection.java
│ ├── ConcreteCollection.java
│ └── ConcreteIterator.java
│ ├── client
│ ├── ProxyClient.java
│ ├── FacadeClient.java
│ ├── SingletonClient.java
│ ├── AbstractFactoryClient.java
│ ├── SimpleFactoryClient.java
│ ├── TemplateMethodClient.java
│ ├── IteratorClient.java
│ ├── DecoratorClient.java
│ ├── ObserverClient.java
│ ├── FactoryMethodClient.java
│ ├── BuilderClient.java
│ ├── BridgeClient.java
│ ├── CompsiteClient.java
│ ├── FlyweightClient.java
│ ├── PrototypeClient.java
│ ├── CommandClient.java
│ ├── ResponsibilityChainClient.java
│ ├── StrategyClient.java
│ └── AdapterClient.java
│ ├── builder
│ ├── ComputerBuilder.java
│ ├── ComputerDirector.java
│ ├── HigherComputerBuilder.java
│ ├── LowerComputerBuilder.java
│ └── Computer.java
│ ├── singleton
│ ├── SingletonEager.java
│ └── SingletonLazy.java
│ ├── template
│ ├── PayServiceProjectManager.java
│ ├── UserServiceProjectManager.java
│ └── ProjectManager.java
│ ├── compsite
│ ├── Root.java
│ ├── File.java
│ └── Folder.java
│ ├── Main.java
│ └── prototype
│ └── Person.java
├── java-learning
└── jdk8
│ ├── jdk8.iml
│ ├── src
│ ├── main
│ │ └── java
│ │ │ └── com
│ │ │ └── miracle
│ │ │ ├── service
│ │ │ ├── OrderService.java
│ │ │ ├── MathService.java
│ │ │ ├── MessageService.java
│ │ │ ├── UserInfoManager.java
│ │ │ ├── OrderServiceImpl.java
│ │ │ ├── UserInfoService.java
│ │ │ ├── MemberService.java
│ │ │ └── UserInfoServiceImpl.java
│ │ │ ├── jdk8
│ │ │ ├── JDK8InterfaceImpl.java
│ │ │ ├── JDK8ParamFunctionalInterface.java
│ │ │ ├── JDK8FunctionalInterface.java
│ │ │ └── JDK8Interface.java
│ │ │ ├── aop
│ │ │ └── Logger.java
│ │ │ └── entity
│ │ │ └── UserInfo.java
│ └── test
│ │ └── java
│ │ └── com
│ │ └── miracle
│ │ ├── lambda
│ │ ├── JDK8InterfaceTest.java
│ │ ├── JDK8ThreadStartTest.java
│ │ ├── OrderServiceTest.java
│ │ ├── JDK8ListTransverseTest.java
│ │ ├── JDK8ParamFunctionalInterfaceTest.java
│ │ ├── JDK8ListComparatorTest.java
│ │ └── MethodReferenceTest.java
│ │ ├── stream
│ │ ├── UserInfoServiceTest.java
│ │ ├── CalculationStreamTest.java
│ │ ├── ConvertListToSetTest.java
│ │ ├── ConvertListToMapTest.java
│ │ ├── ListResultFilterTest.java
│ │ ├── ListComparatorTest.java
│ │ ├── ListMathOperationTest.java
│ │ └── ListConditionalMatchTest.java
│ │ ├── reflection
│ │ ├── ReflectionGenericTest.java
│ │ ├── UserInfoReflectionTest.java
│ │ └── ReflectionApiTest.java
│ │ └── optional
│ │ ├── OptionalUserInfoTest.java
│ │ ├── OptimizeOptionalUserInfoTest.java
│ │ └── OptionalApiTest.java
│ └── pom.xml
├── README.md
├── data-structure
├── out
│ └── production
│ │ └── data-structure
│ │ └── com
│ │ └── miracle
│ │ └── ds
│ │ ├── Main.class
│ │ ├── data
│ │ ├── Array.class
│ │ ├── Queue.class
│ │ ├── Stack.class
│ │ ├── LoopQueue.class
│ │ ├── ArrayQueue.class
│ │ ├── ArrayStack.class
│ │ ├── LinkedList.class
│ │ ├── LinkedList$Node.class
│ │ ├── LinkedListQueue.class
│ │ ├── LinkedListStack.class
│ │ └── LinkedListQueue$Node.class
│ │ ├── entity
│ │ └── Student.class
│ │ └── algorithm
│ │ └── ArrayStackAlgorithm.class
├── src
│ └── com
│ │ └── miracle
│ │ └── ds
│ │ ├── data
│ │ ├── Stack.java
│ │ ├── Queue.java
│ │ ├── LinkedListStack.java
│ │ ├── ArrayStack.java
│ │ ├── ArrayQueue.java
│ │ ├── LinkedListQueue.java
│ │ ├── LoopQueue.java
│ │ ├── Array.java
│ │ └── LinkedList.java
│ │ ├── entity
│ │ └── Student.java
│ │ ├── Main.java
│ │ └── algorithm
│ │ └── ArrayStackAlgorithm.java
└── data-structure.iml
└── .gitignore
/data-algorithm/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/design-pattern/设计模式.xmind:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/design-pattern/设计模式.xmind
--------------------------------------------------------------------------------
/java-learning/jdk8/jdk8.iml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # java
2 | including java knowledge learning: data structure & algorithm, design patterns & principles.
3 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/bridge/Color.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.bridge;
2 |
3 | public interface Color {
4 | void useColor();
5 | }
6 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/command/Command.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.command;
2 |
3 | public interface Command {
4 | void execute();
5 | }
6 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/proxy/DigitalSell.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.proxy;
2 |
3 | public interface DigitalSell {
4 | void sell();
5 | }
6 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/observer/Observer.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.observer;
2 |
3 | public interface Observer {
4 | void update();
5 | }
6 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/facade/MessageManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.facade;
2 |
3 | public interface MessageManager {
4 | void send();
5 | }
6 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/service/OrderService.java:
--------------------------------------------------------------------------------
1 | package com.miracle.service;
2 |
3 | public interface OrderService {
4 | void addOrder();
5 | }
6 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/method/PayFactory.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.method;
2 |
3 | public interface PayFactory {
4 | Pay createPay();
5 | }
6 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/simple/Pay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.simple;
2 |
3 | public interface Pay {
4 | // 统一下单
5 | void unifiedorder();
6 | }
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/simple/PayType.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.simple;
2 |
3 | public enum PayType {
4 | WECHAT_PAY,
5 | ALI_PAY
6 | }
7 |
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/Main.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/Main.class
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/decorator/Bike.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.decorator;
2 |
3 | public interface Bike {
4 | String getDesc();
5 | int getPrice();
6 | }
7 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/method/Pay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.method;
2 |
3 | public interface Pay {
4 | // 统一下单
5 | void unifiedorder();
6 | }
7 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/FactoryType.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted;
2 |
3 | public enum FactoryType {
4 | WECHAT,
5 | ALI
6 | }
7 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/Pay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted;
2 |
3 | public interface Pay {
4 | // 统一下单
5 | void unifiedorder();
6 | }
7 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/Refund.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted;
2 |
3 | public interface Refund {
4 | // 统一退款
5 | void refund();
6 | }
7 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/service/MathService.java:
--------------------------------------------------------------------------------
1 | package com.miracle.service;
2 |
3 | @FunctionalInterface
4 | public interface MathService {
5 | T add(T a, T b);
6 | }
7 |
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/Array.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/Array.class
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/Queue.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/Queue.class
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/Stack.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/Stack.class
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/chain/RequestType.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.chain;
2 |
3 | public enum RequestType {
4 | // 转账
5 | TRANSFER,
6 | // 提现
7 | CASH_OUT
8 | }
9 |
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/LoopQueue.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/LoopQueue.class
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/entity/Student.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/entity/Student.class
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/flyweight/CloudWebsite.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.flyweight;
2 |
3 | public abstract class CloudWebsite {
4 | public abstract void run(Company company);
5 | }
6 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/strategy/PromotionStrategy.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.strategy;
2 |
3 | public interface PromotionStrategy {
4 | double computePrice(ProductOrder order);
5 | }
6 |
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/ArrayQueue.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/ArrayQueue.class
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/ArrayStack.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/ArrayStack.class
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedList.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedList.class
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedList$Node.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedList$Node.class
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedListQueue.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedListQueue.class
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedListStack.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedListStack.class
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/adapter/TargetModule.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.adapter;
2 |
3 | public interface TargetModule {
4 | void methodA();
5 | void methodB();
6 | void methodC();
7 | }
8 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/adapter/OldModule.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.adapter;
2 |
3 | public class OldModule {
4 | public void methodA() {
5 | System.out.println("OldModule methodA");
6 | }
7 | }
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/iterator/Iterator.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.iterator;
2 |
3 | public interface Iterator {
4 | Object next();
5 | boolean hasNext();
6 | Object remove(Object obj);
7 | }
8 |
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedListQueue$Node.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/data/LinkedListQueue$Node.class
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/service/MessageService.java:
--------------------------------------------------------------------------------
1 | package com.miracle.service;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | public interface MessageService {
6 | String display(UserInfo user);
7 | }
8 |
--------------------------------------------------------------------------------
/data-structure/out/production/data-structure/com/miracle/ds/algorithm/ArrayStackAlgorithm.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/miracle-git/java/HEAD/data-structure/out/production/data-structure/com/miracle/ds/algorithm/ArrayStackAlgorithm.class
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/iterator/Collection.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.iterator;
2 |
3 | public interface Collection {
4 | void add(Object obj);
5 | void remove(Object obj);
6 | Iterator iterator();
7 | }
8 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/service/UserInfoManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.service;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | public interface UserInfoManager {
6 | UserInfo getUser(String name, int age);
7 | }
8 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/bridge/BlueColor.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.bridge;
2 |
3 | public class BlueColor implements Color {
4 | @Override
5 | public void useColor() {
6 | System.out.println("蓝色");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/bridge/RedColor.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.bridge;
2 |
3 | public class RedColor implements Color {
4 | @Override
5 | public void useColor() {
6 | System.out.println("红色");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/bridge/YellowColor.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.bridge;
2 |
3 | public class YellowColor implements Color {
4 | @Override
5 | public void useColor() {
6 | System.out.println("黄色");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/Stack.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public interface Stack {
4 | void push(T elem);
5 |
6 | T pop();
7 |
8 | T peek();
9 |
10 | int getSize();
11 |
12 | boolean isEmpty();
13 | }
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/Queue.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public interface Queue {
4 | void enqueue(T elem);
5 |
6 | T dequeue();
7 |
8 | T front();
9 |
10 | int getSize();
11 |
12 | boolean isEmpty();
13 | }
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/OrderFactory.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted;
2 |
3 | /**
4 | * 超级工厂
5 | * */
6 | public interface OrderFactory {
7 | Pay createPay();
8 | Refund createRefund();
9 | }
10 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/proxy/DigitalSellReal.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.proxy;
2 |
3 | public class DigitalSellReal implements DigitalSell {
4 | @Override
5 | public void sell() {
6 | System.out.println("销售华为手机");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/method/AliPay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.method;
2 |
3 | public class AliPay implements Pay {
4 | @Override
5 | public void unifiedorder() {
6 | System.out.println("支付宝支付 统一下单实现");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/simple/AliPay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.simple;
2 |
3 | public class AliPay implements Pay {
4 | @Override
5 | public void unifiedorder() {
6 | System.out.println("支付宝支付 统一下单实现");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/facade/MailMessageManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.facade;
2 |
3 | public class MailMessageManager implements MessageManager {
4 | @Override
5 | public void send() {
6 | System.out.println("推送邮件消息");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/facade/SmsMessageManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.facade;
2 |
3 | public class SmsMessageManager implements MessageManager {
4 | @Override
5 | public void send() {
6 | System.out.println("推送短信消息");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/method/AliPayFactory.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.method;
2 |
3 | public class AliPayFactory implements PayFactory {
4 | @Override
5 | public Pay createPay() {
6 | return new AliPay();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/method/WechatPay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.method;
2 |
3 | public class WechatPay implements Pay {
4 | @Override
5 | public void unifiedorder() {
6 | System.out.println("微信支付 统一下单实现");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/simple/WechatPay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.simple;
2 |
3 | public class WechatPay implements Pay {
4 | @Override
5 | public void unifiedorder() {
6 | System.out.println("微信支付 统一下单实现");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/jdk8/JDK8InterfaceImpl.java:
--------------------------------------------------------------------------------
1 | package com.miracle.jdk8;
2 |
3 | public class JDK8InterfaceImpl implements JDK8Interface {
4 | @Override
5 | public void addOrder() {
6 | System.out.println("Add Order");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/facade/WechatMessageManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.facade;
2 |
3 | public class WechatMessageManager implements MessageManager {
4 | @Override
5 | public void send() {
6 | System.out.println("推送微信消息");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/method/WechatPayFactory.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.method;
2 |
3 | public class WechatPayFactory implements PayFactory {
4 | @Override
5 | public Pay createPay() {
6 | return new WechatPay();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/service/OrderServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.miracle.service;
2 |
3 | public class OrderServiceImpl implements OrderService {
4 | @Override
5 | public void addOrder() {
6 | System.out.println("使用new的实现类的形式调用接口");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/strategy/NormalStrategy.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.strategy;
2 |
3 | public class NormalStrategy implements PromotionStrategy {
4 | @Override
5 | public double computePrice(ProductOrder order) {
6 | return order.getPrice();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/jdk8/JDK8ParamFunctionalInterface.java:
--------------------------------------------------------------------------------
1 | package com.miracle.jdk8;
2 |
3 | /**
4 | * 定义带参数的函数接口
5 | * */
6 | @FunctionalInterface
7 | public interface JDK8ParamFunctionalInterface {
8 | String getFullName(String firstName, String lastName);
9 | }
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .tmp
3 | .DS_Store
4 | package-lock.json
5 | yarn.lock
6 | bower_components
7 | target
8 | out
9 | npm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 | # editor directories and files
13 | .idea
14 | .vscode
15 | *.iml
16 | *.sln
17 | *.suo
18 | *.ntvs*
19 | *.njsproj
20 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/adapter/PayGateway.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.adapter;
2 |
3 | public interface PayGateway {
4 | // 下单
5 | void unifiedorder();
6 | // 退款
7 | void refund();
8 | // 查询支付状态
9 | void query();
10 | // 发红包
11 | void sendRedPack();
12 | }
13 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/aop/Logger.java:
--------------------------------------------------------------------------------
1 | package com.miracle.aop;
2 |
3 | import java.lang.annotation.*;
4 |
5 | @Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD,ElementType.CONSTRUCTOR})
6 | @Retention(RetentionPolicy.RUNTIME)
7 | @Inherited
8 | public @interface Logger {
9 | }
10 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/bridge/Phone.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.bridge;
2 |
3 | public abstract class Phone {
4 | // 通过组合的方式桥接颜色
5 | protected Color color;
6 | public abstract void run();
7 |
8 | public void setColor(Color color) {
9 | this.color = color;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/ali/AliPay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted.ali;
2 |
3 | import com.miracle.pattern.factory.abstracted.Pay;
4 |
5 | public class AliPay implements Pay {
6 | @Override
7 | public void unifiedorder() {
8 | System.out.println("支付宝支付 统一下单实现");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/ali/AliRefund.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted.ali;
2 |
3 | import com.miracle.pattern.factory.abstracted.Refund;
4 |
5 | public class AliRefund implements Refund {
6 | @Override
7 | public void refund() {
8 | System.out.println("支付宝支付 统一退款实现");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/wechat/WechatPay.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted.wechat;
2 |
3 | import com.miracle.pattern.factory.abstracted.Pay;
4 |
5 | public class WechatPay implements Pay {
6 | @Override
7 | public void unifiedorder() {
8 | System.out.println("微信支付 统一下单实现");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/wechat/WechatRefund.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted.wechat;
2 |
3 | import com.miracle.pattern.factory.abstracted.Refund;
4 |
5 | public class WechatRefund implements Refund {
6 | @Override
7 | public void refund() {
8 | System.out.println("微信支付 统一退款实现");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/observer/ConcreteSubject.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.observer;
2 |
3 | public class ConcreteSubject extends Subject {
4 | @Override
5 | public void notifyAllObservers() {
6 | System.out.println("老板完成自己的工作");
7 | System.out.println("老板视察公司情况");
8 | super.notifyAllObservers();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/bridge/ApplePhone.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.bridge;
2 |
3 | public class ApplePhone extends Phone {
4 | public ApplePhone(Color color) {
5 | super.setColor(color);
6 | }
7 |
8 | @Override
9 | public void run() {
10 | color.useColor();
11 | System.out.println("苹果手机");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/bridge/HuaweiPhone.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.bridge;
2 |
3 | public class HuaweiPhone extends Phone {
4 | public HuaweiPhone(Color color) {
5 | super.setColor(color);
6 | }
7 |
8 | @Override
9 | public void run() {
10 | color.useColor();
11 | System.out.println("华为手机");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/ProxyClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.proxy.DigitalSell;
4 | import com.miracle.pattern.proxy.DigitalSellProxy;
5 |
6 | public class ProxyClient {
7 | public static void run() {
8 | DigitalSell proxy = new DigitalSellProxy();
9 | proxy.sell();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/builder/ComputerBuilder.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.builder;
2 |
3 | public interface ComputerBuilder {
4 | ComputerBuilder buildCpu();
5 | ComputerBuilder buildDisk();
6 | ComputerBuilder buildMemory();
7 | ComputerBuilder buildMainboard();
8 | ComputerBuilder buildPower();
9 | Computer createComputer();
10 | }
11 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/FacadeClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.facade.MessageFacade;
4 | import com.miracle.pattern.facade.MessageManager;
5 |
6 | public class FacadeClient {
7 | public static void run() {
8 | MessageManager message = new MessageFacade();
9 | message.send();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/decorator/BigBike.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.decorator;
2 |
3 | public class BigBike implements Bike {
4 | private String desc = "大号自行车";
5 |
6 | @Override
7 | public String getDesc() {
8 | return this.desc;
9 | }
10 |
11 | @Override
12 | public int getPrice() {
13 | return 200;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/decorator/BikeDecorator.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.decorator;
2 |
3 | public abstract class BikeDecorator implements Bike {
4 | private String desc;
5 |
6 | @Override
7 | public String getDesc() {
8 | return this.desc;
9 | }
10 |
11 | @Override
12 | public int getPrice() {
13 | return 0;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/decorator/SmallBike.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.decorator;
2 |
3 | public class SmallBike implements Bike {
4 | private String desc = "小号自行车";
5 |
6 | @Override
7 | public String getDesc() {
8 | return this.desc;
9 | }
10 |
11 | @Override
12 | public int getPrice() {
13 | return 100;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/observer/ConcreteObserver.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.observer;
2 |
3 | public class ConcreteObserver implements Observer {
4 | private String name;
5 |
6 | public ConcreteObserver(String name) {
7 | this.name = name;
8 | }
9 |
10 | @Override
11 | public void update() {
12 | System.out.println(this.name + "发现老板到来,暂停摸鱼,回归工作");
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/adapter/ProductVideoOrder.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.adapter;
2 |
3 | public class ProductVideoOrder extends PayGatewayAdapter {
4 | @Override
5 | public void unifiedorder() {
6 | System.out.println("ProductVideoOrder unifiedorder");
7 | }
8 |
9 | @Override
10 | public void refund() {
11 | System.out.println("ProductVideoOrder refund");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/adapter/ClassAdapter.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.adapter;
2 |
3 | // 类的适配器
4 | public class ClassAdapter extends OldModule implements TargetModule {
5 | @Override
6 | public void methodB() {
7 | System.out.println("ClassAdapter methodB");
8 | }
9 |
10 | @Override
11 | public void methodC() {
12 | System.out.println("ClassAdapter methodC");
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/strategy/DiscountStrategy.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.strategy;
2 |
3 | public class DiscountStrategy implements PromotionStrategy {
4 | private double rate;
5 |
6 | public DiscountStrategy(double rate) {
7 | this.rate = rate;
8 | }
9 |
10 | @Override
11 | public double computePrice(ProductOrder order) {
12 | return order.getPrice() * rate;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/builder/ComputerDirector.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.builder;
2 |
3 | public class ComputerDirector {
4 | public static Computer create(ComputerBuilder builder) {
5 | builder.buildCpu()
6 | .buildDisk()
7 | .buildMemory()
8 | .buildMainboard()
9 | .buildPower();
10 |
11 | return builder.createComputer();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/flyweight/Company.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.flyweight;
2 |
3 | public class Company {
4 | private String name;
5 |
6 | public Company() {}
7 | public Company(String name) {
8 | this.name = name;
9 | }
10 |
11 | public String getName() {
12 | return name;
13 | }
14 |
15 | public void setName(String name) {
16 | this.name = name;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/strategy/PromotionContext.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.strategy;
2 |
3 | public class PromotionContext {
4 | private PromotionStrategy strategy;
5 |
6 | public PromotionContext(PromotionStrategy strategy) {
7 | this.strategy = strategy;
8 | }
9 |
10 | public double executeStrategy(ProductOrder order) {
11 | return this.strategy.computePrice(order);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/SingletonClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.singleton.SingletonEager;
4 | import com.miracle.pattern.singleton.SingletonLazy;
5 |
6 | public class SingletonClient {
7 | public static void run() {
8 | // 懒汉
9 | SingletonLazy.getInstance().process();
10 | // 饿汉
11 | SingletonEager.getInstance().process();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/jdk8/JDK8FunctionalInterface.java:
--------------------------------------------------------------------------------
1 | package com.miracle.jdk8;
2 |
3 | /**
4 | * 函数接口使用@FunctionalInterface来标识
5 | * */
6 | @FunctionalInterface
7 | public interface JDK8FunctionalInterface {
8 | // 函数接口中只能定义一个抽象方法
9 | void get();
10 |
11 | default void add() {
12 | System.out.println("函数接口中可定义默认方法");
13 | }
14 |
15 | // 函数接口中可定义Object父类中的方法
16 | String toString();
17 | }
18 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/entity/Student.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.entity;
2 |
3 | public class Student {
4 |
5 | private String name;
6 | private int score;
7 |
8 | public Student(String name, int score) {
9 | this.name = name;
10 | this.score = score;
11 | }
12 |
13 | @Override
14 | public String toString() {
15 | return String.format("(Student: name = %s, score = %d)", name, score);
16 | }
17 | }
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/command/OnCommand.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.command;
2 |
3 | public class OnCommand implements Command {
4 | private ConditionReceiver receiver;
5 |
6 | public OnCommand(ConditionReceiver receiver) {
7 | this.receiver = receiver;
8 | }
9 |
10 | @Override
11 | public void execute() {
12 | System.out.println("OnCommand -> execute");
13 | this.receiver.on();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/simple/PayFactory.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.simple;
2 |
3 | public class PayFactory {
4 | public static Pay createPay(PayType type) {
5 | switch (type) {
6 | case ALI_PAY:
7 | return new AliPay();
8 | case WECHAT_PAY:
9 | return new WechatPay();
10 | default:
11 | return null;
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/command/OffCommand.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.command;
2 |
3 | public class OffCommand implements Command {
4 | private ConditionReceiver receiver;
5 |
6 | public OffCommand(ConditionReceiver receiver) {
7 | this.receiver = receiver;
8 | }
9 |
10 | @Override
11 | public void execute() {
12 | System.out.println("OffCommand -> execute");
13 | this.receiver.off();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/command/CoolCommand.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.command;
2 |
3 | public class CoolCommand implements Command {
4 | private ConditionReceiver receiver;
5 |
6 | public CoolCommand(ConditionReceiver receiver) {
7 | this.receiver = receiver;
8 | }
9 |
10 | @Override
11 | public void execute() {
12 | System.out.println("CoolCommand -> execute");
13 | this.receiver.cool();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/command/WarmCommand.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.command;
2 |
3 | public class WarmCommand implements Command {
4 | private ConditionReceiver receiver;
5 |
6 | public WarmCommand(ConditionReceiver receiver) {
7 | this.receiver = receiver;
8 | }
9 |
10 | @Override
11 | public void execute() {
12 | System.out.println("WarmCommand -> execute");
13 | this.receiver.warm();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/flyweight/ConcreteWebsite.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.flyweight;
2 |
3 | public class ConcreteWebsite extends CloudWebsite {
4 | private String category;
5 |
6 | public ConcreteWebsite(String category) {
7 | this.category = category;
8 | }
9 |
10 | @Override
11 | public void run(Company company) {
12 | System.out.println("网站分类:" + this.category + ",公司:" + company.getName());
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/adapter/PayGatewayAdapter.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.adapter;
2 |
3 | /**
4 | * 接口适配器
5 | * */
6 | public class PayGatewayAdapter implements PayGateway {
7 | @Override
8 | public void unifiedorder() {
9 | }
10 |
11 | @Override
12 | public void refund() {
13 | }
14 |
15 | @Override
16 | public void query() {
17 | }
18 |
19 | @Override
20 | public void sendRedPack() {
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/data-structure/data-structure.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/command/ConditionReceiver.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.command;
2 |
3 | public class ConditionReceiver {
4 | public void on() {
5 | System.out.println("打开空调");
6 | }
7 |
8 | public void off() {
9 | System.out.println("关闭空调");
10 | }
11 |
12 | public void cool() {
13 | System.out.println("空调开始制冷");
14 | }
15 |
16 | public void warm() {
17 | System.out.println("空调开始制暖");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/singleton/SingletonEager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.singleton;
2 |
3 | /**
4 | * 单例设计模式 - 饿汉实现方式
5 | * */
6 | public class SingletonEager {
7 | private static final SingletonEager instance = new SingletonEager();
8 |
9 | private SingletonEager() {}
10 |
11 | public void process() {
12 | System.out.println("调用成功");
13 | }
14 |
15 | public static SingletonEager getInstance() {
16 | return instance;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/lambda/JDK8InterfaceTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.lambda;
2 |
3 | import com.miracle.jdk8.JDK8Interface;
4 | import com.miracle.jdk8.JDK8InterfaceImpl;
5 |
6 | public class JDK8InterfaceTest {
7 | public static void main(String[] args) {
8 | JDK8Interface jdk8Interface = new JDK8InterfaceImpl();
9 | jdk8Interface.addOrder();
10 | jdk8Interface.getDefaultOrder();
11 | JDK8Interface.getStaticOrder();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/facade/MessageFacade.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.facade;
2 |
3 | public class MessageFacade implements MessageManager {
4 | private MessageManager wechat = new WechatMessageManager();
5 | private MessageManager sms = new SmsMessageManager();
6 | private MessageManager mail = new MailMessageManager();
7 |
8 | @Override
9 | public void send() {
10 | wechat.send();
11 | sms.send();
12 | mail.send();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/chain/RiskControlManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.chain;
2 |
3 | public abstract class RiskControlManager {
4 | protected String name;
5 | protected RiskControlManager superior;
6 |
7 | public RiskControlManager(String name) {
8 | this.name = name;
9 | }
10 |
11 | public void setSuperior(RiskControlManager superior) {
12 | this.superior = superior;
13 | }
14 |
15 | public abstract void handlerRequest(Request request);
16 | }
17 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/jdk8/JDK8Interface.java:
--------------------------------------------------------------------------------
1 | package com.miracle.jdk8;
2 |
3 | /**
4 | * JDK 1.8开始 支持使用static和default修饰 可以写方法体,不需要子类重写
5 | **/
6 | public interface JDK8Interface {
7 | // 抽象方法
8 | void addOrder();
9 |
10 | // 默认方法
11 | default void getDefaultOrder() {
12 | System.out.println("This is default method");
13 | }
14 |
15 | // 静态方法
16 | static void getStaticOrder() {
17 | System.out.println("This is static method");
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/service/UserInfoService.java:
--------------------------------------------------------------------------------
1 | package com.miracle.service;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.List;
6 | import java.util.stream.Stream;
7 |
8 | public interface UserInfoService {
9 | // 对用户集合进行按年龄进行降序排序,并获取用户名包含"mi"的后两位用户
10 | Stream filter(List users);
11 | // 对筛选结果进行打印
12 | default void display(Stream users) {
13 | users.forEach(user -> System.out.println(user));
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/template/PayServiceProjectManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.template;
2 |
3 | public class PayServiceProjectManager extends ProjectManager {
4 | @Override
5 | protected void develop() {
6 | System.out.println("开发周期30天");
7 | }
8 |
9 | @Override
10 | protected void test() {
11 | System.out.println("功能测试,安全测试,压力测试");
12 | }
13 |
14 | @Override
15 | protected void deploy() {
16 | System.out.println("全量上线");
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/template/UserServiceProjectManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.template;
2 |
3 | public class UserServiceProjectManager extends ProjectManager {
4 | @Override
5 | protected void develop() {
6 | System.out.println("开发周期10天");
7 | }
8 |
9 | @Override
10 | protected void test() {
11 | System.out.println("功能测试,压力测试,单元测试");
12 | }
13 |
14 | @Override
15 | protected void deploy() {
16 | System.out.println("灰度发布,全量上线");
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/strategy/VoucherStrategy.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.strategy;
2 |
3 | public class VoucherStrategy implements PromotionStrategy {
4 | private double voucher;
5 |
6 | public VoucherStrategy(double voucher) {
7 | this.voucher = voucher;
8 | }
9 |
10 | @Override
11 | public double computePrice(ProductOrder order) {
12 | if (order.getPrice() > this.voucher) {
13 | return order.getPrice() - this.voucher;
14 | }
15 | return 0;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/Main.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds;
2 |
3 | import com.miracle.ds.test.*;
4 |
5 | public class Main {
6 |
7 | public static void main(String[] args) {
8 | ArrayTest.run();
9 | LinkedListTest.run();
10 |
11 | ArrayStackTest.run();
12 | LinkedListStackTest.run();
13 | StackTest.run(10000);
14 | StackTest.run(1000000);
15 |
16 | ArrayQueueTest.run();
17 | LoopQueueTest.run();
18 | LinkedListQueueTest.run();
19 | QueueTest.run(10000);
20 | QueueTest.run(100000);
21 | }
22 | }
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/adapter/ProductVipOrder.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.adapter;
2 |
3 | public class ProductVipOrder extends PayGatewayAdapter {
4 | @Override
5 | public void unifiedorder() {
6 | System.out.println("ProductVipOrder unifiedorder");
7 | }
8 |
9 | @Override
10 | public void refund() {
11 | System.out.println("ProductVipOrder refund");
12 | }
13 |
14 | @Override
15 | public void sendRedPack() {
16 | System.out.println("ProductVipOrder sendRedPack");
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/compsite/Root.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.compsite;
2 |
3 | public abstract class Root {
4 | private String name;
5 |
6 | public Root(String name) {
7 | this.name = name;
8 | }
9 |
10 | public String getName() {
11 | return name;
12 | }
13 |
14 | public void setName(String name) {
15 | this.name = name;
16 | }
17 |
18 | public abstract void addFile(Root root);
19 | public abstract void removeFile(Root root);
20 | public abstract void display(int depth);
21 | }
22 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/decorator/RSCBikeDecorator.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.decorator;
2 |
3 | public class RSCBikeDecorator extends BikeDecorator {
4 | private String desc = "增加一个防爆胎";
5 | private Bike bike;
6 |
7 | public RSCBikeDecorator(Bike bike) {
8 | this.bike = bike;
9 | }
10 |
11 | @Override
12 | public String getDesc() {
13 | return this.bike.getDesc() + "," + desc;
14 | }
15 |
16 | @Override
17 | public int getPrice() {
18 | return this.bike.getPrice() + 100;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/proxy/DigitalSellProxy.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.proxy;
2 |
3 | public class DigitalSellProxy implements DigitalSell {
4 | private DigitalSellReal real = new DigitalSellReal();
5 |
6 | @Override
7 | public void sell() {
8 | this.selectAddress();
9 | this.makeAd();
10 | real.sell();
11 | }
12 |
13 | private void selectAddress() {
14 | System.out.println("选择人流量很高的地址");
15 | }
16 |
17 | private void makeAd() {
18 | System.out.println("投放广告");
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/chain/Request.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.chain;
2 |
3 | public class Request {
4 | private String requestType;
5 | private double money;
6 |
7 | public String getRequestType() {
8 | return requestType;
9 | }
10 |
11 | public void setRequestType(String requestType) {
12 | this.requestType = requestType;
13 | }
14 |
15 | public double getMoney() {
16 | return money;
17 | }
18 |
19 | public void setMoney(double money) {
20 | this.money = money;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/AbstractFactoryClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.factory.abstracted.FactoryProducer;
4 | import com.miracle.pattern.factory.abstracted.FactoryType;
5 | import com.miracle.pattern.factory.abstracted.OrderFactory;
6 |
7 | public class AbstractFactoryClient {
8 | public static void run() {
9 | OrderFactory factory = FactoryProducer.createFactory(FactoryType.ALI);
10 | factory.createPay().unifiedorder();
11 | factory.createRefund().refund();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/decorator/AlarmBikeDecorator.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.decorator;
2 |
3 | public class AlarmBikeDecorator extends BikeDecorator {
4 | private String desc = "增加一个喇叭";
5 | private Bike bike;
6 |
7 | public AlarmBikeDecorator(Bike bike) {
8 | this.bike = bike;
9 | }
10 |
11 | @Override
12 | public String getDesc() {
13 | return this.bike.getDesc() + "," + desc;
14 | }
15 |
16 | @Override
17 | public int getPrice() {
18 | return this.bike.getPrice() + 50;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/SimpleFactoryClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.factory.simple.Pay;
4 | import com.miracle.pattern.factory.simple.PayFactory;
5 | import com.miracle.pattern.factory.simple.PayType;
6 |
7 | public class SimpleFactoryClient {
8 | public static void run() {
9 | Pay aliPay = PayFactory.createPay(PayType.ALI_PAY);
10 | aliPay.unifiedorder();
11 |
12 | Pay wechatPay = PayFactory.createPay(PayType.WECHAT_PAY);
13 | wechatPay.unifiedorder();
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/service/MemberService.java:
--------------------------------------------------------------------------------
1 | package com.miracle.service;
2 |
3 | //import org.springframework.web.bind.annotation.GetMapping;
4 | //import org.springframework.web.bind.annotation.RestController;
5 |
6 | //@RestController
7 | public class MemberService {
8 | // private RateLimiter limiter =
9 |
10 | // @GetMapping("/get")
11 | // public String get() {
12 | // return "get member";
13 | // }
14 | //
15 | // @GetMapping("/add")
16 | // public String add() {
17 | // return "add member";
18 | // }
19 | }
20 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/ali/AliOrderFactory.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted.ali;
2 |
3 | import com.miracle.pattern.factory.abstracted.OrderFactory;
4 | import com.miracle.pattern.factory.abstracted.Pay;
5 | import com.miracle.pattern.factory.abstracted.Refund;
6 |
7 | public class AliOrderFactory implements OrderFactory {
8 | @Override
9 | public Pay createPay() {
10 | return new AliPay();
11 | }
12 |
13 | @Override
14 | public Refund createRefund() {
15 | return new AliRefund();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/wechat/WechatOrderFactory.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted.wechat;
2 |
3 | import com.miracle.pattern.factory.abstracted.OrderFactory;
4 | import com.miracle.pattern.factory.abstracted.Pay;
5 | import com.miracle.pattern.factory.abstracted.Refund;
6 |
7 | public class WechatOrderFactory implements OrderFactory {
8 | @Override
9 | public Pay createPay() {
10 | return new WechatPay();
11 | }
12 |
13 | @Override
14 | public Refund createRefund() {
15 | return new WechatRefund();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/TemplateMethodClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.template.PayServiceProjectManager;
4 | import com.miracle.pattern.template.ProjectManager;
5 | import com.miracle.pattern.template.UserServiceProjectManager;
6 |
7 | public class TemplateMethodClient {
8 | public static void run() {
9 | ProjectManager project;
10 | project = new PayServiceProjectManager();
11 | project.process();
12 |
13 | project = new UserServiceProjectManager();
14 | project.process();
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/iterator/ConcreteCollection.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.iterator;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class ConcreteCollection implements Collection {
7 | private List list = new ArrayList();
8 |
9 | @Override
10 | public void add(Object obj) {
11 | this.list.add(obj);
12 | }
13 |
14 | @Override
15 | public void remove(Object obj) {
16 | this.list.remove(obj);
17 | }
18 |
19 | @Override
20 | public Iterator iterator() {
21 | return new ConcreteIterator(list);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/service/UserInfoServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.miracle.service;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.List;
6 | import java.util.stream.Stream;
7 |
8 | public class UserInfoServiceImpl implements UserInfoService {
9 | @Override
10 | public Stream filter(List users) {
11 | Stream stream = users.stream();
12 | return stream.sorted((o1, o2) -> o2.getAge() - o1.getAge())
13 | .filter(user -> user.getName().contains("mi"))
14 | .skip(1).limit(2);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/template/ProjectManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.template;
2 |
3 | public abstract class ProjectManager {
4 | public final void process() {
5 | this.review();
6 | this.design();
7 | this.develop();
8 | this.test();
9 | this.deploy();
10 | }
11 |
12 | protected void review() { System.out.println("项目需求评审"); }
13 |
14 | protected void design() {
15 | System.out.println("UI原型设计");
16 | }
17 |
18 | protected abstract void develop();
19 | protected abstract void test();
20 | protected abstract void deploy();
21 | }
22 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/observer/Subject.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.observer;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public abstract class Subject {
7 | private List observers = new ArrayList<>();
8 |
9 | public void addObserver(Observer observer) {
10 | this.observers.add(observer);
11 | }
12 |
13 | public void removeObserver(Observer observer) {
14 | this.observers.remove(observer);
15 | }
16 |
17 | public void notifyAllObservers() {
18 | for(Observer observer : observers) {
19 | observer.update();
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/factory/abstracted/FactoryProducer.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.factory.abstracted;
2 |
3 | import com.miracle.pattern.factory.abstracted.ali.AliOrderFactory;
4 | import com.miracle.pattern.factory.abstracted.wechat.WechatOrderFactory;
5 |
6 | public class FactoryProducer {
7 | public static OrderFactory createFactory(FactoryType type) {
8 | switch (type) {
9 | case ALI:
10 | return new AliOrderFactory();
11 | case WECHAT:
12 | return new WechatOrderFactory();
13 | default:
14 | return null;
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/compsite/File.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.compsite;
2 |
3 | public class File extends Root {
4 | public File(String name) {
5 | super(name);
6 | }
7 |
8 | @Override
9 | public void addFile(Root root) {
10 |
11 | }
12 |
13 | @Override
14 | public void removeFile(Root root) {
15 |
16 | }
17 |
18 | @Override
19 | public void display(int depth) {
20 | StringBuilder builder = new StringBuilder();
21 | for (int i = 0; i < depth; i++) {
22 | builder.append("-");
23 | }
24 | System.out.println(builder.toString() + this.getName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/lambda/JDK8ThreadStartTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.lambda;
2 |
3 | /**
4 | * 使用lambda表达式简化线程启动
5 | * */
6 | public class JDK8ThreadStartTest {
7 | public static void main(String[] args) {
8 | // 1.使用匿名内部类的形式进行线程启动
9 | new Thread(new Runnable() {
10 | @Override
11 | public void run() {
12 | System.out.println("当前线程:" + Thread.currentThread().getName() + ",即将启动!");
13 | }
14 | }).start();
15 | // 2.使用lambda表达式的形式进行线程启动
16 | new Thread(() -> System.out.println("当前线程:" + Thread.currentThread().getName() + ",即将启动!")).start();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/IteratorClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.iterator.Collection;
4 | import com.miracle.pattern.iterator.ConcreteCollection;
5 | import com.miracle.pattern.iterator.Iterator;
6 |
7 | public class IteratorClient {
8 | public static void run() {
9 | Collection collection = new ConcreteCollection();
10 | collection.add("miracle");
11 | collection.add("jack");
12 |
13 | Iterator iterator = collection.iterator();
14 | while (iterator.hasNext()) {
15 | Object obj = iterator.next();
16 | System.out.println(obj);
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/adapter/ObjectAdapter.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.adapter;
2 |
3 | // 对象适配器
4 | public class ObjectAdapter implements TargetModule {
5 | private OldModule old;
6 |
7 | public ObjectAdapter(OldModule old) {
8 | this.old = old;
9 | }
10 |
11 | @Override
12 | public void methodA() {
13 | if (this.old != null) {
14 | this.old.methodA();
15 | }
16 | }
17 |
18 | @Override
19 | public void methodB() {
20 | System.out.println("ObjectAdapter methodB");
21 | }
22 |
23 | @Override
24 | public void methodC() {
25 | System.out.println("ObjectAdapter methodC");
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/DecoratorClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.decorator.AlarmBikeDecorator;
4 | import com.miracle.pattern.decorator.BigBike;
5 | import com.miracle.pattern.decorator.Bike;
6 | import com.miracle.pattern.decorator.RSCBikeDecorator;
7 |
8 | public class DecoratorClient {
9 | public static void run() {
10 | Bike bike = new BigBike();
11 | // 搭配防爆胎
12 | bike = new RSCBikeDecorator(bike);
13 | // 搭配喇叭(2个)
14 | bike = new AlarmBikeDecorator(bike);
15 | bike = new AlarmBikeDecorator(bike);
16 | System.out.println(bike.getDesc() + ",价格: " + bike.getPrice());
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/ObserverClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.observer.ConcreteObserver;
4 | import com.miracle.pattern.observer.ConcreteSubject;
5 | import com.miracle.pattern.observer.Observer;
6 | import com.miracle.pattern.observer.Subject;
7 |
8 | public class ObserverClient {
9 | public static void run() {
10 | Subject subject = new ConcreteSubject();
11 | Observer miracle = new ConcreteObserver("miracle");
12 | Observer jack = new ConcreteObserver("jack");
13 |
14 | subject.addObserver(miracle);
15 | subject.addObserver(jack);
16 |
17 | subject.notifyAllObservers();
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/flyweight/WebsiteFactory.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.flyweight;
2 |
3 | import java.util.HashMap;
4 | import java.util.Map;
5 |
6 | public class WebsiteFactory {
7 | private Map map = new HashMap<>();
8 |
9 | public CloudWebsite getWebsiteByCategory(String category) {
10 | if (this.map.containsKey(category)) {
11 | return this.map.get(category);
12 | } else {
13 | CloudWebsite website = new ConcreteWebsite(category);
14 | this.map.put(category, website);
15 | return website;
16 | }
17 | }
18 |
19 | public int getWebsiteSize() {
20 | return this.map.size();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/FactoryMethodClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.factory.method.AliPayFactory;
4 | import com.miracle.pattern.factory.method.Pay;
5 | import com.miracle.pattern.factory.method.PayFactory;
6 | import com.miracle.pattern.factory.method.WechatPayFactory;
7 |
8 | public class FactoryMethodClient {
9 | public static void run() {
10 | PayFactory aliFactory = new AliPayFactory();
11 | Pay aliPay = aliFactory.createPay();
12 | aliPay.unifiedorder();
13 |
14 | PayFactory wechatFactory = new WechatPayFactory();
15 | Pay wechatPay = wechatFactory.createPay();
16 | wechatPay.unifiedorder();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/BuilderClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.builder.Computer;
4 | import com.miracle.pattern.builder.ComputerDirector;
5 | import com.miracle.pattern.builder.HigherComputerBuilder;
6 | import com.miracle.pattern.builder.LowerComputerBuilder;
7 |
8 | public class BuilderClient {
9 | public static void run() {
10 | // 建造者模式 - 低配版电脑
11 | Computer lowerComputer = ComputerDirector.create(new LowerComputerBuilder());
12 | System.out.println(lowerComputer);
13 | // 建造者模式 - 高配版电脑
14 | Computer higherComputer = ComputerDirector.create(new HigherComputerBuilder());
15 | System.out.println(higherComputer);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/lambda/OrderServiceTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.lambda;
2 |
3 | import com.miracle.service.OrderService;
4 | import com.miracle.service.OrderServiceImpl;
5 |
6 | public class OrderServiceTest {
7 | public static void main(String[] args) {
8 | // 1.使用new的实现类的形式调用接口
9 | OrderService orderService = new OrderServiceImpl();
10 | orderService.addOrder();
11 | // 2.使用匿名内部类的形式调用接口
12 | new OrderService() {
13 | @Override
14 | public void addOrder() {
15 | System.out.println("使用匿名内部类的形式调用接口");
16 | }
17 | }.addOrder();
18 | // 3.使用lambda的形式调用接口
19 | ((OrderService) () -> System.out.println("使用lambda的形式调用接口")).addOrder();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/chain/NormalRiskControlManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.chain;
2 |
3 | public class NormalRiskControlManager extends RiskControlManager {
4 | public NormalRiskControlManager(String name) {
5 | super(name);
6 | }
7 |
8 | @Override
9 | public void handlerRequest(Request request) {
10 | if (RequestType.valueOf(request.getRequestType()) != null && request.getMoney() <= 1000) {
11 | System.out.println("普通操作,输入支付密码即可");
12 | System.out.println(this.name + ": " + request.getRequestType() + ", 金额:" + request.getMoney() + " 处理完成");
13 | } else {
14 | if (this.superior != null) {
15 | this.superior.handlerRequest(request);
16 | }
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/chain/HighRiskControlManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.chain;
2 |
3 | public class HighRiskControlManager extends RiskControlManager {
4 | public HighRiskControlManager(String name) {
5 | super(name);
6 | }
7 |
8 | @Override
9 | public void handlerRequest(Request request) {
10 | if (RequestType.valueOf(request.getRequestType()) != null && request.getMoney() > 10000) {
11 | System.out.println("超大额操作,输入支付密码+短信验证码+人脸识别即可");
12 | System.out.println(this.name + ": " + request.getRequestType() + ", 金额:" + request.getMoney() + " 处理完成");
13 | } else {
14 | if (this.superior != null) {
15 | this.superior.handlerRequest(request);
16 | }
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/BridgeClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.bridge.RedColor;
4 | import com.miracle.pattern.bridge.YellowColor;
5 | import com.miracle.pattern.bridge.BlueColor;
6 | import com.miracle.pattern.bridge.Phone;
7 | import com.miracle.pattern.bridge.HuaweiPhone;
8 | import com.miracle.pattern.bridge.ApplePhone;
9 |
10 | public class BridgeClient {
11 | public static void run() {
12 | Phone redHuaweiPhone = new HuaweiPhone(new RedColor());
13 | redHuaweiPhone.run();
14 |
15 | Phone yellowHuaweiPhone = new HuaweiPhone(new YellowColor());
16 | yellowHuaweiPhone.run();
17 |
18 | Phone blueApplePhone = new ApplePhone(new BlueColor());
19 | blueApplePhone.run();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/CompsiteClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.compsite.File;
4 | import com.miracle.pattern.compsite.Folder;
5 | import com.miracle.pattern.compsite.Root;
6 |
7 | public class CompsiteClient {
8 | public static void run() {
9 | // 根文件夹
10 | Root root = new Folder("C://");
11 | // 子文件夹
12 | Root desktop = new Folder("桌面");
13 | Root myComputer = new Folder("我的电脑");
14 | // 子文件
15 | Root javaFile = new File("hello.java");
16 |
17 | // 添加文件夹
18 | root.addFile(desktop);
19 | root.addFile(myComputer);
20 |
21 | // 添加文件
22 | myComputer.addFile(javaFile);
23 |
24 | // 展示
25 | root.display(0);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/chain/MiddleRiskControlManager.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.chain;
2 |
3 | public class MiddleRiskControlManager extends RiskControlManager {
4 | public MiddleRiskControlManager(String name) {
5 | super(name);
6 | }
7 |
8 | @Override
9 | public void handlerRequest(Request request) {
10 | if (RequestType.valueOf(request.getRequestType()) != null && request.getMoney() > 1000 && request.getMoney() <= 10000) {
11 | System.out.println("大额操作,输入支付密码+短信验证码即可");
12 | System.out.println(this.name + ": " + request.getRequestType() + ", 金额:" + request.getMoney() + " 处理完成");
13 | } else {
14 | if (this.superior != null) {
15 | this.superior.handlerRequest(request);
16 | }
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/iterator/ConcreteIterator.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.iterator;
2 |
3 | import java.util.List;
4 |
5 | public class ConcreteIterator implements Iterator {
6 | private List list;
7 | private int index = 0;
8 |
9 | public ConcreteIterator(List list) {
10 | this.list = list;
11 | }
12 |
13 | @Override
14 | public Object next() {
15 | Object obj = null;
16 | if (this.hasNext()) {
17 | obj = this.list.get(index);
18 | index++;
19 | }
20 | return obj;
21 | }
22 |
23 | @Override
24 | public boolean hasNext() {
25 | return this.index != this.list.size();
26 | }
27 |
28 | @Override
29 | public Object remove(Object obj) {
30 | return this.list.remove(obj);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/lambda/JDK8ListTransverseTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.lambda;
2 |
3 | import java.util.ArrayList;
4 | import java.util.function.Consumer;
5 |
6 | /**
7 | * 使用lambda表达式简化集合遍历
8 | * */
9 | public class JDK8ListTransverseTest {
10 | public static void main(String[] args) {
11 | ArrayList arrayList = new ArrayList<>();
12 | arrayList.add("miracle");
13 | arrayList.add("mike");
14 | arrayList.add("micky");
15 | // 1.使用匿名内部类的形式进行集合遍历
16 | arrayList.forEach(new Consumer() {
17 | @Override
18 | public void accept(String s) {
19 | System.out.println(s);
20 | }
21 | });
22 | // 2.使用lambda表达式的形式进行集合遍历
23 | arrayList.forEach(s -> System.out.println(s));
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/lambda/JDK8ParamFunctionalInterfaceTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.lambda;
2 |
3 | import com.miracle.jdk8.JDK8ParamFunctionalInterface;
4 |
5 | public class JDK8ParamFunctionalInterfaceTest {
6 | public static void main(String[] args) {
7 | // 1.使用匿名内部类的形式调用带参数的函数接口
8 | String result = new JDK8ParamFunctionalInterface() {
9 | @Override
10 | public String getFullName(String firstName, String lastName) {
11 | return firstName + ' ' + lastName;
12 | }
13 | }.getFullName("miracle", "he");
14 | System.out.println(result);
15 | // 2.使用lambda的形式调用带参数的函数接口
16 | System.out.println(((JDK8ParamFunctionalInterface) (firstName, lastName) -> firstName + ' ' + lastName).getFullName("miracle", "he"));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/FlyweightClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.flyweight.CloudWebsite;
4 | import com.miracle.pattern.flyweight.Company;
5 | import com.miracle.pattern.flyweight.WebsiteFactory;
6 |
7 | public class FlyweightClient {
8 | public static void run() {
9 | WebsiteFactory factory = new WebsiteFactory();
10 |
11 | CloudWebsite website1 = factory.getWebsiteByCategory("企业官网");
12 | website1.run(new Company("华为"));
13 |
14 | CloudWebsite website2 = factory.getWebsiteByCategory("信息流");
15 | website2.run(new Company("字节"));
16 |
17 | CloudWebsite website3 = factory.getWebsiteByCategory("企业官网");
18 | website3.run(new Company("腾讯"));
19 |
20 | System.out.println("网站分类总数:" + factory.getWebsiteSize());
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/stream/UserInfoServiceTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.stream;
2 |
3 | import com.miracle.entity.UserInfo;
4 | import com.miracle.service.UserInfoService;
5 | import com.miracle.service.UserInfoServiceImpl;
6 |
7 | import java.util.ArrayList;
8 | import java.util.stream.Stream;
9 |
10 | public class UserInfoServiceTest {
11 | public static void main(String[] args) {
12 | ArrayList userInfos = new ArrayList<>();
13 | userInfos.add(new UserInfo("miracle", 36));
14 | userInfos.add(new UserInfo("mike", 40));
15 | userInfos.add(new UserInfo("micky", 24));
16 | // 对用户集合进行按年龄进行降序排序,并获取用户名包含"mi"的后两位用户
17 | UserInfoService service = new UserInfoServiceImpl();
18 | Stream result = service.filter(userInfos);
19 | service.display(result);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/PrototypeClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.prototype.Person;
4 |
5 | import java.io.IOException;
6 |
7 | public class PrototypeClient {
8 | public static void run() throws CloneNotSupportedException, IOException, ClassNotFoundException {
9 | Person p1 = new Person();
10 | p1.setName("miracle");
11 | p1.setAge(36);
12 | p1.getList().add("aaa");
13 |
14 | // 浅拷贝
15 | Person p2 = p1.clone();
16 | p2.setName("miracle he");
17 | p2.getList().add("bbb");
18 |
19 | // 深拷贝
20 | Person p3 = p1.deepClone();
21 | p3.setName("miracle he");
22 | p3.getList().add("ccc");
23 |
24 | System.out.println(p1);
25 | System.out.println(p2);
26 | System.out.println(p3);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java-learning/jdk8/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | com.miracle
8 | jdk8
9 | 1.0-SNAPSHOT
10 |
11 |
12 |
13 | org.apache.maven.plugins
14 | maven-compiler-plugin
15 |
16 | 8
17 | 8
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/CommandClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.command.*;
4 |
5 | public class CommandClient {
6 | public static void run() {
7 | ConditionReceiver receiver = new ConditionReceiver();
8 |
9 | Command onCommand = new OnCommand(receiver);
10 | Command offCommand = new OffCommand(receiver);
11 | Command coolCommand = new CoolCommand(receiver);
12 | Command warmCommand = new WarmCommand(receiver);
13 |
14 | ConditionInvoker invoker = new ConditionInvoker();
15 | invoker.setOnCommand(onCommand);
16 | invoker.setOffCommand(offCommand);
17 | invoker.setCoolCommand(coolCommand);
18 | invoker.setWarmCommand(warmCommand);
19 |
20 | invoker.on();
21 | invoker.cool();
22 | invoker.warm();
23 | invoker.off();
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/algorithm/ArrayStackAlgorithm.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.algorithm;
2 |
3 | import com.miracle.ds.data.ArrayStack;
4 |
5 | public class ArrayStackAlgorithm {
6 |
7 | // 判断字符串中是否包含有效的括号对(即{,[,(有对应的匹配),],})
8 | public static boolean isValidParentheses(String str) {
9 | ArrayStack stack = new ArrayStack<>();
10 |
11 | for (int i = 0; i < str.length(); i++) {
12 | char c = str.charAt(i);
13 | if (c == '{' || c == '[' || c == '(') {
14 | stack.push(c);
15 | } else {
16 | if (stack.isEmpty()) return false;
17 | if (c == '}' && stack.pop() != '{') return false;
18 | if (c == ']' && stack.pop() != '[') return false;
19 | if (c == ')' && stack.pop() != '(') return false;
20 | }
21 | }
22 |
23 | return stack.isEmpty();
24 | }
25 | }
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/ResponsibilityChainClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.chain.*;
4 |
5 | public class ResponsibilityChainClient {
6 | public static void run() {
7 | RiskControlManager normal = new NormalRiskControlManager("初级风控");
8 | RiskControlManager middle = new MiddleRiskControlManager("中级风控");
9 | RiskControlManager high = new HighRiskControlManager("高级风控");
10 | // 形成调用链
11 | normal.setSuperior(middle);
12 | middle.setSuperior(high);
13 |
14 | Request request = new Request();
15 | request.setRequestType(RequestType.TRANSFER.name());
16 | request.setMoney(2000);
17 | normal.handlerRequest(request);
18 |
19 | request.setRequestType(RequestType.CASH_OUT.name());
20 | request.setMoney(20000);
21 | normal.handlerRequest(request);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/reflection/ReflectionGenericTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.reflection;
2 |
3 | import java.lang.reflect.InvocationTargetException;
4 | import java.lang.reflect.Method;
5 | import java.util.ArrayList;
6 | import java.util.List;
7 |
8 | /**
9 | * 使用反射越过泛型检查
10 | * */
11 | public class ReflectionGenericTest {
12 | public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
13 | List list = new ArrayList<>();
14 | list.add("miracle");
15 | // list.add(36); // 类型不匹配报错
16 | System.out.println(list);
17 |
18 | Class extends List> listClass = list.getClass();
19 | Method add = listClass.getDeclaredMethod("add", Object.class);
20 | add.invoke(list, "miracle");
21 | add.invoke(list, 36); // 可传入任意类型,越过检查
22 | System.out.println(list);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/compsite/Folder.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.compsite;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class Folder extends Root {
7 | List folders = new ArrayList<>();
8 |
9 | public Folder(String name) {
10 | super(name);
11 | }
12 |
13 | @Override
14 | public void addFile(Root root) {
15 | folders.add(root);
16 | }
17 |
18 | @Override
19 | public void removeFile(Root root) {
20 | folders.remove(root);
21 | }
22 |
23 | @Override
24 | public void display(int depth) {
25 | StringBuilder builder = new StringBuilder();
26 | for (int i = 0; i < depth; i++) {
27 | builder.append("-");
28 | }
29 | System.out.println(builder.toString() + this.getName());
30 |
31 | for (Root folder : folders) {
32 | folder.display(depth + 2);
33 | }
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/strategy/ProductOrder.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.strategy;
2 |
3 | public class ProductOrder {
4 | private double price;
5 | private int userId;
6 | private int productId;
7 |
8 | public ProductOrder(double price, int userId, int productId) {
9 | this.price = price;
10 | this.userId = userId;
11 | this.productId = productId;
12 | }
13 |
14 | public double getPrice() {
15 | return price;
16 | }
17 |
18 | public void setPrice(double price) {
19 | this.price = price;
20 | }
21 |
22 | public int getUserId() {
23 | return userId;
24 | }
25 |
26 | public void setUserId(int userId) {
27 | this.userId = userId;
28 | }
29 |
30 | public int getProductId() {
31 | return productId;
32 | }
33 |
34 | public void setProductId(int productId) {
35 | this.productId = productId;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/LinkedListStack.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public class LinkedListStack implements Stack {
4 |
5 | private LinkedList list;
6 |
7 | public LinkedListStack() {
8 | list = new LinkedList<>();
9 | }
10 |
11 | @Override
12 | public void push(T elem) { list.addFirst(elem); }
13 |
14 | @Override
15 | public T pop() { return list.removeFirst(); }
16 |
17 | @Override
18 | public T peek() { return list.getFirst(); }
19 |
20 | @Override
21 | public int getSize() {
22 | return list.getSize();
23 | }
24 |
25 | @Override
26 | public boolean isEmpty() {
27 | return list.isEmpty();
28 | }
29 |
30 | @Override
31 | public String toString() {
32 | StringBuilder result = new StringBuilder();
33 |
34 | result.append("LinkedListStack, top: ");
35 | result.append(list);
36 |
37 | return result.toString();
38 | }
39 | }
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/StrategyClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.strategy.*;
4 |
5 | public class StrategyClient {
6 | public static void run() {
7 | ProductOrder order = new ProductOrder(800, 1, 32);
8 | PromotionContext context;
9 | double finalPrice;
10 | // 根据不同策略计算不同的活动价格
11 | context = new PromotionContext(new NormalStrategy());
12 | finalPrice = context.executeStrategy(order);
13 | System.out.println("NormalStrategy: " + finalPrice);
14 |
15 | context = new PromotionContext(new DiscountStrategy(0.8));
16 | finalPrice = context.executeStrategy(order);
17 | System.out.println("DiscountStrategy: " + finalPrice);
18 |
19 | context = new PromotionContext(new VoucherStrategy(100));
20 | finalPrice = context.executeStrategy(order);
21 | System.out.println("VoucherStrategy: " + finalPrice);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/builder/HigherComputerBuilder.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.builder;
2 |
3 | public class HigherComputerBuilder implements ComputerBuilder {
4 | private Computer computer = new Computer();
5 |
6 | @Override
7 | public ComputerBuilder buildCpu() {
8 | computer.setCpu("高配 CPU");
9 | return this;
10 | }
11 |
12 | @Override
13 | public ComputerBuilder buildDisk() {
14 | computer.setDisk("高配 磁盘");
15 | return this;
16 | }
17 |
18 | @Override
19 | public ComputerBuilder buildMemory() {
20 | computer.setMemory("高配 内存");
21 | return this;
22 | }
23 |
24 | @Override
25 | public ComputerBuilder buildMainboard() {
26 | computer.setMainboard("高配 主板");
27 | return this;
28 | }
29 |
30 | @Override
31 | public ComputerBuilder buildPower() {
32 | computer.setPower("高配 电源");
33 | return this;
34 | }
35 |
36 | @Override
37 | public Computer createComputer() {
38 | return computer;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/builder/LowerComputerBuilder.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.builder;
2 |
3 | public class LowerComputerBuilder implements ComputerBuilder {
4 | private Computer computer = new Computer();
5 |
6 | @Override
7 | public ComputerBuilder buildCpu() {
8 | computer.setCpu("低配 CPU");
9 | return this;
10 | }
11 |
12 | @Override
13 | public ComputerBuilder buildDisk() {
14 | computer.setDisk("低配 磁盘");
15 | return this;
16 | }
17 |
18 | @Override
19 | public ComputerBuilder buildMemory() {
20 | computer.setMemory("低配 内存");
21 | return this;
22 | }
23 |
24 | @Override
25 | public ComputerBuilder buildMainboard() {
26 | computer.setMainboard("低配 主板");
27 | return this;
28 | }
29 |
30 | @Override
31 | public ComputerBuilder buildPower() {
32 | computer.setPower("低配 电源");
33 | return this;
34 | }
35 |
36 | @Override
37 | public Computer createComputer() {
38 | return computer;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/command/ConditionInvoker.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.command;
2 |
3 | public class ConditionInvoker {
4 | private Command onCommand;
5 | private Command offCommand;
6 | private Command coolCommand;
7 | private Command warmCommand;
8 |
9 | public void setOnCommand(Command onCommand) {
10 | this.onCommand = onCommand;
11 | }
12 |
13 | public void setOffCommand(Command offCommand) {
14 | this.offCommand = offCommand;
15 | }
16 |
17 | public void setCoolCommand(Command coolCommand) {
18 | this.coolCommand = coolCommand;
19 | }
20 |
21 | public void setWarmCommand(Command warmCommand) {
22 | this.warmCommand = warmCommand;
23 | }
24 |
25 | public void on() {
26 | this. onCommand.execute();
27 | }
28 |
29 | public void off() {
30 | this.offCommand.execute();
31 | }
32 |
33 | public void cool() {
34 | this.coolCommand.execute();
35 | }
36 |
37 | public void warm() {
38 | this.warmCommand.execute();
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/lambda/JDK8ListComparatorTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.lambda;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.ArrayList;
6 | import java.util.Comparator;
7 |
8 | /**
9 | * 使用lambda表达式简化集合排序
10 | * */
11 | public class JDK8ListComparatorTest {
12 | public static void main(String[] args) {
13 | ArrayList userInfos = new ArrayList<>();
14 | userInfos.add(new UserInfo("miracle", 36));
15 | userInfos.add(new UserInfo("mike", 40));
16 | userInfos.add(new UserInfo("micky", 24));
17 | // 1.使用匿名内部类的形式进行集合比较
18 | userInfos.sort(new Comparator() {
19 | @Override
20 | public int compare(UserInfo o1, UserInfo o2) {
21 | return o1.getAge() - o2.getAge();
22 | }
23 | });
24 | userInfos.forEach(userInfo -> System.out.println(userInfo));
25 | // 2.使用lambda表达式的形式进行集合排序
26 | userInfos.sort((o1, o2) -> o1.getAge() - o2.getAge());
27 | userInfos.forEach(userInfo -> System.out.println(userInfo));
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/stream/CalculationStreamTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.stream;
2 |
3 | import java.time.Duration;
4 | import java.time.Instant;
5 | import java.util.OptionalLong;
6 | import java.util.stream.LongStream;
7 |
8 | /**
9 | * 创建流(串行流、并行流)
10 | * 串行流:单线程操作,适合于数据量较少的场景
11 | * 并行流:多线程操作,适合于超大数据量的场景
12 | * */
13 | public class CalculationStreamTest {
14 | public static void main(String[] args) {
15 | // 创建串行流
16 | displayCalculateResult(false);
17 | // 创建并行流
18 | displayCalculateResult(true);
19 | }
20 |
21 | // 测试计算结果
22 | public static void displayCalculateResult(Boolean parallel) {
23 | Instant start = Instant.now();
24 | System.out.println(parallel ? "并行流" : "串行流");
25 | LongStream stream = LongStream.rangeClosed(1, 50000000000L);
26 | OptionalLong result = (parallel ? stream.parallel() : stream).reduce((a, b) -> a + b);
27 | System.out.println("计算结果:" + result.getAsLong());
28 | Instant end = Instant.now();
29 | System.out.println(("五百亿求和耗费时间:" + Duration.between(start, end).toMillis() / 1000 + "秒"));
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/stream/ConvertListToSetTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.stream;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.ArrayList;
6 | import java.util.Set;
7 | import java.util.stream.Collectors;
8 | import java.util.stream.Stream;
9 |
10 | /**
11 | * Stream可将集合转化为Set(通过重写对象equals和hashCode函数来实现去重)
12 | * */
13 | public class ConvertListToSetTest {
14 | public static void main(String[] args) {
15 | ArrayList userInfos = new ArrayList<>();
16 | userInfos.add(new UserInfo("miracle", 36));
17 | userInfos.add(new UserInfo("miracle", 36));
18 | userInfos.add(new UserInfo("mike", 40));
19 | userInfos.add(new UserInfo("micky", 24));
20 | // 首先进行集合遍历
21 | userInfos.forEach(userInfo -> System.out.println(userInfo));
22 | // 创建集合的stream(串行/并行)
23 | Stream stream = userInfos.stream();
24 | // 将串行流转化为set
25 | Set userSet = stream.collect(Collectors.toSet());
26 | // 只有当UserInfo重写了equals和hashCode函数,才能实现去重
27 | userSet.forEach(userInfo -> System.out.println(userInfo));
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/stream/ConvertListToMapTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.stream;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.ArrayList;
6 | import java.util.Map;
7 | import java.util.stream.Collectors;
8 | import java.util.stream.Stream;
9 |
10 | /**
11 | * Stream可将集合转化为Map(通过指定不同的key值来实现去重)
12 | * */
13 | public class ConvertListToMapTest {
14 | public static void main(String[] args) {
15 | ArrayList userInfos = new ArrayList<>();
16 | userInfos.add(new UserInfo("miracle", 36));
17 | // userInfos.add(new UserInfo("miracle", 36));
18 | userInfos.add(new UserInfo("mike", 40));
19 | userInfos.add(new UserInfo("micky", 24));
20 | // 首先进行集合遍历
21 | userInfos.forEach(userInfo -> System.out.println(userInfo));
22 | // 创建集合的stream(串行/并行)
23 | Stream stream = userInfos.stream();
24 | // 将串行流转化为map
25 | Map userMap = stream.collect(Collectors.toMap(userInfo -> userInfo.getName(), userInfo -> userInfo));
26 | // 只有当指定不同key值时,才能实现去重
27 | userMap.forEach((s, userInfo) -> System.out.println(s + ":" + userInfo));
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/ArrayStack.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public class ArrayStack implements Stack {
4 |
5 | private Array array;
6 |
7 | public ArrayStack(int capacity) {
8 | array = new Array<>(capacity);
9 | }
10 |
11 | public ArrayStack() {
12 | array = new Array<>();
13 | }
14 |
15 | public int getCapacity() { return array.getCapacity(); }
16 |
17 | @Override
18 | public void push(T elem) {
19 | array.addLast(elem);
20 | }
21 |
22 | @Override
23 | public T pop() {
24 | return array.removeLast();
25 | }
26 |
27 | @Override
28 | public T peek() {
29 | return array.getLast();
30 | }
31 |
32 | @Override
33 | public int getSize() { return array.getSize(); }
34 |
35 | @Override
36 | public boolean isEmpty() {
37 | return array.isEmpty();
38 | }
39 |
40 | @Override
41 | public String toString() {
42 | StringBuilder result = new StringBuilder();
43 |
44 | result.append("ArrayStack: ");
45 | result.append("[");
46 | result.append(array.join());
47 | result.append("] top");
48 |
49 | return result.toString();
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/ArrayQueue.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public class ArrayQueue implements Queue {
4 |
5 | private Array array;
6 |
7 | public ArrayQueue(int capacity) {
8 | array = new Array<>(capacity);
9 | }
10 |
11 | public ArrayQueue() {
12 | array = new Array<>();
13 | }
14 |
15 | public int getCapacity() {
16 | return array.getCapacity();
17 | }
18 |
19 | @Override
20 | public void enqueue(T elem) { array.addLast(elem); }
21 |
22 | @Override
23 | public T dequeue() {
24 | return array.removeFirst();
25 | }
26 |
27 | @Override
28 | public T front() {
29 | return array.getFirst();
30 | }
31 |
32 | @Override
33 | public int getSize() { return array.getSize(); }
34 |
35 | @Override
36 | public boolean isEmpty() {
37 | return array.isEmpty();
38 | }
39 |
40 | @Override
41 | public String toString() {
42 | StringBuilder result = new StringBuilder();
43 |
44 | result.append("ArrayQueue: ");
45 | result.append("front [");
46 | result.append(array.join());
47 | result.append("] tail");
48 |
49 | return result.toString();
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/client/AdapterClient.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.client;
2 |
3 | import com.miracle.pattern.adapter.TargetModule;
4 | import com.miracle.pattern.adapter.PayGateway;
5 | import com.miracle.pattern.adapter.ProductVideoOrder;
6 | import com.miracle.pattern.adapter.ProductVipOrder;
7 | import com.miracle.pattern.adapter.ClassAdapter;
8 | import com.miracle.pattern.adapter.ObjectAdapter;
9 | import com.miracle.pattern.adapter.OldModule;
10 |
11 | public class AdapterClient {
12 | public static void run() {
13 | // 接口适配器
14 | PayGateway videoOrder = new ProductVideoOrder();
15 | videoOrder.unifiedorder();
16 | videoOrder.refund();
17 |
18 | PayGateway vipOrder = new ProductVipOrder();
19 | vipOrder.unifiedorder();
20 | vipOrder.refund();
21 | vipOrder.sendRedPack();
22 |
23 | // 类的适配器
24 | TargetModule clsAdapter = new ClassAdapter();
25 | clsAdapter.methodA();
26 | clsAdapter.methodB();
27 | clsAdapter.methodC();
28 |
29 | // 对象适配器
30 | TargetModule objAdapter = new ObjectAdapter(new OldModule());
31 | objAdapter.methodA();
32 | objAdapter.methodB();
33 | objAdapter.methodC();
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/reflection/UserInfoReflectionTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.reflection;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.lang.reflect.Constructor;
6 | import java.lang.reflect.InvocationTargetException;
7 |
8 | /**
9 | * 使用反射创建UserInfo实例
10 | * */
11 | public class UserInfoReflectionTest {
12 | public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
13 | // 1.使用UserInfo.class来创建(使用无参构造函数)
14 | Class> userClass1 = UserInfo.class;
15 | UserInfo userInfo1 = (UserInfo)userClass1.newInstance();
16 | System.out.println(userInfo1);
17 |
18 | // 2.使用Class.forName来创建
19 | Class> userClass2 = Class.forName("com.miracle.entity.UserInfo");
20 | System.out.println(userClass1 == userClass2);
21 | // 使用getDeclaredConstructor调用有参构造函数
22 | Constructor> constructor = userClass2.getDeclaredConstructor(String.class, int.class);
23 | UserInfo userInfo2 = (UserInfo)constructor.newInstance("miracle", 36);
24 | System.out.println(userInfo2);
25 |
26 | // 3.使用new创建
27 | UserInfo user = new UserInfo();
28 | Class> userClass3 = user.getClass();
29 | System.out.println(userClass1 == userClass3);
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/Main.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern;
2 |
3 | import com.miracle.pattern.client.*;
4 |
5 | import java.io.IOException;
6 |
7 | public class Main {
8 | public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
9 | // 单例模式
10 | SingletonClient.run();
11 | // 工厂模式 - 简单工厂
12 | SimpleFactoryClient.run();
13 | // 工厂模式 - 工厂方法
14 | FactoryMethodClient.run();
15 | // 工厂模式 - 抽象工厂
16 | AbstractFactoryClient.run();
17 | // 原型模式
18 | PrototypeClient.run();
19 | // 建造者模式
20 | BuilderClient.run();
21 | // 适配器模式
22 | AdapterClient.run();
23 | // 桥接模式
24 | BridgeClient.run();
25 | // 组合模式
26 | CompsiteClient.run();
27 | // 装饰器模式
28 | DecoratorClient.run();
29 | // 代理模式
30 | ProxyClient.run();
31 | // 外观模式
32 | FacadeClient.run();
33 | // 享元模式
34 | FlyweightClient.run();
35 | // 策略模式
36 | StrategyClient.run();
37 | // 模板方法模式
38 | TemplateMethodClient.run();
39 | // 观察者模式
40 | ObserverClient.run();
41 | // 责任链模式
42 | ResponsibilityChainClient.run();
43 | // 命令模式
44 | CommandClient.run();
45 | // 迭代器模式
46 | IteratorClient.run();
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/optional/OptionalUserInfoTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.optional;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.Optional;
6 |
7 | /**
8 | * 使用Optional简化对象为空判断
9 | * */
10 | public class OptionalUserInfoTest {
11 | private static UserInfo userInfo;
12 |
13 | public static void main(String[] args) {
14 | UserInfo user = getUser("Miracle", 36);
15 | System.out.println(user);
16 |
17 | String name = getUserName(user);
18 | System.out.println(name);
19 | }
20 |
21 | public static UserInfo getUser(String name, int age) {
22 | // if (userInfo == null) {
23 | // return createUser(name, age);
24 | // }
25 | // return userInfo;
26 | return Optional.ofNullable(userInfo).orElse(createUser(name, age));
27 | }
28 |
29 | public static String getUserName(UserInfo userInfo) {
30 | // if (user != null) {
31 | // String name = user.getName();
32 | // if (name != null) {
33 | // return name.toLowerCase();
34 | // }
35 | // }
36 | // return null;
37 | return Optional.ofNullable(userInfo).map(user -> user.getName()).map(name -> name.toLowerCase()).orElse(null);
38 | }
39 |
40 | public static UserInfo createUser(String name, int age) {
41 | return new UserInfo(name, age);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/stream/ListResultFilterTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.stream;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.ArrayList;
6 | import java.util.stream.Stream;
7 |
8 | /**
9 | * 集合的结果筛选(skip, limit)
10 | * */
11 | public class ListResultFilterTest {
12 | public static void main(String[] args) {
13 | ArrayList userInfos = new ArrayList<>();
14 | userInfos.add(new UserInfo("miracle", 36));
15 | userInfos.add(new UserInfo("mike", 40));
16 | userInfos.add(new UserInfo("micky", 24));
17 | // 使用limit对结果进行筛选(前两条数据)
18 | displayUserInfos(getPrevUserInfos(userInfos));
19 | // 使用skip跳过某些数据进行筛选(后两条数据)
20 | displayUserInfos(getNextUserInfos(userInfos));
21 | }
22 |
23 | // 使用limit对结果进行筛选(前两条数据)
24 | static Stream getPrevUserInfos(ArrayList userInfos) {
25 | Stream stream = userInfos.stream();
26 | return stream.limit(2);
27 | }
28 |
29 | // 使用skip跳过某些数据进行筛选(后两条数据)
30 | static Stream getNextUserInfos(ArrayList userInfos) {
31 | Stream stream = userInfos.stream();
32 | return stream.skip(1);
33 | }
34 |
35 | // 对集合结果进行打印
36 | static void displayUserInfos(Stream userInfos) {
37 | userInfos.forEach(userInfo -> System.out.println(userInfo));
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/optional/OptimizeOptionalUserInfoTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.optional;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.Optional;
6 |
7 | /**
8 | * 使用Optional优化操作
9 | * */
10 | public class OptimizeOptionalUserInfoTest {
11 | private static UserInfo userInfo;
12 |
13 | public static void main(String[] args) {
14 | displayUserName(null);
15 | displayUserName("miracle");
16 |
17 | displayUserInfo();
18 | displayUserNameToLower();
19 | }
20 |
21 | // 使用isPresent来简化非空操作
22 | public static void displayUserName(String name) {
23 | Optional.ofNullable(name).ifPresent(System.out::println);
24 | }
25 |
26 | // 使用orElseGet来简化预设处理(配合方法引入)
27 | public static void displayUserInfo() {
28 | UserInfo result = Optional.ofNullable(userInfo).orElseGet(OptimizeOptionalUserInfoTest::createDefaultUser);
29 | System.out.println(result);
30 | }
31 |
32 | // 使用map来简化流式操作
33 | public static void displayUserNameToLower() {
34 | String userName = Optional.ofNullable(createUser()).map(user -> user.getName()).map(name -> name.toLowerCase()).orElse("");
35 | System.out.println(userName);
36 | }
37 |
38 | private static UserInfo createUser() {
39 | return new UserInfo("miracle", 36);
40 | }
41 |
42 | private static UserInfo createDefaultUser() {
43 | userInfo = createUser();
44 | return userInfo;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/builder/Computer.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.builder;
2 |
3 | public class Computer {
4 | private String cpu;
5 | private String disk;
6 | private String memory;
7 | private String mainboard;
8 | private String power;
9 |
10 | public String getCpu() {
11 | return cpu;
12 | }
13 |
14 | public void setCpu(String cpu) {
15 | this.cpu = cpu;
16 | }
17 |
18 | public String getDisk() {
19 | return disk;
20 | }
21 |
22 | public void setDisk(String disk) {
23 | this.disk = disk;
24 | }
25 |
26 | public String getMemory() {
27 | return memory;
28 | }
29 |
30 | public void setMemory(String memory) {
31 | this.memory = memory;
32 | }
33 |
34 | public String getMainboard() {
35 | return mainboard;
36 | }
37 |
38 | public void setMainboard(String mainboard) {
39 | this.mainboard = mainboard;
40 | }
41 |
42 | public String getPower() {
43 | return power;
44 | }
45 |
46 | public void setPower(String power) {
47 | this.power = power;
48 | }
49 |
50 | @Override
51 | public String toString() {
52 | return "Computer{" +
53 | "cpu='" + cpu + '\'' +
54 | ", disk='" + disk + '\'' +
55 | ", memory='" + memory + '\'' +
56 | ", mainboard='" + mainboard + '\'' +
57 | ", power='" + power + '\'' +
58 | '}';
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/stream/ListComparatorTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.stream;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.ArrayList;
6 | import java.util.Comparator;
7 | import java.util.Optional;
8 | import java.util.stream.Stream;
9 |
10 | /**
11 | * 集合的结果排序(sorted)
12 | * */
13 | public class ListComparatorTest {
14 | public static void main(String[] args) {
15 | ArrayList userInfos = new ArrayList<>();
16 | userInfos.add(new UserInfo("miracle", 36));
17 | userInfos.add(new UserInfo("mike", 40));
18 | userInfos.add(new UserInfo("micky", 24));
19 | // 利用sorted函数对集合进行(按年龄)升序
20 | displayUserInfos(getAsc(userInfos));
21 | // 利用sorted函数对集合进行(按年龄)降序
22 | displayUserInfos(getDesc(userInfos));
23 | }
24 |
25 | // 利用sorted函数对集合进行(按年龄)升序
26 | static Stream getAsc(ArrayList userInfos) {
27 | Stream stream = userInfos.stream();
28 | return stream.sorted((userInfo1, userInfo2) -> userInfo1.getAge() - userInfo2.getAge());
29 | }
30 |
31 | // 利用sorted函数对集合进行(按年龄)降序
32 | static Stream getDesc(ArrayList userInfos) {
33 | Stream stream = userInfos.stream();
34 | return stream.sorted((userInfo1, userInfo2) -> userInfo2.getAge() - userInfo1.getAge());
35 | }
36 |
37 | // 对集合结果进行打印
38 | static void displayUserInfos(Stream userInfos) {
39 | userInfos.forEach(userInfo -> System.out.println(userInfo));
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/main/java/com/miracle/entity/UserInfo.java:
--------------------------------------------------------------------------------
1 | package com.miracle.entity;
2 |
3 | import com.miracle.aop.Logger;
4 |
5 | import java.util.Objects;
6 |
7 | @Logger
8 | public class UserInfo {
9 | private String name;
10 | private int age;
11 |
12 | @Logger
13 | public String nickName;
14 |
15 | public UserInfo() {
16 | }
17 |
18 | @Logger
19 | public UserInfo(String name, int age) {
20 | this.name = name;
21 | this.age = age;
22 | }
23 |
24 | public String getName() {
25 | return name;
26 | }
27 |
28 | public int getAge() {
29 | return age;
30 | }
31 |
32 | public void setName(String name) {
33 | this.name = name;
34 | }
35 |
36 | public void setAge(int age) {
37 | this.age = age;
38 | }
39 |
40 | @Deprecated
41 | public String detail() {
42 | return "name: " + this.getName() + ", age: " + this.getAge();
43 | }
44 |
45 | @Logger
46 | private String profile(boolean isPublic) {
47 | if (isPublic) return detail();
48 | return detail() + ", nickName: " + this.nickName;
49 | }
50 |
51 | @Override
52 | public boolean equals(Object o) {
53 | if (this == o) return true;
54 | if (o == null || getClass() != o.getClass()) return false;
55 | UserInfo userInfo = (UserInfo) o;
56 | return age == userInfo.age && name.equals(userInfo.name);
57 | }
58 |
59 | @Override
60 | public int hashCode() {
61 | return Objects.hash(name, age);
62 | }
63 |
64 | @Override
65 | public String toString() {
66 | return "UserInfo{" + "name='" + name + '\'' + ", age=" + age + '}';
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/prototype/Person.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.prototype;
2 |
3 | import java.io.*;
4 | import java.util.ArrayList;
5 | import java.util.List;
6 |
7 | public class Person implements Cloneable, Serializable {
8 | private String name;
9 | private int age;
10 |
11 | private List list = new ArrayList<>();
12 |
13 | public Person() {
14 | System.out.println("构造函数调用");
15 | }
16 |
17 | public String getName() {
18 | return name;
19 | }
20 |
21 | public void setName(String name) {
22 | this.name = name;
23 | }
24 |
25 | public int getAge() {
26 | return age;
27 | }
28 |
29 | public void setAge(int age) {
30 | this.age = age;
31 | }
32 |
33 | public List getList() {
34 | return list;
35 | }
36 |
37 | public void setList(List list) {
38 | this.list = list;
39 | }
40 |
41 | @Override
42 | public String toString() {
43 | return "Person{" +
44 | "name='" + name + '\'' +
45 | ", age=" + age +
46 | ", list=" + list +
47 | '}';
48 | }
49 |
50 | @Override
51 | public Person clone() throws CloneNotSupportedException {
52 | return (Person) super.clone();
53 | }
54 |
55 | public Person deepClone() throws IOException, ClassNotFoundException {
56 | // 反序列化
57 | ByteArrayOutputStream bos = new ByteArrayOutputStream();
58 | ObjectOutputStream oos = new ObjectOutputStream(bos);
59 | oos.writeObject(this);
60 | // 序列化
61 | ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
62 | ObjectInputStream ois = new ObjectInputStream(bis);
63 | return (Person) ois.readObject();
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/stream/ListMathOperationTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.stream;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.ArrayList;
6 | import java.util.Comparator;
7 | import java.util.Optional;
8 | import java.util.stream.Stream;
9 |
10 | /**
11 | * 集合的数学运算(如求和,最大值,最小值等)
12 | * */
13 | public class ListMathOperationTest {
14 | public static void main(String[] args) {
15 | ArrayList userInfos = new ArrayList<>();
16 | userInfos.add(new UserInfo("miracle", 36));
17 | userInfos.add(new UserInfo("mike", 40));
18 | userInfos.add(new UserInfo("micky", 24));
19 | // 利用reduce函数对集合进行求和
20 | System.out.println("sum: " + getSum(userInfos));
21 | // 利用max,min函数对结合求最大,最小值
22 | System.out.println("max: " + getMax(userInfos));
23 | System.out.println("min: " + getMin(userInfos));
24 | }
25 |
26 | // 利用reduce函数对集合进行求和
27 | static int getSum(ArrayList userInfos) {
28 | Stream stream = userInfos.stream();
29 | UserInfo userInfo = new UserInfo("sum", 0);
30 | Optional sum = stream.reduce((userInfo1, userInfo2) -> {
31 | userInfo.setAge(userInfo1.getAge() + userInfo2.getAge());
32 | return userInfo;
33 | });
34 | return sum.get().getAge();
35 | }
36 |
37 | // 利用max函数对结合求最大值
38 | static int getMax(ArrayList userInfos) {
39 | Stream stream = userInfos.stream();
40 | Optional max = stream.max(Comparator.comparingInt(UserInfo::getAge));
41 | return max.get().getAge();
42 | }
43 |
44 | // 利用min函数对结合求最小值
45 | static int getMin(ArrayList userInfos) {
46 | Stream stream = userInfos.stream();
47 | Optional min = stream.min(Comparator.comparingInt(UserInfo::getAge));
48 | return min.get().getAge();
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/design-pattern/src/com/miracle/pattern/singleton/SingletonLazy.java:
--------------------------------------------------------------------------------
1 | package com.miracle.pattern.singleton;
2 |
3 | /**
4 | * 单例设计模式 - 懒汉实现方式
5 | * */
6 | public class SingletonLazy {
7 | // private static SingletonLazy instance;
8 |
9 | private SingletonLazy() {}
10 |
11 | public void process() {
12 | System.out.println("调用成功");
13 | }
14 |
15 | // 第一种方式:线程不安全,多线程下回存在安全问题
16 | // public static SingletonLazy getInstance() {
17 | // if (instance == null) {
18 | // instance = new SingletonLazy();
19 | // }
20 | // return instance;
21 | // }
22 |
23 | // 第二种方式:通过加锁 synchronized 保证单例(但采用对方法加锁存在很大的性能开销)
24 | // public static synchronized SingletonLazy getInstance() {
25 | // if (instance == null) {
26 | // instance = new SingletonLazy();
27 | // }
28 | // return instance;
29 | // }
30 |
31 | // 第三种方式:通过加锁 synchronized + dcl(Double-Checked-Locking) 可在多线程条件下保持高性能
32 | // 但是否安全?instance = new SingletonLazy();此处并非原子性操作(存在指令重排风险)
33 | // 1. 分配空间给对象;2. 在空间内创建对象;3. 将对象赋值引用给instance
34 | // 假设由于指令重排按1->3->2顺序创建,会把值写到主内存,其他线程会读取到instance最新值,但此时并非完全的对象
35 | // public static SingletonLazy getInstance() {
36 | // if (instance == null) {
37 | // synchronized (SingletonLazy.class) {
38 | // if (instance == null) {
39 | // instance = new SingletonLazy();
40 | // }
41 | // }
42 | // }
43 | // return instance;
44 | // }
45 |
46 | // 第四种方式:使用 volatile 避免指令重排,同时保证在多线程条件下保持高性能
47 | private static volatile SingletonLazy instance;
48 |
49 | public static SingletonLazy getInstance() {
50 | // 第一重检查
51 | if (instance == null) {
52 | // 线程安全
53 | synchronized (SingletonLazy.class) {
54 | // 第二重检查
55 | if (instance == null) {
56 | instance = new SingletonLazy();
57 | }
58 | }
59 | }
60 | return instance;
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/stream/ListConditionalMatchTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.stream;
2 |
3 | import com.miracle.entity.UserInfo;
4 |
5 | import java.util.ArrayList;
6 | import java.util.stream.Stream;
7 |
8 | /**
9 | * 集合的条件匹配(allMatch, anyMatch, noneMatch, filter)
10 | * */
11 | public class ListConditionalMatchTest {
12 | public static void main(String[] args) {
13 | ArrayList userInfos = new ArrayList<>();
14 | userInfos.add(new UserInfo("miracle", 36));
15 | userInfos.add(new UserInfo("mike", 40));
16 | userInfos.add(new UserInfo("micky", 24));
17 | // 使用allMatch进行全匹配
18 | System.out.println("allMatch: " + getAllMatch(userInfos));
19 | // 使用anyMatch进行任意匹配
20 | System.out.println("anyMatch: " + getAnyMatch(userInfos));
21 | // 使用noneMatch进行无匹配
22 | System.out.println("noneMatch: " + getNoneMatch(userInfos));
23 | // 使用filter进行条件匹配
24 | getFilterMatch(userInfos).forEach(userInfo -> System.out.println(userInfo));
25 | }
26 |
27 | // 使用allMatch进行全匹配
28 | static boolean getAllMatch(ArrayList userInfos) {
29 | Stream stream = userInfos.stream();
30 | return stream.allMatch(userInfo -> userInfo.getName().equals("miracle"));
31 | }
32 |
33 | // 使用anyMatch进行任意匹配
34 | static boolean getAnyMatch(ArrayList userInfos) {
35 | Stream stream = userInfos.stream();
36 | return stream.anyMatch(userInfo -> userInfo.getName().equals("miracle"));
37 | }
38 |
39 | // 使用noneMatch进行无匹配
40 | static boolean getNoneMatch(ArrayList userInfos) {
41 | Stream stream = userInfos.stream();
42 | return stream.noneMatch(userInfo -> userInfo.getName().equals("miracle"));
43 | }
44 |
45 | // 使用filter进行条件匹配
46 | static Stream getFilterMatch(ArrayList userInfos) {
47 | Stream stream = userInfos.stream();
48 | return stream.filter(userInfo -> userInfo.getName().equals("miracle") && userInfo.getAge() > 35);
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/LinkedListQueue.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public class LinkedListQueue implements Queue {
4 |
5 | private class Node {
6 | public T elem;
7 | public Node next;
8 |
9 | public Node(T elem, Node next) {
10 | this.elem = elem;
11 | this.next = next;
12 | }
13 |
14 | public Node(T elem) {
15 | this(elem, null);
16 | }
17 |
18 | public Node() {
19 | this(null, null);
20 | }
21 |
22 | @Override
23 | public String toString() {
24 | return elem.toString();
25 | }
26 | }
27 |
28 | private Node head, tail;
29 | private int size;
30 |
31 | public LinkedListQueue() {
32 | head = null;
33 | tail = null;
34 | size = 0;
35 | }
36 |
37 | @Override
38 | public void enqueue(T elem) {
39 | if (tail == null) {
40 | tail = new Node(elem);
41 | tail.next = null;
42 | head = tail;
43 | } else {
44 | tail.next = new Node(elem);
45 | tail = tail.next;
46 | }
47 | size++;
48 | }
49 |
50 | @Override
51 | public T dequeue() {
52 | if (isEmpty()) {
53 | throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
54 | }
55 |
56 | Node node = head;
57 | head = head.next;
58 | node.next = null;
59 | if (head == null) {
60 | tail = null;
61 | }
62 | size--;
63 |
64 | return node.elem;
65 | }
66 |
67 | @Override
68 | public T front() {
69 | if (isEmpty()) {
70 | throw new IllegalArgumentException("Queue is empty.");
71 | }
72 |
73 | return head.elem;
74 | }
75 |
76 | @Override
77 | public int getSize() {
78 | return size;
79 | }
80 |
81 | @Override
82 | public boolean isEmpty() {
83 | return size == 0;
84 | }
85 |
86 | @Override
87 | public String toString() {
88 | StringBuilder result = new StringBuilder();
89 | Node current = head;
90 |
91 | result.append("LinkedListQueue, front [");
92 | while (current != null) {
93 | result.append(current + "->");
94 | current = current.next;
95 | }
96 | result.append("NULL] tail");
97 |
98 | return result.toString();
99 | }
100 | }
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/lambda/MethodReferenceTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.lambda;
2 |
3 | import com.miracle.entity.UserInfo;
4 | import com.miracle.service.MathService;
5 | import com.miracle.service.MessageService;
6 | import com.miracle.service.UserInfoManager;
7 |
8 | /**
9 | * 使用方法引入简化lambda表达式(静态方法引入,实例方法引入,构造函数引入,对象方法引入)
10 | * 必须保证引入方法签名与接口签名完全一致(包含参数个数类型,返回类型)
11 | * */
12 | public class MethodReferenceTest {
13 | public static void main(String[] args) {
14 | staticMethodReference();
15 | instanceMethodReference();
16 | constructorMethodReference();
17 | objectMethodReference();
18 | }
19 |
20 | // 静态方法引入
21 | public static void staticMethodReference() {
22 | // 1.使用lambda表达式
23 | MathService math1 = (a, b) -> MethodReferenceTest.sum(a, b);
24 | System.out.println(math1.add(2, 3));
25 | // 2.使用静态方法引入
26 | MathService math2 = MethodReferenceTest::sum;
27 | System.out.println(math2.add(2, 3));
28 | }
29 |
30 | // 实例方法引入
31 | public static void instanceMethodReference() {
32 | MethodReferenceTest refer = new MethodReferenceTest();
33 | // 1.使用lambda表达式
34 | MathService math1 = (a, b) -> refer.join(a, b);
35 | System.out.println(math1.add("miracle", "he"));
36 | // 2.使用实例方法引入
37 | MathService math2 = refer::join;
38 | System.out.println(math2.add("miracle", "he"));
39 | }
40 |
41 | // 构造方法引入
42 | public static void constructorMethodReference() {
43 | // 1.使用lambda表达式
44 | UserInfoManager manager1 = (name, age) -> new UserInfo(name, age);
45 | UserInfo user1 = manager1.getUser("miracle", 36);
46 | System.out.println(user1);
47 | // 2.使用构造函数引入
48 | UserInfoManager manager2 = UserInfo::new;
49 | UserInfo user2 = manager2.getUser("miracle", 36);
50 | System.out.println(user2);
51 | }
52 |
53 | // 对象方法引入
54 | public static void objectMethodReference() {
55 | // 1.使用lambda表达式
56 | MessageService message1 = (user) -> user.detail();
57 | System.out.println(message1.display(new UserInfo("miracle", 36)));
58 | // 2.使用对象方法引入
59 | MessageService message2 = UserInfo::detail;
60 | System.out.println(message2.display(new UserInfo("miracle", 36)));
61 | }
62 |
63 | // 静态方法
64 | public static int sum(int a, int b) {
65 | return a + b;
66 | }
67 |
68 | // 实例方法
69 | public String join(String a, String b) {
70 | return a + " " + b;
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/optional/OptionalApiTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.optional;
2 |
3 | import java.util.Optional;
4 |
5 | /**
6 | * 使用Optional相关api(of,ofNullable,isPresent,ifPresent,orElse,orElseGet,filter)
7 | * */
8 | public class OptionalApiTest {
9 | public static void main(String[] args) {
10 | // useOptionalOf(null); // 此时不允许传入空值,否则会报NullPointerException
11 | useOptionalOf("miracle");
12 |
13 | // useOptionalOfNullable(null); // 此时虽可以传入空值,但直接使用get仍然会报NoSuchElementException
14 | useOptionalOfNullable("miracle");
15 |
16 | useOptionalIsPresent(null);
17 | useOptionalIsPresent("miracle");
18 |
19 | useOptionalIfPresent(null);
20 | useOptionalIfPresent("miracle");
21 |
22 | useOptionalOrElse(null);
23 | useOptionalOrElse("miracle he");
24 |
25 | useOptionalOrElseGet(null);
26 | useOptionalOrElseGet("miracle he");
27 |
28 | useOptionalFilter("miracle");
29 | useOptionalFilter("miracle he");
30 | }
31 |
32 | // of不允许传递空值对象
33 | public static void useOptionalOf(String name) {
34 | Optional optional = Optional.of(name);
35 | System.out.println(optional.get());
36 | }
37 |
38 | // ofNullable允许传递空值对象,但使用
39 | public static void useOptionalOfNullable(String name) {
40 | Optional optional = Optional.ofNullable(name);
41 | System.out.println(optional.get());
42 | }
43 |
44 | // isPresent可判断是否传递空值对象
45 | public static void useOptionalIsPresent(String name) {
46 | Optional optional = Optional.ofNullable(name);
47 | System.out.println(optional.isPresent() ? optional.get() : "");
48 | }
49 |
50 | // ifPresent可判断是否传入空值对象且只有非空才做处理
51 | public static void useOptionalIfPresent(String name) {
52 | // Optional.ofNullable(name).ifPresent(s -> System.out.println(s));
53 | Optional.ofNullable(name).ifPresent(System.out::println);
54 | }
55 |
56 | // orElse为空值对象设置默认值
57 | public static void useOptionalOrElse(String name) {
58 | String userName = Optional.ofNullable(name).orElse("miracle");
59 | System.out.println(userName);
60 | }
61 |
62 | // orElseGet为空值对象做预设处理
63 | public static void useOptionalOrElseGet(String name) {
64 | String userName = Optional.ofNullable(name).orElseGet(() -> {
65 | String fullName = "miracle he";
66 | return fullName + " is learning optional api";
67 | });
68 | System.out.println(userName);
69 | }
70 |
71 | // filter实现参数过滤
72 | public static void useOptionalFilter(String name) {
73 | System.out.println(Optional.ofNullable(name).filter("miracle"::equals).isPresent());
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/LoopQueue.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public class LoopQueue implements Queue {
4 |
5 | private T[] data;
6 | private int front, tail;
7 | private int size;
8 |
9 | public LoopQueue(int capacity) {
10 | data = (T[]) new Object[capacity + 1];
11 | front = 0;
12 | tail = 0;
13 | size = 0;
14 | }
15 |
16 | public LoopQueue() {
17 | this(10);
18 | }
19 |
20 | public int getCapacity() {
21 | return data.length - 1;
22 | }
23 |
24 | @Override
25 | public void enqueue(T elem) {
26 | if (isFull()) {
27 | resize(getCapacity() * 2);
28 | }
29 | data[tail] = elem;
30 | tail = (tail + 1) % data.length;
31 | size++;
32 | }
33 |
34 | @Override
35 | public T dequeue() {
36 | if (isEmpty()) {
37 | throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
38 | }
39 |
40 | T result = data[front];
41 | data[front] = null;
42 | front = (front + 1) % data.length;
43 | size--;
44 | if (size == getCapacity() / 4 && getCapacity() / 2 != 0) {
45 | resize(getCapacity() / 2);
46 | }
47 |
48 | return result;
49 | }
50 |
51 | @Override
52 | public T front() {
53 | if (isEmpty()) {
54 | throw new IllegalArgumentException("Queue is empty.");
55 | }
56 |
57 | return data[front];
58 | }
59 |
60 | @Override
61 | public int getSize() {
62 | return size;
63 | }
64 |
65 | @Override
66 | public boolean isEmpty() {
67 | return front == tail;
68 | }
69 |
70 | public boolean isFull() {
71 | return front == (tail + 1) % data.length;
72 | }
73 |
74 | @Override
75 | public String toString() {
76 | StringBuilder result = new StringBuilder();
77 |
78 | result.append(String.format("LoopQueue: size = %d, capacity = %d\n", size, getCapacity()));
79 | result.append("front [");
80 | for (int i = front; i != tail; i = (i + 1) % data.length) {
81 | result.append(data[i]);
82 | if ((i + 1) % data.length != tail) {
83 | result.append(", ");
84 | }
85 | }
86 | result.append("] tail");
87 |
88 | return result.toString();
89 | }
90 |
91 | private void resize(int newCapacity) {
92 | T[] newData = (T[]) new Object[newCapacity + 1];
93 | for (int i = 0; i < size; i++) {
94 | newData[i] = data[(front + i) % data.length];
95 | }
96 |
97 | data = newData;
98 | front = 0;
99 | tail = size;
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/java-learning/jdk8/src/test/java/com/miracle/reflection/ReflectionApiTest.java:
--------------------------------------------------------------------------------
1 | package com.miracle.reflection;
2 |
3 | import com.miracle.aop.Logger;
4 | import com.miracle.entity.UserInfo;
5 |
6 | import java.lang.reflect.Constructor;
7 | import java.lang.reflect.Field;
8 | import java.lang.reflect.InvocationTargetException;
9 | import java.lang.reflect.Method;
10 |
11 | /**
12 | * 使用反射api(getField, getMethod, getConstructor, getDeclaredField, getDeclaredMethod, getDeclaredConstructor)
13 | * */
14 | public class ReflectionApiTest {
15 | public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
16 | Class> userClass = Class.forName("com.miracle.entity.UserInfo");
17 | UserInfo userInfo = new UserInfo();
18 |
19 | useGetField(userClass, userInfo);
20 | useGetMethod(userClass, userInfo);
21 | useGetAnnotation(userClass);
22 | }
23 |
24 | public static void useGetField(Class> userClass, UserInfo userInfo) throws NoSuchFieldException, IllegalAccessException {
25 | // getFields只能获取类的公共属性
26 | Field[] publicFields = userClass.getFields();
27 | for (Field field: publicFields) {
28 | System.out.println(field);
29 | }
30 | // getDeclaredFields可获取所有的类属性(包含公有,私有,保护)
31 | Field[] fields = userClass.getDeclaredFields();
32 | for (Field field: fields) {
33 | System.out.println(field);
34 | }
35 | // getDeclaredField可获取指定名称的属性
36 | Field nickName = userClass.getDeclaredField("nickName");
37 | nickName.set(userInfo, "miracle he");
38 | System.out.println(userInfo.nickName);
39 |
40 | Field userName = userClass.getDeclaredField("name");
41 | // setAccessible改变私有属性的访问权限
42 | userName.setAccessible(true);
43 | userName.set(userInfo, "miracle");
44 | System.out.println(userInfo.getName());
45 | }
46 |
47 | public static void useGetMethod(Class> userClass, UserInfo userInfo) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
48 | // getDeclaredMethod可获取指定名称的方法
49 | Method detail = userClass.getDeclaredMethod("detail");
50 | System.out.println(detail.invoke(userInfo));
51 |
52 | Method profile = userClass.getDeclaredMethod("profile", boolean.class);
53 | // setAccessible改变私有属性的访问权限
54 | profile.setAccessible(true);
55 | System.out.println(profile.invoke(userInfo, false));
56 | }
57 |
58 | public static void useGetAnnotation(Class> userClass) throws NoSuchMethodException, NoSuchFieldException {
59 | // 获取在UserInfo类上的注解
60 | Logger userInfoAnnotation = userClass.getDeclaredAnnotation(Logger.class);
61 | System.out.println(userInfoAnnotation);
62 |
63 | // 获取在字段上的注解
64 | Field nickName = userClass.getDeclaredField("nickName");
65 | Logger nickNameAnnotation = nickName.getDeclaredAnnotation(Logger.class);
66 | System.out.println(nickNameAnnotation);
67 |
68 | // 获取在方法上的注解
69 | Method profile = userClass.getDeclaredMethod("profile", boolean.class);
70 | Logger profileAnnotation = profile.getDeclaredAnnotation(Logger.class);
71 | System.out.println(profileAnnotation);
72 |
73 | // 获取在构造函数上的注解
74 | Constructor> constructor = userClass.getDeclaredConstructor(String.class, int.class);
75 | Logger constructorAnnotation = constructor.getDeclaredAnnotation(Logger.class);
76 | System.out.println(constructorAnnotation);
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/Array.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public class Array {
4 |
5 | private T[] data;
6 | private int size;
7 |
8 | // 构造函数,初始化数组容量
9 | public Array(int capacity) {
10 | data = (T[]) new Object[capacity];
11 | size = 0;
12 | }
13 |
14 | // 默认无参构造函数,默认容量为10
15 | public Array() {
16 | this(10);
17 | }
18 |
19 | // 返回数组的元素个数
20 | public int getSize() {
21 | return size;
22 | }
23 |
24 | // 返回数组的容量
25 | public int getCapacity() { return data.length; }
26 |
27 | // 判断数组是否为空
28 | public boolean isEmpty() {
29 | return size == 0;
30 | }
31 |
32 | // 往所有元素之前添加一个元素elem
33 | public void addFirst(T elem) {
34 | add(elem, 0);
35 | }
36 |
37 | // 往所有元素之后添加一个元素elem
38 | public void addLast(T elem) {
39 | add(elem, size);
40 | }
41 |
42 | // 往数组指定位置index添加一个元素elem
43 | public void add(T elem, int index) {
44 | if (index < 0 || index > size) {
45 | throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size.");
46 | }
47 |
48 | if (size == data.length) {
49 | resize(2 * data.length);
50 | }
51 |
52 | for (int i = size - 1; i >= index; i--) {
53 | data[i + 1] = data[i];
54 | }
55 |
56 | data[index] = elem;
57 | size++;
58 | }
59 |
60 | // 删除数组中的第一个元素,并返回被删除的元素
61 | public T removeFirst() {
62 | return remove(0);
63 | }
64 |
65 | // 删除数组中的最后一个元素,并返回被删除的元素
66 | public T removeLast() {
67 | return remove(size - 1);
68 | }
69 |
70 | // 删除数组中的指定的元素(仅删除第一个)
71 | public void removeElement(T elem) {
72 | int index = find(elem);
73 | if (index != -1) {
74 | remove(index);
75 | }
76 | }
77 |
78 | // 删除指定索引位置的元素,并返回被删除的元素
79 | public T remove(int index) {
80 | if (index < 0 || index >= size) {
81 | throw new IllegalArgumentException("Remove failed. Require index >= 0 and index < size.");
82 | }
83 |
84 | T result = data[index];
85 |
86 | for (int i = index + 1; i < size; i++) {
87 | data[i - 1] = data[i];
88 | }
89 | size--;
90 | data[size] = null;
91 |
92 | if (size == data.length / 4 && data.length / 2 != 0) {
93 | resize(data.length / 2);
94 | }
95 |
96 | return result;
97 | }
98 |
99 | // 获取数组的第一个元素
100 | public T getFirst() {
101 | return get(0);
102 | }
103 |
104 | // 获取数组的最后一个元素
105 | public T getLast() {
106 | return get(size - 1);
107 | }
108 |
109 | // 获取指定索引index位置的元素
110 | public T get(int index) {
111 | if (index < 0 || index >= size) {
112 | throw new IllegalArgumentException("Get failed. Require index >= 0 and index < size.");
113 | }
114 |
115 | return data[index];
116 | }
117 |
118 | // 修改指定索引index位置的元素
119 | public void set(int index, T val) {
120 | if (index < 0 || index >= size) {
121 | throw new IllegalArgumentException("Set failed. Require index >= 0 and index < size.");
122 | }
123 |
124 | data[index] = val;
125 | }
126 |
127 | // 查找数组中是否包含指定的元素
128 | public boolean contains(T elem) {
129 | for (int i = 0; i < size; i++) {
130 | if (data[i].equals(elem)) {
131 | return true;
132 | }
133 | }
134 |
135 | return false;
136 | }
137 |
138 | // 从数组中查找指定元素对应的索引,如未找到则返回-1
139 | public int find(T elem) {
140 | for (int i = 0; i < size; i++) {
141 | if (data[i].equals(elem)) {
142 | return i;
143 | }
144 | }
145 |
146 | return -1;
147 | }
148 |
149 | // 将数组元素以字符串形式拼接起来(以逗号分开)
150 | public String join() {
151 | StringBuilder result = new StringBuilder();
152 |
153 | for (int i = 0; i < getSize(); i++) {
154 | result.append(get(i));
155 | if (i != getSize() - 1) {
156 | result.append(", ");
157 | }
158 | }
159 |
160 | return result.toString();
161 | }
162 |
163 | @Override
164 | public String toString() {
165 | StringBuilder result = new StringBuilder();
166 |
167 | result.append(String.format("Array: size = %d, capacity = %d\n", size, getCapacity()));
168 | result.append("[");
169 | result.append(join());
170 | result.append("]");
171 |
172 | return result.toString();
173 | }
174 |
175 | // 当数组元素插入或删除时,动态扩展或收缩数组的容量
176 | private void resize(int newCapacity) {
177 | T[] newData = (T[]) new Object[newCapacity];
178 |
179 | for (int i = 0; i < size; i++) {
180 | newData[i] = data[i];
181 | }
182 |
183 | data = newData;
184 | }
185 | }
186 |
--------------------------------------------------------------------------------
/data-structure/src/com/miracle/ds/data/LinkedList.java:
--------------------------------------------------------------------------------
1 | package com.miracle.ds.data;
2 |
3 | public class LinkedList {
4 |
5 | private class Node {
6 | public T elem;
7 | public Node next;
8 |
9 | public Node(T elem, Node next) {
10 | this.elem = elem;
11 | this.next = next;
12 | }
13 |
14 | public Node(T elem) {
15 | this(elem, null);
16 | }
17 |
18 | public Node() {
19 | this(null, null);
20 | }
21 |
22 | @Override
23 | public String toString() {
24 | return elem.toString();
25 | }
26 | }
27 |
28 | private Node dummyHead; // 虚拟头节点
29 | private int size;
30 |
31 | public LinkedList() {
32 | dummyHead = new Node(null, null);
33 | size = 0;
34 | }
35 |
36 | // 返回链表中的元素个数
37 | public int getSize() {
38 | return size;
39 | }
40 |
41 | // 判断链表是否为空
42 | public boolean isEmpty() {
43 | return size == 0;
44 | }
45 |
46 | // 往链表头部添加一个元素elem
47 | public void addFirst(T elem) {
48 | add(elem, 0);
49 | }
50 |
51 | // 往链表末尾添加一个元素elem
52 | public void addLast(T elem) {
53 | add(elem, size);
54 | }
55 |
56 | // 往链表的指定位置index添加一个元素elem
57 | public void add(T elem, int index) {
58 | if (index < 0 || index > size) {
59 | throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size.");
60 | }
61 |
62 | Node prev = dummyHead;
63 | for (int i = 0; i < index; i++) {
64 | prev = prev.next;
65 | }
66 | // Node node = new Node(elem);
67 | // node.next = prev.next;
68 | // prev.next = node;
69 | prev.next = new Node(elem, prev.next);
70 | size++;
71 | }
72 |
73 | // 删除链表的头部元素
74 | public T removeFirst() {
75 | return remove(0);
76 | }
77 |
78 | // 删除链表的末尾元素
79 | public T removeLast() {
80 | return remove(size - 1);
81 | }
82 |
83 | // 删除链表中指定位置index的元素
84 | public T remove(int index) {
85 | if (index < 0 || index >= size) {
86 | throw new IllegalArgumentException("Remove failed. Require index >= 0 and index < size.");
87 | }
88 |
89 | Node prev = dummyHead;
90 | for (int i = 0; i < index; i++) {
91 | prev = prev.next;
92 | }
93 |
94 | Node result = prev.next;
95 | prev.next = result.next;
96 | result.next = null;
97 | size--;
98 |
99 | return result.elem;
100 | }
101 |
102 | // 获取链表的头部元素
103 | public T getFirst() {
104 | return get(0);
105 | }
106 |
107 | // 获取链表的末尾元素
108 | public T getLast() {
109 | return get(size - 1);
110 | }
111 |
112 | // 获取链表的指定位置index的元素
113 | public T get(int index) {
114 | if (index < 0 || index >= size) {
115 | throw new IllegalArgumentException("Get failed. Require index >= 0 and index < size.");
116 | }
117 |
118 | Node current = dummyHead.next;
119 | for (int i = 0; i < index; i++) {
120 | current = current.next;
121 | }
122 |
123 | return current.elem;
124 | }
125 |
126 | // 修改指定索引index位置的元素
127 | public void set(int index, T val) {
128 | if (index < 0 || index >= size) {
129 | throw new IllegalArgumentException("Set failed. Require index >= 0 and index < size.");
130 | }
131 |
132 | Node current = dummyHead.next;
133 | for (int i = 0; i < index; i++) {
134 | current = current.next;
135 | }
136 |
137 | current.elem = val;
138 | }
139 |
140 | // 查找链表是否包含元素elem
141 | public boolean contains(T elem) {
142 | Node current = dummyHead.next;
143 |
144 | while (current != null) {
145 | if (current.elem.equals((elem))) {
146 | return true;
147 | }
148 | current = current.next;
149 | }
150 |
151 | return false;
152 | }
153 |
154 | @Override
155 | public String toString() {
156 | StringBuilder result = new StringBuilder();
157 | Node current = dummyHead.next;
158 |
159 | while (current != null) {
160 | result.append(current + "->");
161 | current = current.next;
162 | }
163 | result.append("NULL");
164 |
165 | return result.toString();
166 | }
167 | }
--------------------------------------------------------------------------------