Java学习笔记 - 第017天

每日要点

容器

容器(集合框架Container) - 承载其他对象的对象

Collection

  • List
  • ArrayList
  • LinkedList
  • Set

List

ArrayList - 底层实现是一个数组 使用连续内存 可以实现随机存取
List list = new ArrayList<>();
LinkedList - 底层实现是一个双向循环链表 可以使用碎片内存 不能随机存取 但是增删元素是需要修改引用即可 所以增删元素时有更好的性能
List list = new LinkedList<>();
从Java 5开始容器可以指定泛型参数来限定容器中对象引用的类型
带泛型参数的容器比不带泛型参数的容器中使用上更加方便
Java 7开始构造器后面的泛型参数可以省略 - 钻石语法

List list = new ArrayList();
List list = new ArrayList<>();

Java 5
容器中只能放对象的引用不能放基本数据类型
所以向容器中添加基本数据类型时会自动装箱(auto-boxing)
所谓自动装箱就是将基本数据类型处理成对应的包装类型

list.add(1000); // list.add(new Integer(1000));
list.add(3.14); // list.add(new Double(3.14));
list.add(true); // list.add(new Boolean(true));

List接口普通方法:


  • list.add("apple");
    根据索引添加对象:
    list.add(list.size(), "shit");

  • list.remove("apple");
    清空:
    list.clear();
    根据指定的参考系删除所有
    list.removeAll(temp);
    根据指定的参考系保留所有
    list.retainAll(temp);
  • 方法一:
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
  • 方法二:
        for (Object object : list) {
            System.out.println(object.getClass());
        }
  • 方法三:
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

Java 8以后新特性
从Java 8开始可以给容器发送forEach消息对元素进行操作
orEach方法的参数可以是方法引用也可以是Lambda表达式
方法引用
list.forEach(System.out::println);
Lambda表达式

        list.forEach(e -> {
            System.out.println(e.toUpperCase());
        });

杂项

基本类型  包装类型(Wrapper class)
byte      Byte ---> new Byte(1)
short     Short
int      Integer
long      Long
float      Float
double    Double
boolean   Boolean

例子

  • 1.自动装箱和自动拆箱
        Object object1 = 100; // 自动装箱
        System.out.println(object1.getClass());
        Integer object2 = (Integer) object1;
        int a = object2;  // 自动拆箱
        int b = (Integer) object1;
        System.out.println(a);
        System.out.println(b);
        
        List list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            // 自动装箱(auto-boxing) int ---> Integer
            list.add((int) (Math.random() * 20));
        }
        for (Integer x : list) {   // int x : list
            // 自动拆箱(auto-unboxing) Integer对象 ---> int
            if (x > 10) {
                System.out.println(x);
            }
        }
  • 2.面试题: Integer c = 123; Integer d = 123; 是否相等
        int[] x = {1, 2, 3};
        int[] y = {1, 2, 3};
        System.out.println(x.hashCode());
        System.out.println(y.hashCode());
        System.out.println(x == y);
        // 数组没有重写equals方法
        System.out.println(x.equals(y));
        System.out.println(Arrays.equals(x, y));
        
        Integer a = 12345;
        Integer b = 12345;
        
        System.out.println(a == b);
        System.out.println(a.equals(b));
        
        // Integer 有准备 -128~127的常量
        Integer c = 123;
        Integer d = 123;
        
        System.out.println(c == d);
        System.out.println(c.intValue() == d.intValue());
        System.out.println(c.equals(d));

贪吃蛇

方向枚举:

public enum Direction {
    UP, RIGHT, DOWN, LEFT
}

蛇节点:

/**
 * 蛇节点
 * @author Kygo
 *
 */
public class SnakeNode {
    private int x;
    private int y;
    private int size;
    
    public SnakeNode(int x, int y, int size) {
        this.x = x;
        this.y = y;
        this.size = size;
    }
    
