Java基础语法(中)

数学类

数学类提供的一些常用方法:

  1. pow(x,y) 计算x的y次幂
  2. abs(x). 计算x的绝对值
  3. log(x). 计算以e为底x的对数, e是啥, 我只能告诉你e被称为欧拉数….
  4. max(x,y) 返回x, y中大的那个数
  5. min(x, y) 返回x,y中小的那个数
  6. round(x) x四舍五入
  7. sqrt(x) 计算x的开平方. 根号下x

数学类的其他方法传送门:https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html

package com.dylan.math;
public class Test {
    public static void main(String[] args) {
        System.out.println(Math.pow(3, 3)); // 3的3次方
        System.out.println(Math.abs(-12)); // 12
        System.out.println(Math.log(2)); // 以e为底, 2的对数
        System.out.println(Math.max(12, 33)); // 求大数   33
        System.out.println(Math.min(55, 33)); // 求小数  33
        System.out.println(Math.round(3.56789));  // 4 四舍五入
        System.out.println(Math.sqrt(3));  // 根号9  1.732
    }
}
  • 求解二元方程
package com.dylan.math;
import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入a:");
        double a = sc.nextInt();
        System.out.println("请输入b:");
        double b = sc.nextInt();
        System.out.println("请输入c:");
        double c = sc.nextInt();
        // 先判断b*b-4*a*c是否大于0 . 不大于0无解
        double dt = b*b - 4*a*c;
        if (dt < 0){
            System.out.println("此方程无解");
        } else if(dt == 0){
            System.out.println("此方程有一个解");
            double x = -b/(2*a);
            System.out.println("x = " + x);
        } else {
            System.out.println("此方程有两个解");
            double x1 = (-b+Math.sqrt(dt)) / (2*a);
            double x2 = (-b-Math.sqrt(dt)) / (2*a);
            System.out.println("x1 = "+x1 + ", x2 = "+x2);
        }
    }
}

Random类

import java.util.Random;

public class Test {
    public static void main(String[] args) {
        Random r = new Random(13); // 传入种子13
        // 随机产生10个[0, 100)之间的整数
        for(int i=0;i<1;i++){
            System.out.println(r.nextInt(100)); // 92
            System.out.println(r.nextInt());    // 1412442200
            System.out.println(r.nextDouble()); // 0.44461356134079055
            System.out.println(r.nextFloat()); // 0.051283896
            System.out.println(r.nextBoolean()); //true
        }
    }
}

基本数据类型包装类

基本类型 包装类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Charactor
boolean Boolean

除了int和char以外都是基本数据类型首字母大写. 很好记.

打包与解包

在java里, 基本数据类型是可以和包装类型进行无缝转换的.

Integer i = 1;  // 自动打包成Integer对象
int b = i; //  自动解包成int类型

基本数据类型包装类存在的意义:

  1. 让基本数据类型有了面向对象的特征.
  2. 可以把字符串转化成各种基本数据类型

基本数据类型转换

public class Test {
    public static void main(String[] args) {
        String a = "1";
        String b = "1";
        System.out.println(a+b); // 11  滑天下之大稽
        // 把字符串转化成int
        int c = Integer.parseInt(a);
        int d = Integer.parseInt(b);
        System.out.println(c + d); // 2 没毛病老铁
        //转化成double试试
        double e = Double.parseDouble(a);
        double f = Double.parseDouble(b);
        System.out.println(e+f);
    }
}

规律: 字符串->基本数据类型

基本数据类型包装类.parse基本数据类型()

Integer.parseInt();

Double.parseDouble();

Long.parseLong();

Boolean.parseBoolean();

都一样~

Integer in = new Integer(20);
System.out.println(in.toString()) // 将20转化为字符串"20"

Date类型

import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Date date1 = new Date();    // 获取当前时间对象
        Date date2 = new Date(9444442323L); // 获取1970年1月1日以来9444442323ms后的时间
        System.out.println(date1);
        System.out.println(date2);
    }
}

// Wed Jul 24 14:44:28 CST 2019
// Mon Apr 20 15:27:22 CST 1970

Calendar类

import java.util.Calendar;

public class Test {
    public static void main(String[] args) {
         Calendar calendar = Calendar.getInstance();
         int year = calendar.get(Calendar.YEAR);
         int month = calendar.get(Calendar.MONTH) + 1;
         int date = calendar.get(Calendar.DATE);
         int hour = calendar.get(Calendar.HOUR);
         int minute = calendar.get(Calendar.MINUTE);
         int second = calendar.get(Calendar.SECOND);
        System.out.println("当前时间为:"+year+"年"+month+"月"+date+"日"+hour+"时"+minute+"分"+second+"秒");
    }
}

// 当前时间为:2019年7月24日2时50分58秒
import java.util.Calendar;

public class Test {
    public static void main(String[] args) {
         Calendar calendar = Calendar.getInstance();
         calendar.set(2019,7,1);
         calendar.add(Calendar.DATE, 100);
         int year = calendar.get(Calendar.YEAR);
         int month = calendar.get(Calendar.MONTH + 1);
         int date = calendar.get(Calendar.DATE);
        System.out.println("100天后是"+year+"年"+month+"月"+date+"日");
    }
}

// 100天后是2019年45月9日

DateFormat类

import java.util.Calendar;
import java.util.Date;
import java.text.DateFormat;

public class Test {
    public static void main(String[] args) {
         Date date = new Date();
         // Full格式
        DateFormat fullFormat = DateFormat.getDateInstance(DateFormat.FULL);
        // Long模式
        DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG);
        // mediunm格式日期时间对象
        DateFormat mediumFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);
        // short格式日期时间对象
        DateFormat shortFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
        System.out.println(fullFormat.format(date));
        System.out.println(longFormat.format(date));
        System.out.println(mediumFormat.format(date));
        System.out.println(shortFormat.format(date));
    }
}

// 2019年7月24日星期三
// 2019年7月24日
// 2019年7月24日 下午3:00:52
// 2019/7/24 下午3:00

DecimalFormat类

我想保留小数点后两位怎么办? 就用这个叫DecimalFormat.

import java.text.DecimalFormat;
public class TestNumberFormat {
    public static void main(String[] args) {
        double d = 10/3.0;
        System.out.println(d);
        DecimalFormat df = new DecimalFormat(".00"); // 保留小数点后两位
        String s = df.format(d);
        System.out.println(s); // 3.33
    }
}

这一堆格式中, 我们只需要关注三个

0: 数字

#: 数字

. : 小数点

.00 和.## 是一样的.

字符串详解

String s1 = "胡辣汤";
String s2 = new String("狗不理");
public class TestString {
    public static void main(String[] args) {
        String s = "今天特别想吃哈密瓜";

        //charAt(int) 获取到字符串中某个位置的字符.  从0开始数
        System.out.println(s.charAt(0)); // 今
        System.out.println(s.charAt(4)); // 想

        // concat(String) 字符串拼接. 和+是一样的
        System.out.println(s.concat("伊丽莎白")); // 今天特别想吃哈密瓜伊丽莎白
        //今天特别想吃哈密瓜 深坑: 字符串是不可变的. 不论做什么操作, 原来的字符串不会发生改变, 每次操作都是返回一个新字符串
        System.out.println(s);

        // contains(String) 判断字符串中是否包含xxx
        System.out.println(s.contains("明天"));  // false
        System.out.println(s.contains("哈密瓜"));  // true

        // startswith(String) 判断字符串是否以xxxx开头
        // endswith(String) 判断字符串是否以xxxx结尾
        System.out.println(s.startsWith("今天"));  // true
        System.out.println(s.endsWith("哈密瓜"));  // true

        // equals(String)  判断两个字符串内容是否一致
        // equalsIgnoreCase(String)  判断两个字符串内容是否一致(忽略大小写)
        System.out.println("abc".equals("abc")); // true
        System.out.println("abc".equalsIgnoreCase("ABC")); // true

        // indexOf(String) 根据给定的字符串计算该字符串出现的位置 ->  从前向后
        // lastIndexOf(String) 根据给定的字符串计算该字符串出现的位置-> 从后向前
        System.out.println(s.indexOf("特别")); // 2
        System.out.println(s.lastIndexOf("哈密瓜")); // 6

        // isEmpty() 判断字符串是否是空字符串
        System.out.println("".isEmpty()); // true
        System.out.println("   ".isEmpty()); // false

        // length() 字符串的长度 -> 有多少个字符组成
        System.out.println(s.length());  // 9

        // replace(String, String)  把xxx替换成xxx
        String s1 = s.replace("今天", "昨天");
        System.out.println(s); // 今天特别想吃哈密瓜          没变~~~~ 字符串不可变哦
        System.out.println(s1);  // 昨天特别想吃哈密瓜        获得的新字符串

        // replaceFirst(String, String); 替换第一个
        String s2 = s.replace("天", "日");
        System.out.println(s2);  // 今日特别想吃哈密瓜

        // split(String)  字符串切割
        String[] strs = s.split("想吃");  // 使用"想吃"进行字符串切割. 切割的结果放在字符串数组中
        System.out.println(strs[0]);  // 今天特别
        System.out.println(strs[1]);  // 哈密瓜

        // subString(int, int)  字符串截取. 从xxx截取到xxx
        String s3 = s.substring(2, 4);
        System.out.println(s3);  // 特别

        // toUpperCase(); 转化成大写
        // toLowerCase(); 转化成小写
        String s4 = "abcDefGhIJKLMN";
        System.out.println(s4.toUpperCase());
        System.out.println(s4.toLowerCase());

        // trim(); 去掉左右两端的空格
        String s5 = "    哇哈哈哈哈     ";
        System.out.println(s5.trim()); //哇哈哈哈哈
    }
}

