Java学习笔记 - 第017天

每日要点

容器

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

Collection

  • List
  • ArrayList
  • LinkedList
  • Set

List

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

List<String> list = new ArrayList<String>();
List<String> 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<String> 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<Integer> 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<SnakeNode> 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<Contact> list = new ArrayList<>();
    
    public Contact query(String name) {
        for (Contact contact : list) {
            if (contact.getName().equals(name)) {
                return contact;
            }
        }
        return null;
    }   
public List<Contact> 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<Contact> list = addressBook.queryAll();
                    for (Contact contact : list) {
                        System.out.println(contact);
                    }
                }
                case 6:
                    goOn = false;
                    break;
                }
            }
        }
        input.close();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 933评论 0 1
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,346评论 0 6