    public void draw(Graphics g) {
        g.fillRect(x, y, size, size);
        Color currentColor = g.getColor();
        g.setColor(Color.BLACK);
        g.drawRect(x, y, size, size);
        g.setColor(currentColor);
    }
    
    public int getX() {
        return x;
    }
    
    public int getY() {
        return y;
    }
    
    public int getSize() {
        return size;
    }
    
    public void setX(int x) {
        this.x = x;
    }
    
    public void setY(int y) {
        this.y = y;
    }
}

蛇类:

public class Snake {
    private List nodes;
    private Color color;
    private Direction dir;
    private Direction newDir;
    
    public Snake() {
        this(Color.GREEN);
    }
    
    public Snake(Color color) {
        this.color = color;
        this.dir = Direction.LEFT;
        this.nodes = new LinkedList<>();
        for (int i = 0; i < 5; i++) {
            SnakeNode node = new SnakeNode(300 + i * 20, 300, 20);
            nodes.add(node);
        }
    }
    
    public void move() {
        if (newDir != null) {
            dir = newDir;
            newDir = null;
        }
        SnakeNode head = nodes.get(0);
        int x = head.getX();
        int y = head.getY();
        int size = head.getSize();
        switch (dir) {
        case UP:
            y -= size;
            break;
        case RIGHT:
            x += size;
            break;
        case DOWN:
            y += size;
            break;
        case LEFT:
            x -= size;
            break;
        }
        SnakeNode newHead = new SnakeNode(x, y, size);
        nodes.add(0, newHead);
        nodes.remove(nodes.size() - 1);
    }
    
    public boolean eatEgg(SnakeNode egg) {
        if (egg.getX() == nodes.get(0).getX() && egg.getY() == nodes.get(0).getY()) {
            nodes.add(egg);
            return true;
        }
        return false;
    }
    
    public boolean die() {
        for (int i = 1; i < nodes.size(); i++) {
            if (nodes.get(0).getX() == nodes.get(i).getX() && nodes.get(0).getY() == nodes.get(i).getY()) {
                return true;
            }
        }
        return false;
    }
    
    public void draw(Graphics g) {
        g.setColor(color);
        for (SnakeNode snakeNode : nodes) {
            snakeNode.draw(g);
        }
    }
    
    public Direction getDir() {
        return dir;
    }
    
    public void setDir(Direction newDir) {
        if ((this.dir.ordinal() + newDir.ordinal()) % 2 != 0) {
            if (this.newDir == null) {
                this.newDir = newDir;   
            }       
        }
    }
}

贪吃蛇窗口:

public class SnakeGameFrame extends JFrame {
    private BufferedImage image = new BufferedImage(600, 600, 1);
    private Snake snake = new Snake();
    private SnakeNode egg = new SnakeNode(60, 60, 20);

    public SnakeGameFrame() {
        this.setTitle("贪吃蛇");
        this.setSize(600, 600);
        this.setResizable(false);
        this.setLocationRelativeTo(null);

        // 绑定窗口监听器
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                // Todo: 存档
                System.exit(0);
            }
        });
        // 绑定键盘事件监听器
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
                Direction newDir = null;
                switch (keyCode) {
                case KeyEvent.VK_W:
                    newDir = Direction.UP;
                    break;
                case KeyEvent.VK_D:
                    newDir = Direction.RIGHT;
                    break;
                case KeyEvent.VK_S:
                    newDir = Direction.DOWN;
                    break;
                case KeyEvent.VK_A:
                    newDir = Direction.LEFT;
                    break;
                }
                if (newDir != null && newDir != snake.getDir()) {
                    snake.setDir(newDir);
                }
            }
        });

        Timer timer = new Timer(200, e -> {
            snake.move();
            if (snake.eatEgg(egg)) {
                int x = (int) (Math.random() * 31) * 20;
                int y = (int) (Math.random() * 30 + 1) * 20;
                egg.setX(x);
                egg.setY(y);
            }
            if (snake.die()) {
                System.out.println("死了");
            }
            repaint();
        });
        timer.start();
    }

    @Override
    public void paint(Graphics g) {
        Graphics otherGraphics = image.getGraphics();
        super.paint(otherGraphics);
        snake.draw(otherGraphics);
        egg.draw(otherGraphics);
        g.drawImage(image, 0, 0, null);
    }

    public static void main(String[] args) {
        new SnakeGameFrame().setVisible(true);
    }
}

作业

  • 2.设计电话薄
    联系人
package com.kygo.book;
public class Contact {
    private String name;
    private String tel;
    
    public Contact(String name, String tel) {
        this.name = name;
        this.tel = tel;
    }

    public String getName() {
        return name;
    }

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

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }
    
    @Override
    public String toString() {
        return "姓名:" + name + "\n电话号码:" + tel;
    }
}

通讯录:

public class AddressBook {
    private List list = new ArrayList<>();
    
    public Contact query(String name) {
        for (Contact contact : list) {
            if (contact.getName().equals(name)) {
                return contact;
            }
        }
        return null;
    }   
public List queryAll() {
        return list;
    }
    public boolean add(Contact contact) {
        if (list.add(contact)) {
            return true;
        }
        return false;
    }
    
    public boolean remove(String name) {
        Contact contact = query(name);
        if (list.remove(contact)) {
            return true;
        }
        return false;
    }
    
    public boolean update(Contact contact, String name, String tel) {
        if (list.contains(contact)) {
            int index = list.indexOf(contact);
            list.get(index).setName(name);
            list.get(index).setTel(tel);
            return true;
        }
        else {
            return false;
        }
    }
}

测试:

        Scanner input = new Scanner(System.in);
        AddressBook addressBook = new AddressBook();
        boolean goOn = true;
        while (goOn) {
            System.out.println("欢迎使用通讯录: \n请选择你要使用的功能: \n" 
        + "1.查询\n2.添加\n3.修改\n4.删除\n5.查询所有\n6.退出");
            int choose = input.nextInt();
            if (1 <= choose && choose <= 6) {
                switch (choose) {
                case 1:
                {
                    System.out.print("请输入你要查询联系人的名字: ");
                    String name = input.next();
                    System.out.println(addressBook.query(name));
                    break;
                }
                case 2:
                {
                    System.out.print("请输入联系人名称: ");
                    String name = input.next();
                    System.out.print("请输入联系人电话: ");
                    String tel = input.next();
                    Contact contact = new Contact(name, tel);
                    if (addressBook.add(contact)) {
                        System.out.println("添加联系人成功!");
                    }
                    else {
                        System.out.println("添加联系人失败");
                    }
                    break;
                }
                case 3:
                {
                    System.out.print("请输入你要修改的联系人姓名: ");
                    String name = input.next();
                    if (addressBook.query(name) != null) {
                        System.out.print("请输入新名字: ");
                        String newName = input.next();
                        System.out.print("请输入新电话: ");
                        String newTel = input.next();
                        Contact contact = addressBook.query(name);
                        if (addressBook.update(contact, newName, newTel)) {
                            System.out.println("修改联系人成功!");
                        } else {
                            System.out.println("修改联系人失败");
                        } 
                    }
                    else {
                        System.out.println("没有这个联系人!");
                    }
                    break;
                }
                case 4:
                {
                    System.out.print("请输入你要删除联系人的名字: ");
                    String name = input.next();
                    if (addressBook.remove(name)) {
                        System.out.println("删除联系人成功!");
                    }
                    else {
                        System.out.println("删除联系人失败");
                    }
                    break;
                }
                case 5:
                {
                    List list = addressBook.queryAll();
                    for (Contact contact : list) {
                        System.out.println(contact);
                    }
                }
                case 6:
                    goOn = false;
                    break;
                }
            }
        }
        input.close();

你可能感兴趣的:(Java学习笔记 - 第017天)