StringBuilder和StringBuffer

“我的妈呀”+”你的妈呀”+”谁的妈呀”+”怎么这么卡”. 在老的JDK中 每次相加都会产生一个新的字符串, 非常的浪费内存资源, 但是在新版本中, JDK对这里进行了优化. 每次+都是执行用的StringBuilder中的字符串拼接方法. 为什么呢? 因为StringBuilder是可以改变的字符串. 都在原来的基础上进行操作. 所以不会产生内存浪费. 接下来我们来看看这个叫StringBuilder的东西.

StringBuilder: 可变的字符串

用法:

public class TestStringBuilder {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder(); // 空的字符串.
        StringBuilder sb2 = new StringBuilder("王二麻子的麻子特别特别麻"); // 也可以给出具体的字符串. 都OK

        sb2.append(", 李二麻子的麻子就不是特别麻");  // 在后面追加
        System.out.println(sb2);  // 王二麻子的麻子特别特别麻, 李二麻子的麻子就不是特别麻

        sb2.append(123); //可以追加任何数据类型
        sb2.insert(3, "插入");// 还可以在中间插入
        System.out.println(sb2);  // 王二麻插入子的麻子特别特别麻, 李二麻子的麻子就不是特别麻123

        String s = sb2.toString(); // 转化回正常的普通字符串
        System.out.println(s);
    }
}

关于StringBuilder, 咱们就说这么多. 足够大家在平时使用了

StringBuffer和StringBuilder基本上一模一样. 区别是StringBuffer线程安全. StringBuilder线程不安全. 等到后面我们学到线程的时候, 在给大家说他俩的区别. 就目前而言. 你可以认为没区别..

容器

  • List
  • Set
  • Map

List

List和咱们以前学过的数组其实差不多. 不过List的优势是可以随意扩容. 多少数据都能装的下

List也有两个常用的实现类: ArrayList(重要), LinkedList.

先看重要的:

import java.util.ArrayList;
import java.util.List;
public class TestList {
    public static void main(String[] args) {
        ArrayList lst = new ArrayList();
        lst.add("狂战士");
        lst.add("狂战士");
        lst.add("剑圣");
        lst.add(123);
        lst.add("狱血魔神");
        lst.add("红豆");
        System.out.println(lst); // [狂战士, 狂战士, 剑圣, 123, 狱血魔神, 红豆]
    }
}

结论: 没有去掉重复. 没有打乱顺序.

再看这个不是特别重要的

import java.util.LinkedList;
import java.util.List;
public class TestList {
    public static void main(String[] args) {
        LinkedList lst = new LinkedList();
        lst.add("美团外卖");
        lst.add("饿了么");
        lst.add("百度外卖");
        lst.add("我不吃");
        lst.add("外卖");
        lst.add(2,"饭堂");
        lst.addFirst("北门");
        lst.addLast("南门");
        System.out.println(lst); // [美团外卖, 饿了么, 百度外卖, 我不吃, 外卖]
    }
}

List集合中定义的方法

