枚举 + 单例模式 + 双链表

枚举:

用来定义一组命名的常量,存放的都是有关的常量。

关键字:enum

有构造函数,默认private修饰,不能实例化,不能继承,有成员

定义多个实例用 , 最后一个使用 ;

都属于java.lang.Enum的子类

继承的方法:

ordinal() : 返回实例声明的索引

static values() : 将枚举的所有对象存到数组中

static valueOf() : 返回对象所在的下标

public enum Day {
    SUNDAY("星期天"),MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),
    FRIDAY("星期五"),SATURDAY("星期六");
    private String name;
    Day(String name){ //构造默认方法私有,不能实例化
       this.name = name;
    }

    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }


}
class TestEnum {
    public static void main(String[] args) {
        Day day = Day.SATURDAY;
        System.out.println(day);  //SATURDAY
        System.out.println(day.getName()); //星期六
        System.out.println(day.ordinal());//返回声明时所在的位置  6
        Day[] days = Day.values(); //将Day中的每一个对象存到数组中
        for (Day day1 : days) {
            System.out.print(day1 + " ");
        }
        System.out.println();

        System.out.println(Day.valueOf("TUESDAY"));  //通过常量名获取对应的枚举实例

        day.setName("Sunday");
        System.out.println(day.getName()); //Sunday

    }
}
单例模式:

只有一个实例(一个类)

注:

  • 只有一个实例

  • 自己创建自己

  • 给其他对象提供这一实例

实现:

私有构造,对外不能访问

提供对外访问方法,static(外部不创建对象)

获取实例:

1.饿汉模式:

创建对象直接赋值,对象私有,静态常量

缺点:从未使用过这个实例,造成内存浪费

public class HungrySingleton {
    //饿汉模式:创建对象时直接赋值,对外提供static访问方法,构造私有
    private static final HungrySingleton hungrySingleton = new HungrySingleton();

    private String name = "Hungry";
    private HungrySingleton(){}
    public static void getHS(){
        System.out.println(hungrySingleton.name);
    }

}

class HungrySingletonTest{
    public static void main(String[] args) {
        HungrySingleton.getHS();
    }
}

2.懒汉模式

在对外方法中赋值,单线程下使用

public class LazySingleton {
    //懒汉模式:在对外提供的方法中赋值
    private static LazySingleton lazySingleton;
    private String name = "Lazy";
    private LazySingleton(){}
    public static LazySingleton getLS() {
        if (lazySingleton == null) {
            lazySingleton = new LazySingleton();
        } else {
            return lazySingleton;
        }
       return lazySingleton;
    }
}

class LazySingletonTest{
    public static void main(String[] args) {
        System.out.println(LazySingleton.getLS());
    }
}

3.静态内部类

在外类,构造私有,提供方法返回内部类属性

在内部类创建对象

优点:避免线程不安全,延迟加载,效率高

public class InnerSingleton {
    //静态内部类:在内部类中创建外部类对象,在外部类中static方法中返回内部类对象属性
    public static InnerSingleton getINS(){
        return Inner.innerSingleton;
    }
    private InnerSingleton(){
        System.out.println();
    }

    class Inner{
        private static InnerSingleton innerSingleton = new InnerSingleton();

    }
}
class InnerSingletonTest{
    public static void main(String[] args) {

    }
}

双链表:

import java.util.Objects;

public class DoubleLinked {
    //双链表
    private Node first;
    private Node last;
    private int count;

    //尾部添加元素
    public boolean add(Object o) {
        Node current = new Node(null, o, null);
        if (first == null) {
            first = current;
            last = first;
            count++;
            return true;
        }
        last.next = current;
        current.prev = last;
        last = current;
        count++;
        return true;
    }

    //删除第一个元素
    public boolean removeFirst() {
        if (first == null) { //为空
            return false;
        }
        if (first.next == null) { //只有一个元素
            first = null;
            last = null;
            count--;
            return true;
        }
        Node node = first.next; //含其他元素
        node.prev = null;
        first = node;
        count--;
        return true;
    }

    //删除最后一个元素
    public boolean removeLast() {
        if (last == null) { //为空
            return false;
        }
        if (first == last) { //只有一个元素
            first = null;
            last = null;
            count--;
            return true;
        }
        Node node = last.prev; //含有其他元素
        node.next = null;
        last = node;
        count--;
        return true;
    }

    //删除其他元素
    public boolean removeNode(Object o) {
        if (isEmpty()){
            return false;
        }
        if (Objects.equals(first.value, o)) {  //要删除的元素等于第一个
            return removeFirst();
        }
        if (Objects.equals(last.value, o)) {   //要删除的元素等于最后一个
            return removeLast();
        }
        Node node = first.next;
        while (!Objects.equals(node.value, o)) {  // 2
            node = node.next;                    //  3
            if (node == null) {             //   4
                return false;
            }
        }
        Node current = node.prev;  //要删除元素的前一个元素
        Node temp = node.next;     //要删除元素的前一个元素
        current.next = temp;  //前一个元素的下一个位置指向current的后一个元素
        temp.prev = current;
        count--;
        return true;
    }

