枚举:
用来定义一组命名的常量,存放的都是有关的常量。
关键字: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);
}
}
运行结果: