Java(十六)

知识点一:常用类的扩展

1.时间类

1)Date

缺点:显示不友好,年有1990问题,月是少1

@Test
    public void test1() throws ParseException {
        long time = System.currentTimeMillis(); // 当前时间, 以1970-01-01 00:00:00.000为0, 距离当前时间的毫秒数
        System.out.println(time);
        Date date = new Date();
        System.out.println(date);
        //时间格式化器
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(date);
        System.out.println(format);

        String string = "1972-05-12 12:33:50";
        Date parse = simpleDateFormat.parse(string); // 解析转换字符串为日期对象
        System.out.println(parse);

        System.out.println(simpleDateFormat.format(time));

        Date date2 = new Date(2008, 8, 8);
        System.out.println(simpleDateFormat.format(date2));
    }

测试:写一个小时钟

import java.text.SimpleDateFormat;
import java.util.Date;

public class Clock {
	
	public static void main(String[] args) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		while (true) {
			//java.util.Date date = new java.util.Date();
			long l = System.currentTimeMillis();
			//System.out.print("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" + sdf.format(l));
			System.out.print("\r" + sdf.format(l));
		}
	}
}
2)Calender

缺点 : 显示不友好, 月有小1, 内部用数组保存数据不好. 致命缺点: 内容可以改变, 不好.

@Test
    public void test2() {
        Calendar calendar = Calendar.getInstance(); //new Calendar(); // 不能直接new对象的时候.
        System.out.println(calendar);
        //int year = calendar.getYear();
        int year = calendar.get(Calendar.YEAR); // 获取年
        int month = calendar.get(Calendar.MONTH); // 存储的月比实际要小1
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        System.out.println(year);
        System.out.println(month);
        System.out.println(day);

        // 设置为1992,10,22
        calendar.set(Calendar.YEAR, 1992);
        calendar.set(Calendar.MONTH, 9);
        calendar.set(Calendar.DAY_OF_MONTH, 22);

        System.out.println(calendar.getTime()); // 转换成date对象

        calendar.add(Calendar.MONTH, 10); // 10个月后

        System.out.println(calendar.getTime());

        calendar.add(Calendar.DAY_OF_MONTH, -500); // 500天以前

        System.out.println(calendar.getTime());
    }

测试:// 创建Calendar对象, 设置为你的生日, 再推算你的百日.

@Test
    public void exer() {
        Calendar calendar = Calendar.getInstance();
        // 1978,6,9
        calendar.set(Calendar.YEAR, 1978);
        calendar.set(Calendar.MONTH, 5);
        calendar.set(Calendar.DAY_OF_MONTH, 9);

        System.out.println(calendar.getTime());

        calendar.add(Calendar.DAY_OF_MONTH, 100);

        System.out.println(calendar.getTime());
    }
3)LocalDate、LocalTime、LocalDateTime
java8中的日期, 显示友好, 数据没问题, 内容不可改变.
@Test
    public void test3() {
        LocalDate date = LocalDate.now();//new LocalDate();
        System.out.println(date);
        int year = date.getYear();
        int month = date.getMonthValue();
        int day = date.getDayOfMonth();
        System.out.println("year = " + year);
        System.out.println("month = " + month);
        System.out.println("day = " + day);

        // 1995, 10, 5
        /*
        LocalDate localDate1 = date.withYear(1995); // 伴随新的年产生新的对象
        LocalDate localDate2 = localDate1.withMonth(10); // 伴随新的月产生新的对象
        LocalDate localDate3 = localDate2.withDayOfMonth(5);
        */
        LocalDate localDate1 = date.withYear(1995).withMonth(10).withDayOfMonth(5);
        System.out.println(localDate1);
        // 推算日期
        LocalDate localDate4 = localDate1.minusDays(-200);

        System.out.println(localDate4);
    }
创建LocalDate对象, 设置为你的生日, 再推算你的百日.
 @Test
    public void exer2() {
        // 1978,6,9
        System.out.println(LocalDate.now().withYear(1978).withMonth(6).withDayOfMonth(9).plusDays(100));
    }

2.数学类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9V6EZcke-1625912216496)(C:\Users\86156\AppData\Roaming\Typora\typora-user-images\1625909908523.png)]

package com.atguigu.math;

import org.junit.Test;

import java.math.BigDecimal;
import java.math.BigInteger;

public class MathTest {

    @Test
    public void test2() {
        BigInteger bi1 = new BigInteger("234239423084720834729387429837429834293847239847239847239874239847203982093850285092859028509280958230982095820395820938509285092385098235098235");
        BigInteger bi2 = new BigInteger("134234234234234234234239423084720834729387429837429834293847239847239847239874239847203982093850285092859028509280958230982095820395820938509285092385098235098235");
        BigInteger multiply = bi1.multiply(bi2);
        System.out.println(multiply);

        BigDecimal bd1 = new BigDecimal("293842398472874208348273.239842394823482734829374927349827492873498274928734928374987234234234");
        BigDecimal bd2 = new BigDecimal("293842392342342348472874208348273.23234234234234234234239842394823482734829374927349827492873498274928734928374987234234234");
        BigDecimal add = bd1.add(bd2);
        System.out.println(add);

    }

    @Test
    public void test1() {
        System.out.println(Math.random());
        System.out.println((int)(Math.random() * 100));

        System.out.println(Math.round(9.5));
        System.out.println(Math.round(-9.5));
        System.out.println(Math.round(-9.6));

        System.out.println(0x7FFFFFFFFFFFFFFFL); // 0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
    }
}

知识点二:集合

1.理解

* 数组 : 解决批量数据的存储问题
* 集合 : 解决批量对象的存储问题, 可以简单把集合看成是一个可变长的Object数组, Object意味着任意对象都可以保存

2.Collection接口

表示的集合只能保存一个一个的对象。特点:无序可重复!!

无序:不按添加顺序保存元素;

可重复:内容相等的元素可以重复放入(个人理解,暂时只会把所传入的实体内容认为是内容相等,因为不会把声明同时两个相同的对象来用)

1)Set子接口

特点:无序不可重复

①HashSet子类:使用使用哈希算法实现的Set集合

重复的标准:两个对象的equals为true,并且两个对象的HashCode相等。

②TreeSet子类:基于二叉树实现的Set集合

boolean add(Object obj); 添加一个元素到集合中, 返回真假
*      boolean contains(Object obj); 测试当前集合中是否已经包含了某个元素
*      boolean remove(Object obj); 从当前集合中删除指定的元素, 返回真假
*      int size(); 获取集合中的元素个数
class Student {

    private int id;
    private String name;
    private int grade;
    private double score;

    public Student() {}

    public Student(int id, String name, int grade, double score) {
        this.id = id;
        this.name = name;
        this.grade = grade;
        this.score = score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", grade=" + grade +
                ", score=" + score +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id &&
                grade == student.grade &&
                Double.compare(student.score, score) == 0 &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, grade, score);
    }
}
 @Test
    public void testSet2() {
        Set set = new HashSet();
        Student s1 = new Student(1, "小明", 3, 50);
        Student s2 = new Student(2, "小丽", 2, 90);
        Student s3 = new Student(1, "小明", 3, 50);

        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s2); // 完全同一个对象, 即使不重写equals和hashCode也会去重.

        for (Object tmp : set) {
            System.out.println(tmp);
        }
    }

@Test
    public void testSet() {
        Set set = new HashSet(); // 无序不可重复
        set.add("abc");
        set.add("QQQ");
        set.add(new Integer(200));
        set.add(new Student(1, "小明", 5, 80));
        boolean b0 = set.add(100); // set.add(Integer.valueOf(100));
        System.out.println(b0);
        boolean b1 = set.add(200); // 会被去重
        boolean b2 = set.add("abc");
        System.out.println("b1 = " + b1);
        System.out.println("b2 = " + b2);
        System.out.println(set.size());
        System.out.println(set.contains(100)); // 判断是否包含某元素
        System.out.println(set.remove("bbb")); // 删除失败时返回false
        System.out.println(set);
        /*
        for (元素数据类型 临时变量 : 数组或集合) {
            访问 临时变量
        }*/
        System.out.println("**************************");
        for (Object tmp : set) {
            System.out.println(tmp);
        }

    }
1.创建一个集合,保存102.保证十个

解析:

可以使用①set.size() != 10

②!set.add(rand){ 

​	i--

}

③set.add(rand){

​	i++;

}

3.十个不相同
// 创建一个Set集合, 保存10个20以内的随机整数, 遍历
    @Test
    public void exer1() {
        Set set = new HashSet();
        for (int i = 0; i < 10; i++) {
            int rand = (int)(Math.random() * 20);
            set.add(rand);
        }
        for (Object tmp : set) {
            System.out.println(tmp);
        }
    }
    // 创建一个Set集合, 保存10个20以内的随机整数, 保证10个. 遍历
    @Test
    public void exer12() {
        Set set = new HashSet();
        while (set.size() != 10) {
            int rand = (int)(Math.random() * 20);
            set.add(rand);
        }
        for (Object tmp : set) {
            System.out.println(tmp);
        }
    }

    @Test
    public void exer13() {
        Set set = new HashSet();
        for (int i = 0; i < 10; i++) {
            int rand = (int)(Math.random() * 20);
            if (!set.add(rand)) {
                i--;
            }
        }

        for (Object tmp : set) {
            System.out.println(tmp);
        }
    }

    @Test
    public void exer14() {
        Set set = new HashSet();
        for (int i = 0; i < 10;) {
            int rand = (int)(Math.random() * 20);
            if (set.add(rand)) {
                i++;
            }
        }

        for (Object tmp : set) {
            System.out.println(tmp);
        }
    }