add(int index, Object element) 作用
void add(int index, Object element) 在Index处添加元素
boolean addAll(int index, Collection c) 将集合c所包含的元素全部插入到List集合的index处
Object get(int index) 查看第i个元素
Object set(int index, Object element) 在index处替换元素
int size() 查看列表中的数据个数
boolean isEmpty() 判断是否是空列表
int indexOf(Object element) 查看元素在列表中的位置
int lastIndexOf(Object element) 查看元素在列表中最后一次出现的位置
boolean contains(Object element) 判断列表中是否包含某元素
List subList(int start, int end) 截取子串
Object remove(int index) 删除索引为index的元素
Object remove(Object element) 删除某元素
import java.util.ArrayList;
import java.util.List;
public class TestList {
    public static void main(String[] args) {
        List lst = new ArrayList();
        lst.add("美团外卖");
        lst.add("饿了么");
        lst.add("百度外卖");
        lst.add("我不吃");
        lst.add("外卖");
        System.out.println(lst); // [美团外卖, 饿了么, 百度外卖, 我不吃, 外卖]
        System.out.println(lst.get(0)); // 查询第0个元素
        System.out.println(lst.get(2)); // 查询第2个元素
        System.out.println(lst.size());  // 列表中元素的个数
        // 遍历出列表中所有的数据
        for(int i = 0 ; i < lst.size(); i++){
            System.out.println(lst.get(i));
        }
        // 判断列表是否是空列表
        System.out.println(lst.isEmpty()); // false 
        //查看"我不吃"元素在列表中的位置
        System.out.println(lst.indexOf("我不吃")); // 3 
        //查看最后一个"百度外卖"在列表中的位置
        System.out.println(lst.lastIndexOf("百度外卖")); // 2
        //判断是否包含饿了么
        System.out.println(lst.contains("饿了么")); // true
        //列表的截取, 从1截取到3  [1,3)区间
        System.out.println(lst.subList(1, 3)); //   [饿了么, 百度外卖]
        System.out.println(lst.toArray()); // 转化成数组
        lst.remove("外卖");  // 删除"外卖"
        lst.remove(2); // 删除索引为2的元素
    }
}

LinkedList中定义的方法

方法名 作用
void add(int index, Object element) 某位置插入元素
void addFirst(Object o) 将元素插入开头
void addLast(Object o) 将元素插入末尾
Object getFirst() 返回第一个元素
Object getLast() 返回最后一个元素
Object removeFirst() 移除并返回第一个元素
Object removeLast() 移除并返回最后一个元素
import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        LinkedList link = new LinkedList();
        link.add("stu1");
        link.add("stu2");
        link.add("stu3");
        link.add("stu4");
        System.out.println(link.toString());
        link.add(2,"Student");
        link.addFirst("First");
        link.addLast("Last");
        System.out.println(link);
        System.out.println(link.getFirst());
        System.out.println(link.getLast());
        link.remove(3);
        link.removeFirst();
        System.out.println(link);
    }
}

Iterator接口

方法名 作用
boolean hasNext() 判断是否存在下一个元素
Object next() 获取下一个元素
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        LinkedList link = new LinkedList();
        link.add("stu1");
        link.add("stu2");
        link.add("stu3");
        link.add("stu4");
        Iterator it = link.iterator();
        while (it.hasNext())
        {
            Object obj = it.next();
            System.out.println(obj);
        }
        /*
        foreach(Object obj:link)
        {
            System.out.println(obj);
        }
         */
    }
}

foreach遍历 (不能修改)

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        LinkedList link = new LinkedList();
        link.add("stu1");
        link.add("stu2");
        link.add("stu3");
        link.add("stu4");
        Iterator it = link.iterator();
        foreach(Object obj:link)
        {
            System.out.println(obj);
        }
    }
}

元素遍历删除

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        LinkedList link = new LinkedList();
        link.add("stu1");
        link.add("stu2");
        link.add("stu3");
        link.add("stu4");
        Iterator it = link.iterator();
        while(it.hasnext())
        {
            if("stu3".equals(obj))
            {
                it.remove();
                // 不可以用link.remove(obj)
            }
        }
    }
}

ListIterator迭代器

Iterator迭代器提供了 hasNext() 方法和 next() 方法

其为Iterator的子类, 在父类基础上增加了一些特有的方法

方法名 作用
void add(Object o) 插入元素
boolean hasPrevious() 逆向遍历
Object previous() 返回列表中的前一个元素
void remove() 从列表中移除由next或previous返回的最后一个元素
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

public class Test {
    public static void main(String[] args) {
        LinkedList link = new LinkedList();
        link.add("stu1");
        link.add("stu2");
        link.add("stu3");
        link.add("stu4");
        ListIterator it = link.listIterator(link.size());
        while(it.hasPrevious())
        {
            Object obj = it.previous();
            System.out.println(obj);
        }
    }
}

// stu4
// stu3
// stu2
// stu1

set

  • HashSet 瞎摆->存储的速度快,

  • TreeSet 按顺序摆->存储的时候帮你排序, 存储的速度就慢.

HashSet

当向 HashSet 集合中添加一个对象时, 首先会调用该对象的 hashCode()方法来确定元素的存储位置, 然后调用equals()方法来确保该位置没有重复元素

import java.util.HashSet;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        HashSet s = new HashSet();
        s.add("a");
        s.add("b");
        s.add("c");
        s.add("c");
        s.add("d");
        Iterator it = s.iterator();
        while(it.hasNext())
        {
            Object data = it.next();
            System.out.println(data);
        }
    }
}

重写 hashCode() 和 equals() 方法

public class Student {
    String id;
    String name;
    public Student(String id, String name)
    {
        this.id = id;
        this.name = name;
    }
    // 重写toString方法
    public String toString()
    {
        return id + ":" + name;
    }
    // 重写hashCode方法
    public int hashCode()
    {
        return id.hashCode();
    }
    // 重写equals方法
    public boolean equals(Object obj)
    {
        if(this == obj)
        {
            return true;
        }
        if(!(obj instanceof Student))
        {
            return false;
        }
        Student stu = (Student) obj;
        boolean b = this.id.equals(stu.id);
        return b;
    }
}
import java.util.HashSet;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        Student s1 = new Student("1", "Jack");
        Student s2 = new Student("2", "Rose");
        Student s3 = new Student("2", "Rose");
        hs.add(s1);
        hs.add(s2);
        hs.add(s3);
        System.out.println(hs);
    }
}

// [1:Jack, 2:Rose]

TreeSet

import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        TreeSet s = new TreeSet();
        s.add("a");
        s.add("b");
        s.add("c");
        s.add("c");
        s.add("d");
        Iterator it = s.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
}

实现Comparable接口

import java.util.*;

public class Student implements Comparable {
    String name;
    int age;
    public Student(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    public String toString()
    {
        return name + ":" + age;
    }
    // 先按照年龄升序排列, 再按姓名升序排列
    public int compareTo(Object obj)
    {
        Student s = (Student)obj;
        if(this.age - s.age > 0)
        {
            return 1;
        }
        if(this.age - s.age == 0)
        {
            return this.name.compareTo(s.name); // 调用String中的compareTo方法
        }
        return -1;
    }
}
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add(new Student("Jack", 19));
        ts.add(new Student("Rose", 18));
        ts.add(new Student("Tom", 19));
        ts.add(new Student("Rose", 18));
        ts.add(new Student("Amy", 18));

        Iterator it = ts.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
}

// Amy:18
// Rose:18
// Jack:19
// Tom:19

自定义比较器

import java.util.Comparator;

public class MyComparator implements Comparator {
    public int compare(Object obj1, Object obj2)
    {
        String s1 = (String)obj1;
        String s2 = (String)obj2;
        return s1.length() - s2.length();
    }
}
import java.util.Iterator;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet(new MyComparator());
        ts.add("Jack");
        ts.add("Amy");
        ts.add("Helena");

        Iterator it = ts.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
}

// Amy
// Jack
// Helena

Set的常用方法:

  1. add() 添加元素
  2. remove() 删除元素
  3. size() 集合中元素的个数
  4. contains() 判断是否包含了xxxx
import java.util.HashSet;
import java.util.Set;
public class TestSet2 {
    public static void main(String[] args) {
        Set s = new HashSet();
        s.add("饮血剑");
        s.add("绿叉");
        s.add("无尽之刃");
        System.out.println(s); //[绿叉, 无尽之刃, 饮血剑]
        s.remove("绿叉"); // 删除绿叉
        System.out.println(s.size()); // 2
        System.out.println(s.contains("无尽之刃")); // true
    }
}

Map

Map常见的实现类也有两个, 一个是HashMap(常用), 另一个TreeMap.

map常用方法

方法名 作用
void put(Object key, Object value) 插入
Object get(Object key) 获取
boolean containsKey(Object key) 判断是否包含某key
boolean containsValue(Object value) 判断是否包含某value
Set KeySet() 返回键的 Set 视图
Collection<v> values()</v> 返回值的 Collection 视图
Set<Map, Entry<K, V>> entrySet() 返回映射关系的 Set 视图
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("1", "Jack");
        map.put("2", "Rose");
        map.put("3", "Lucy");
        map.put("3", "Mary"); // 覆盖前一个
        System.out.println(map);

        Set keySet = map.keySet(); // 获取键的集合
        Iterator it = keySet.iterator();
        while(it.hasNext())
        {
            Object key = it.next();
            Object value = map.get(key);
            System.out.println(key + ":" + value);
        }
    }
}

// {1=Jack, 2=Rose, 3=Mary}
// 1: Jack
// 2: Rose
// 3: Mary

第二种遍历方式

import java.util.*;
public class TestIter {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("浪里白条", "张顺");
        map.put("及时雨", "松江");
        map.put("行者", "悟空");
        Iterator it = map.entrySet().iterator(); // 拿到map内部的entry
        while(it.hasNext()){
            Map.Entry entry = (Map.Entry) it.next();
            System.out.println(entry.getKey()+"=>"+entry.getValue());
        }
    }
}