    //转换成字符串输出
    @Override
    public String toString() {
        if (isEmpty()) {
            return null;
        }
        Node node = first;
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        while (node != last) {
            sb.append(node.value + ",");
            node = node.next;
        }
        sb.append(last.value + "]");
        return sb.toString();
    }

    //输出指定位置的元素
    public Object getElement(int index) {
        if (isEmpty()) {
            return null;
        }
        if (index < 0 || index > count) {
            return null;
        }
        Node node = first;
        int num = 0;
        while (num <= index) {
            node = node.next;
            if (node == null) {
                return null;
            }
            num++;
        }
        return node.value;
    }

    //返回指定元素的下标
    public int getIndex(Object o) {
        if (!isContain(o)) {
            return -1;
        }
        Node node = first;
        int num = 0;
        while (!Objects.equals(node.value, o)) {
            node = node.next;
            if (node == null) {
                return -1;
            }
            num++;
        }
        return num;
    }

    //在指定位置插入元素
    public boolean insertElement(Object o, int index) {
        Node node = new Node(null, o, null);
        if (index < 0 || index > count){
            return false;
        }
        if (index == 0) { //下标为0
            if (isEmpty()) {  //为空
                first = node;
                last = node;
                count++;
                return true;
            }else {  //不为空
                node.next = first;
                first.prev = node;
                first = node;
                count ++;
                return true;
            }
        }
        Node la = last;
        if (index == count - 1){  //在最后一个位置插入
            node.next = la;
            la.prev.next = node;


            count ++;
            return true;
        }
        if (index == count){ // 在count位置插入
            last.next = node;
            node.prev = last;
            last = node;
            count ++;
            return true;
        }
        Node current = first;
        int num = 0;
        while (num != index){
            current = current.next;
            if (current == null){
                return false;
            }
            num ++;
        }
        node.next = current.next;
        current.next = node;


        count ++;
        return true;
    }

    //判断是否为空
    public boolean isEmpty() {
        return count == 0;
    }

    //判断是否包含该元素
    public boolean isContain(Object o) {
        if (isEmpty()) {
            return false;
        }
        Node node = first;
        while (!Objects.equals(node.value, o)) {
            node = node.next;
            if (node == null) {
                return false;
            }
        }
        return true;
    }

    //获取链表长度
    public int size() {
        return count;
    }


    class Node {
        private Node prev;
        private Object value;
        private Node next;

        public Node(Node prev, Object value, Node next) {
            this.prev = prev;
            this.value = value;
            this.next = next;
        }

        public Object getValue() {
            return value;
        }
    }
}
public class DoubleLinkedTest {
    public static void main(String[] args) {
        DoubleLinked doubleLinked = new DoubleLinked();
        System.out.println(doubleLinked.add(1));
        System.out.println(doubleLinked.add(2));
        System.out.println(doubleLinked.add(3));
        System.out.println(doubleLinked.add(4));
        System.out.println(doubleLinked.add(5));

        System.out.println("获取链表长度:" + doubleLinked.size());
        //转换成字符串输出
        System.out.println("转换成字符串输出: " + doubleLinked);

        //在指定位置插入元素
        System.out.println("在指定位置插入元素:" + doubleLinked.insertElement(3, 5));
        System.out.println("转换成字符串输出: " + doubleLinked.toString());

        System.out.println("获取链表长度:" + doubleLinked.size());

        //输出指定位置的元素
        System.out.println("转换成字符串输出: " + doubleLinked);
        System.out.println("输出指定位置的元素:" + doubleLinked.getElement(4));

        System.out.println("判断是否包含某个元素:" + doubleLinked.isContain(-1));

        //返回指定元素的下标
        System.out.println("转换成字符串输出: " + doubleLinked);
        System.out.println("返回指定元素的下标:" + doubleLinked.getIndex(4));

        //删除其他位置的元素
        System.out.println("转换成字符串输出: " + doubleLinked);
        System.out.println("删除其他位置的元素:" + doubleLinked.removeNode(1));

        //删除第一个元素
        System.out.println("转换成字符串输出: " + doubleLinked);
        doubleLinked.removeFirst();
        System.out.println("删除第一个元素 :" + doubleLinked);

        //删除最后一个元素
        System.out.println("转换成字符串输出: " + doubleLinked);
        doubleLinked.removeLast();
        System.out.println("删除最后一个元素:" + doubleLinked);


    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值