├── 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 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 | } --------------------------------------------------------------------------------