LinkedHashMap

import java.util.*;

public class Test {
    public static void main(String[] args) {
        LinkedHashMap map = new LinkedHashMap();
        map.put("1", "Jack");
        map.put("2", "Rose");
        map.put("3", "Lucy");
        map.put("3", "Mary"); // 覆盖前一个
        System.out.println(map);

        Set keySet = map.keySet();
        Iterator it = keySet.iterator();
        while(it.hasNext())
        {
            Object key = it.next();
            Object value = map.get(key);
            System.out.println(key + ":" + value);
        }
    }
}

// {1=Jack, 2=Rose, 3=Mary}
// 1: Jack
// 2: Rose
// 3: Mary

TreeMap

import java.util.*;

public class Test {
    public static void main(String[] args) {
        TreeMap map = new TreeMap();
        map.put("1", "Jack");
        map.put("2", "Rose");
        map.put("3", "Lucy");
        map.put("3", "Mary"); // 覆盖前一个
        System.out.println(map);

        Set keySet = map.keySet();
        Iterator it = keySet.iterator();
        while(it.hasNext())
        {
            Object key = it.next();
            Object value = map.get(key);
            System.out.println(key + ":" + value);
        }
    }
}

// {1=Jack, 2=Rose, 3=Mary}
// 1: Jack
// 2: Rose
// 3: Mary

自定义比较器

import java.util.Comparator;

public class MyComparator implements Comparator {
    public int compare(Object obj1, Object obj2)
    {
        String id1 = (String)obj1;
        String id2 = (String)obj2;
        return id2.compareTo(id1); // 降序排列
    }
}
import java.util.*;

public class Test {
    public static void main(String[] args) {
        TreeMap map = new TreeMap(new MyComparator());
        map.put("1", "Jack");
        map.put("2", "Rose");
        map.put("3", "Lucy");
        map.put("3", "Mary"); // 覆盖前一个
        System.out.println(map);

        Iterator it = map.keySet().iterator();
        while(it.hasNext())
        {
            Object key = it.next();
            Object value = map.get(key);
            System.out.println(key + ":" + value);
        }
    }
}

// {3=Mary, 2=Rose, 1=Jack}
// 3:Mary
// 2:Rose
// 1:Jack

常用操作:

  1. 相同的key会把前面保存的数据顶掉.
  2. get(key) 使用key查询value
  3. isEmpty() 判断Map是否是空的
  4. size() 返回key, value键值对的个数
  5. containsKey(key) 判断是否存在key
  6. remove(key) 根据key删除信息
  7. keySet() 获取到map中key的集合set
import java.util.HashMap;
import java.util.Map;
public class TestMap {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("q", "冲啊");
        map.put("w", "打不动我吧!!!");
        map.put("e", "爱的魔力转转圈");
        map.put("r", "德玛西亚!!!!");
        System.out.println(map);  // {q=冲啊, r=德玛西亚!!!!, e=爱的魔力转转圈, w=打不动我吧!!!}
        map.put("w", "我挡!!");  // w被顶掉了
        System.out.println(map);  //  {q=冲啊, r=德玛西亚!!!!, e=爱的魔力转转圈, w=我挡!!}
        System.out.println(map.get("q"));  //冲啊
        System.out.println(map.isEmpty()); // 是不是空的   false
        System.out.println(map.size()); // map里有多少key,value     4
        System.out.println(map.containsKey("r")); // 是否包含了xxxkey  true
        map.remove("e"); //  删除key为e的键值对
        System.out.println(map); // {q=冲啊, r=德玛西亚!!!!, w=我挡!!}
        System.out.println(map.keySet());  // 获取到所有的key的set集合  [q, r, w]
    }
}

容器的泛型

规范容器的类型

import java.util.ArrayList;
import java.util.List;
public class TestParadigm {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(); // 强制规定这个列表只能装字符串
//        list.add(1);// 报错. 只能装字符串
        list.add("NB"); // OK
        // 好处是, 从list中获取到的数据不需要强转了.
        String s = list.get(0) ;// 这个列表只能装字符串, 拿出来也一定是字符串
        System.out.println(s);
    }
}

创建一个只能装歌手的列表

import java.util.ArrayList;
import java.util.List;
public class TestParadigm {
    public static void main(String[] args) {
        List<Singer> singerList = new ArrayList<Singer>();  // 只能装歌手
        Singer singer = new Singer();
        singerList.add(singer); // 添加歌手
        Singer ss = singerList.get(0); // 查询歌手
        System.out.println(ss);
    }
}

Set集合和List的泛型是一样的. 强制规定集合中元素的类型

Map集合的泛型比较特殊. 因为这个鬼东西里面有key和value.两项内容.

import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestParadigm {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("萝莉", "小蔡");
        map.put("御姐", "苏打强");
//        map.put(1, 2) ; // 报错, 只能是字符串
        String v = map.get("萝莉");
        System.out.println(v);
    }
}

OK. 泛型的语法咱们明白了. 那这玩意有什么用呢?

规范集合. 存储数据方便. 不再需要强转了. 在以后的代码中, 如果没有特殊要求. 还是给出泛型比较好.

自定义泛型

public class CachePool<T> {
    T temp;
    public void save(T temp)
    {
        this.temp = temp;
    }
    public T get()
    {
        return this.temp;
    }
}
import java.util.*;

public class Test {
    public static void main(String[] args) {
        CachePool<Integer> pool = new CachePool<Integer>();
        pool.save(new Integer(1));
        Integer temp = pool.get();
        System.out.println(temp); // 1
    }
}

Collections 工具类

在java中提供了Collections工具类来帮助我们去操作 List 集合类.

方法名 作用
static boolean addAll(Collection c, Object elements) 添加多个元素
static void reverse(List list) 反转
satic void shuffle(List list) 洗牌
static void sort(List list) 排序
static void swap(List list, int i,int j) 交换
static int binarySearch(List list, Object key) 二分法查找
static Object max(Collection col) 返回最大值
static Object min(Collection col) 返回最小值
static boolean replaceAll(List list, Object oldVal, Object newVal) 一个新值替换所有旧值
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
    public static void main(String[] args) {
        List<Integer> lst = new ArrayList<Integer>();
        lst.add(123);
        lst.add(321);
        lst.add(147);

        Collections.sort(lst);   // 排序
        System.out.println(lst);

        Collections.shuffle(lst); // 打乱顺序
        System.out.println(lst);

        Collections.sort(lst);  // 重新排序
        Collections.reverse(lst); // 翻转
        System.out.println(lst);

        int max = Collections.max(lst); // 最大值
        int min = Collections.min(lst); // 最小值
        System.out.println(max);
        System.out.println(min);

        Collections.addAll(lst,-3, 2, 8, 8, 8); // 添加
        System.out.println(lst);

        Collections.replaceAll(lst, 8, 0); // 替换
        System.out.println(lst);

    }
}

Arrays工具类

void Arrays.sort(array); // 数组排序
int index Arrays.binarySearch(Object[] a, Object key); // 查找某元素的下标, 返回索引
Object[] Arrays.copyOfRange(int[] original, int from, int to); // 拷贝数组
void Arrays.fill(Object[] a, Object val); // 填充数组中全部元素
String Arrays.toString(int[] arr); // 将数组转化为字符串
import java.util.*;

public class Test {
    public static void main(String[] args) {
        int []arr = {9, 8, 3, 5, 2};

        // 排序
        Arrays.sort(arr);

        // 查找
        int index = Arrays.binarySearch(arr, 3);

        // 拷贝, 多余的用0填充
        int[] copy = Arrays.copyOfRange(arr, 1, 7);

        // 填充
        Arrays.fill(arr, -1);

        // 转化为字符串
        System.out.println(Arrays.toString(arr));
    }
}

IO文件

  • 字节流
    • java.io.InputStream
    • java.io.OutputStream
  • 字符流
    • java.io.Reader
    • java.io.Writer

InputStream常用方法

方法名 作用
int read() 读入一个字节, 将其转化为0-255之间的整数, 并返回
int read(byte[] b) 读入若干字节, 将它们保存到参数b指定的字节数组中, 返回读取的字节数
int read(byte[] b, int off, int len) 读取若干字节, 将他们保存到参数b指定的数组中, off起始下标, len表字节数
void close() 关闭此输入流并释放与该流关联的所有系统资源

OutputStream常用方法

方法名 作用
void write(int b) 写入一个字节
void write(byte[] b) 将b的所有字节写到输出流中
void write(byte[] b,int off,int len) 指定byte数组中从偏移量off开始的len个字节写入输出流
void flush() 刷新输出流并强制写出所有缓冲的输出字节
void close() 关闭此输入流并释放与该流关联的所有系统资源

FileInputStream 和 FileOutputStream

  • 读入
    import java.io.*;
    

public class Test {
public static void main(String[] args) throws Exception{
FileInputStream in = new FileInputStream("C:\Users\Dylan\Desktop\test.txt");
int b = 0;
while(true)
{
b = in.read();
if(b == -1)
{
break;
}
System.out.println(b);
}
in.close();
}
}

// 105
// 116
// 99
// 97
// 115
// 116

- 输出
```java
import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception{
//        FileInputStream in = new FileInputStream("C:\\Users\\Dylan\\Desktop\\test.txt");
        FileOutputStream out = new FileOutputStream("C:\\Users\\Dylan\\Desktop\\temp.txt");
        String str1 = "中国";
        byte[] b1 = str1.getBytes("utf-8"); // 转化为字节数组 gbk一个汉字2字节, utf-8一个汉字3字节
        System.out.println(b1.length); // 6

        String str2 = "China";
        byte[] b2 = str2.getBytes("gbk"); // 转化为字节数组 gbk一个英文1字节, utf-8一个英文1字节
        System.out.println(b2.length); // 5

        for(int i=0;i<b2.length;i++)
        {
            out.write(b2[i]);
        }
        out.close();
    }
}
  • 追加
    import java.io.*;
    

public class Test {
public static void main(String[] args) throws Exception {
FileOutputStream out = new FileOutputStream("example.txt", true); // 第二个参数表追加
String str = "欢迎您";
byte[] b = str.getBytes("gbk");
for(int i=0;i<b.length;i++)
{
out.write(b[i]);
}
out.close();
}
}

- 文件拷贝

```python
import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception {
        FileInputStream in = new FileInputStream("C:\\Users\\Dylan\\Desktop\\test.jpg");
        FileOutputStream out = new FileOutputStream("C:\\Users\\Dylan\\Desktop\\test_new.jpg");
        int b;
        long begintime = System.currentTimeMillis();
        while ((b = in.read()) != -1)
        {
            out.write(b);
        }
        long endtime = System.currentTimeMillis();
        System.out.println("拷贝文件所需要的时间是: " + (endtime-begintime) / 1000.0 +"秒");

        in.close();
        out.close();
    }
}
// 拷贝文件所需要的时间是: 0.387秒
  • 字节流的缓冲区
import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception {
        FileInputStream in = new FileInputStream("C:\\Users\\Dylan\\Desktop\\test.jpg");
        FileOutputStream out = new FileOutputStream("C:\\Users\\Dylan\\Desktop\\test_new.jpg");

        byte[] buff = new byte[1024];
        int len; // 记录读入缓冲区的大小
        long begintime = System.currentTimeMillis();
        while((len=in.read(buff)) != -1)
        {
            out.write(buff,0,len); // 从第一个字节开始, 写入len个字节
        }
        long endtime = System.currentTimeMillis();
        System.out.println("拷贝文件所需要的时间是: " + (endtime-begintime) / 1000.0 +"秒");

        in.close();
        out.close();
    }
}
// 拷贝文件所需要的时间是: 0.001秒
  • 装饰设计模式
public class Car {
    private String carName;
    public Car(String carName)
    {
        this.carName = carName;
    }
    public void show()
    {
        System.out.println("我是" + carName + ", 具有基本功能");
    }
}
public class RadarCar {
    public Car myCar;
    public RadarCar (Car myCar)
    {
        this.myCar = myCar;
    }
    public void show()
    {
        myCar.show();
        System.out.println("具有雷达功能");
    }
}
public class Test {
    public static void main(String[] args) {
        Car benz = new Car("Benz");
        System.out.println("--------------包装前--------------");
        benz.show();
        RadarCar decoratedCar_benz = new RadarCar(benz);
        System.out.println("--------------包装后--------------");
        decoratedCar_benz.show();
    }
}

// --------------包装前--------------
// 我是Benz, 具有基本功能
// --------------包装后--------------
// 我是Benz, 具有基本功能
// 具有雷达功能
  • 字符缓冲流
    • BufferedInputStream
    • BufferedOutputStream
    • 两者都使用装饰设计模式, 构造方法接收InputStream和OutputStream对象
import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception{
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src.txt"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("dsc.txt"));
        int len;
        while((len=bis.read()) != -1)
        {
            bos.write(len);
        }
        bis.close();
        bos.close();
    }
}

FileReader 和 FileWriter

import java.io.*;

public class Test {
    public static void main(String[] args) throws Exception{
       FileReader reader = new FileReader("C:\\Users\\Dylan\\Desktop\\test.txt");
       int ch;
       while ((ch=reader.read()) != -1)
       {
           System.out.println(ch);  // 输出字符的十进制数字
           System.out.println((char)ch); // 输出字符
       }
       reader.close();
    }
}