2)List子接口

特点:有序可重复

①ArrayList子类:基于数组实现的List集合

②LinkedList子类:基于链表实现的List集合

void add(int index, Object ele) 在指定的index下标处插入新元素
*          Object get(int index) 获取指定的index下标处的元素
*          Object remove(int index) 删除指定的index下标处的元素并返回元素
*          Object set(int index, Object ele) 替换指定的index下标处的元素为新ele元素, 被替换的老元素作为返回值返回
*
@Test
    public void testList() {
        List list = new ArrayList(); // 有序可重复
        list.add("ccc");
        list.add(new Integer(500));
        list.add(200);
        list.add(false);
        list.add(new Student(2, "小丽", 2, 50));
        list.add(200);

        System.out.println(list);
        list.add(3, "yyy"); // 插入
        list.set(0, "ZZZ"); // 替换
        System.out.println(list);
        Object o = list.get(0);
        System.out.println(o);
        System.out.println("*************************************");
        // 可以使用经典for, 因为它像数组
        for (int i = 0; i < list.size(); i++) {
            Object o1 = list.get(i);
            System.out.println(o1);
        }
        list.add(2);
        list.add(1);

        list.remove(2); // 优先当成下标来使用
        list.remove(Integer.valueOf(2));

        System.out.println(list);

    }

测试:创建一个List集合, 保存10个20以内的随机整数, 不要重复. 遍历

@Test
    public void exer22() {
        List list = new ArrayList();
        for (int i = 0; i < 10; i++) {
            int rand = (int)(Math.random() * 20);
            if (list.contains(rand)) {
                i--;
                continue;
            }
            list.add(rand);
        }
        // 遍历
        for (Object tmp : list) {
            System.out.println(tmp);
        }
    }

    @Test
    public void exer23() {
        List list = new ArrayList();
        while (list.size() != 10) {
            int rand = (int)(Math.random() * 20);
            if (!list.contains(rand)) {
                list.add(rand);
            }
        }
        // 遍历
        for (Object tmp : list) {
            System.out.println(tmp);
        }
    }

    @Test
    public void exer24() {
        List list = new ArrayList();
        for (int i = 0; i < 10;) {
            int rand = (int)(Math.random() * 20);
            if (!list.contains(rand)) {
                list.add(rand);
                i++;
            }
        }
        // 遍历
        for (Object tmp : list) {
            System.out.println(tmp);
        }
    }

Map接口,表示的集合保存的一对一对的对象

知识点三:二叉树

二叉树作为链表里面的另外一种情况,其和链表差不多的形式,只不过是二叉树是由一个根节点root,以及它的左子树和右子树,而左子树和右子树可能又作为其他子树的根节点。

内存解析了解一下:

package com.atguigu.collection;

class TreeNode {
    int value;
    TreeNode left;
    TreeNode right;
}

class Tree {

    TreeNode root;

    public void insert(TreeNode target, TreeNode newNode) {
        if (newNode.value < target.value) { // 向左走
            if (target.left == null) { // 左子为空, 新结点直接插入
                target.left = newNode;
            } else { // 左子非空, 把左子作为根当成子树进一步插入
                insert(target.left, newNode);
            }
        } else { // 向右走
            if (target.right == null) {
                target.right = newNode;
            } else {
                insert(target.right, newNode);
            }
        }
    }

    public void add(int val) {
        TreeNode newNode = new TreeNode();
        newNode.value = val;
        if (root == null) {
            root = newNode;
        } else {
            insert(root, newNode);
        }
    }

    public void view(TreeNode node) {
        if (node == null) {
            return;
        }
        view(node.left);
        System.out.println(node.value);
        view(node.right);
    }

    public void travel() {
        view(root);
    }
}


public class TreeTest {

    public static void main(String[] args) {
        Tree tree = new Tree();
        tree.add(10);
        tree.add(20);
        tree.add(5);
        tree.add(3);
        tree.add(30);
        tree.add(18);
        tree.add(15);
        tree.add(1);

        tree.travel();

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值