常用API

date

  1. // System.exit(0);//强制退出java程序非0是异常结束
  2. //long l = System.currentTimeMillis();//返回当前时间与1970年子午夜交替毫秒值
  3. // Date date = new Date();//返回具体日期时间
  4. // DateFormat dateInstance = DateFormat.getDateInstance();//获取日期格式
  5. // DateFormat dateTimeInstance = DateFormat.getDateTimeInstance();//获取具体日期时间
  6. // String s = dateInstance.format(date);
  7. // String s1 = dateTimeInstance.format(date);
  8. // System.out.println(s);
  9. // System.out.println(s1);
  10. String s="2020/4/4 22:22:22";
  11. //编写对应日期格式,将字符串日期转换为日期格式
  12. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  13. Date parse = simpleDateFormat.parse(s);
  14. System.out.println(parse);

math

  1. int abs = Math.abs(-5);
  2. Math.sqrt(1000.0);
  3. Math.max(1000,2000);
  4. Math.min(1000,2000);
  5. Math.round(1000.6f);
  6. Math.random();
  7. Random random = new Random();
  8. int i = random.nextInt(100);
  9. System.out.println(i);

BigInteger类

  1. BigInteger b1 = new BigInteger("6666666666");
  2. BigInteger b2 = new BigInteger("2222222222");
  3. //加、减、乘、除、取模
  4. System.out.println(b1.add(b2));
  5. System.out.println(b1.subtract(b2));
  6. System.out.println(b1.multiply(b2));
  7. System.out.println(b1.divide(b2));
  8. System.out.println(b1.remainder(b2));

BigDecimal类

  1. BigDecimal b3 = new BigDecimal("15.3");
  2. BigDecimal b4 = new BigDecimal("3.0");
  3. System.out.println(b3.divide(b4,5,BigDecimal.ROUND_HALF_UP));
  4. //除法除不尽可以在后面加,保留几位小数 ,属性(四舍五入)

克隆技术

类要实现克隆,需要做两步:

  1. 实现Cloneable接口;
  2. 重写Object的clone方法。Timer定时器

    1. Timer timer = new Timer();
    2. TimerTask task = new TimerTask() {
    3. public void run() {
    4. System.out.println("定时任务被执行了");
    5. }
    6. };
    7. //一段时间后执行定时任务
    8. timer.schedule(task,2000);
    9. //在具体时间执行任务
    10. timer.schedule(task,new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse("2020/5/18 14:56:10"));
    11. //在一段时间后执行任务,并且每隔多久执行一次
    12. timer.schedule(task,2000,3000);
  3. Calendar

常用成员方法

  1. public int get(int field):返回给定日历字段的值。
  2. public void set(int field,int value):将给定日历字段设置给定值。
  3. public abstract void add(int field,int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
  4. public Date getTime();把日历时间值转换为date对象
  1. String

String:字符串,使用一对“”引起来表示

  1. String声明为final的,不可被继承
  2. String实现了Serializable接口:表示字符串是支持序列化的
  3. 实现了comparable接口:表示String可以比较大小
  4. String内部定义了final char【】 value用于存储字符串数据
  5. String:代表不可变的字符序列:简称:不可变性。
    体现:当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
  6. 通过字面量的方式给一个字符串赋值,此时的字符串值声明在字符串常量池中,字符串常量池中是不会存储相同内容的字符串。
    基本类型与字符串之间的转换
    基本类型—》字符串
    1.基本类型—+“”,
    2.包装类的静态方法tostring(参数),不是Object的toString重载,static String toString(int i)返回一个指定整数的String对象
    3.String类的静态方法valueof(参数)
    字符串-》基本类型
    使用包装类大家平台方法parsexxx(“数值类型的字符串”)

    1. //基本类型转换字符串
    2. Integer i=1;
    3. String s=i+"";
    4. String s1=Integer.toString(1);
    5. System.out.println(i.toString());
    6. System.out.println(s1+200);
    7. String s2=String.valueOf(i);
    8. //字符串转换基本类型
    9. int i1=Integer.parseInt(s1);
    10. //字符串的操作
    11. String s="猫猫猫狗猫猫猫猫猫猫狗猫猫猫猫猫狗猫猫猫猫猫猫猫";
    12. //字符串检索
    13. //检索字符串是否有该字符,返回Boolean
    14. System.out.println(s.contains("狗"));//有返回true
    15. //检索字符串是否存在,存在返回位置下标,不存在返回-1
    16. System.out.println(s.indexOf("狗"));//存在返回位置下标
    17. //检索字符串开始位置是否为该字符
    18. System.out.println(s.startsWith("猫"));//返回Boolean
    19. //检索字符串结尾位置是否为该字符
    20. System.out.println(s.endsWith("猫"));//返回Boolean
    21. //字符串替换
    22. System.out.println(s.replace("狗","鼠"));
    23. //字符串拆分以该字符拆分并输出0下标的字符
    24. System.out.println(s.split("狗")[0]);
    25. //字符的长度
    26. System.out.println(s.length());
    27. //字符是否为空
    28. System.out.println(s.isEmpty());
  7. StringBuilder

    1. StringBuilder su=new StringBuilder();
    2. String s=su.toString();
  8. 集合

重点:HashMap

①HashMap的工作原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

②HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

  1. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
  3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
  4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
  5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。

要注意的一些重要术语:

  1. sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。
  2. Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。
  3. 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。

我们能否让HashMap同步?

HashMap可以通过下面的语句进行同步: Map m = Collections.synchronizeMap(hashMap);

结论

Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。

ashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试,可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap,也可以说是不完整。HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合。collection框架有自己的接口和实现,主要分为Set接口,List接口和Queue接口。它们有各自的特点,Set的集合里不允许对象有重复的值,List允许有重复,它对集合中的对象进行索引,Queue的工作原理是FCFS算法(First Come, First Serve)。

首先让我们来看看什么是HashMap和HashSet,然后再来比较它们之间的分别。

③HashMap和HashSet的区别

HashMap和HashSet的区别是Java面试中最常被问到的问题。如果没有涉及到Collection框架以及多线程的面试,可以说是不完整。而Collection框架的问题不涉及到HashSet和HashMap,也可以说是不完整。HashMap和HashSet都是collection框架的一部分,它们让我们能够使用对象的集合。collection框架有自己的接口和实现,主要分为Set接口,List接口和Queue接口。它们有各自的特点,Set的集合里不允许对象有重复的值,List允许有重复,它对集合中的对象进行索引,Queue的工作原理是FCFS算法(First Come, First Serve)。

首先让我们来看看什么是HashMap和HashSet,然后再来比较它们之间的分别。

什么是HashSet

HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。

public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。

什么是HashMap

HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。

public Object put(Object Key,Object value)方法用来将元素添加到map中。

HashSet和HashMap的区别

HashMap HashSet
HashMap实现了Map接口 HashSet实现了Set接口
HashMap储存键值对 HashSet仅仅存储对象
使用put()方法将元素放入map中 使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值 HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象 HashSet较HashMap来说比较慢

IO流

文件操作

  1. File file =new File("C:\\Users\\A450\\Desktop\\bbb");
  2. //file.createNewFile();//创建一个文件,File写具体目录到创建的文件名
  3. file.mkdir();//创建一个目录
  4. System.out.println(file.exists());//判断是否存在
  5. System.out.println(file.isFile());//判断是否为一个文件
  6. System.out.println(file.isDirectory());//判断是否为一个目录
  7. System.out.println(Arrays.toString(file.list()));//获取目录里的文件名以数组方式打印
  8. // file.delete();//删除文件
  9. file.renameTo(new File("C:\\Users\\A450\\Desktop\\ccc"));//改名字

字节输入流

  1. //字节输入流FileInputStream
  2. public static void main(String[] args) throws IOException {
  3. File file = new File("C:\\Users\\A450\\Desktop\\aaa\\1.txt");
  4. FileInputStream fis=null;
  5. try {
  6. fis= new FileInputStream(file);//
  7. System.out.println(fis.available());//读取文件长度
  8. System.out.println(fis.read());//读取文件并返回位置如果读取完返回-1
  9. byte[] b=new byte[1024];//准备一个byte数组放入读取文件
  10. int len = fis.read(b);//读取内容放入数组
  11. while(len!=-1){
  12. String s=new String(b);//将byte转换字符串
  13. System.out.println(s);//输出读到的字符串
  14. len = fis.read(b);
  15. }
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }finally {
  19. fis.close();
  20. }
  21. }

FileOutputStream

  1. //字符输出流FileOutputStream
  2. public static void main(String[] args) {
  3. String s="你好,世界!";
  4. FileOutputStream fos=null;
  5. try {
  6. //写入文件,name:文件路径append:默认写入是覆盖写入;有true为追加写入
  7. fos=new FileOutputStream("C:\\Users\\A450\\Desktop\\aaa\\2.txt",true);
  8. byte[] b=s.getBytes();//将写入的文件转换为字节数组
  9. fos.write(b,0,b.length);//写入文件,从0开始,到写入的长度
  10. fos.flush();//清空缓冲区,强制写入缓冲区文件
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }finally{
  14. fos.close();
  15. }
  16. }

FileReader

  1. //FileReader字符输入流
  2. public static void main(String[] args) throws IOException {
  3. File file=new File("C:\\Users\\A450\\Desktop\\aaa\\1.txt");
  4. FileReader fr=null;
  5. try {
  6. fr=new FileReader(file);
  7. char[] c=new char[1024];//用字符保存读入的数据
  8. int len = fr.read();
  9. while (len!=-1){
  10. String s=new String(c);
  11. System.out.println(s);
  12. len=fr.read();
  13. }
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. }finally{
  17. fr.close();
  18. }
  19. }

FileWriter

  1. //FileWriter字节输出流
  2. public static void main(String[] args) throws IOException {
  3. String s="你好!世界ssss";
  4. FileWriter fw=null;
  5. try {
  6. fw=new FileWriter("C:\\Users\\A450\\Desktop\\aaa\\2.txt",true);
  7. fw.write(s);
  8. fw.flush();
  9. } catch (IOException e) {
  10. e.printStackTrace();
  11. }finally {
  12. fw.close();
  13. }
  14. }

BufferReader&BufferWriter

缓冲流

//缓冲流BufferedReader BufferedWriter
public static void main(String[] args) throws IOException {
    File file=new File("C:\\Users\\A450\\Desktop\\aaa\\1.txt");
    BufferedReader br=null;
    BufferedWriter bw=null;
    try {
        br= new BufferedReader(new FileReader(file));
        bw=new BufferedWriter(new FileWriter("C:\\Users\\A450\\Desktop\\aaa\\2.txt"));
        String s=br.readLine();//逐行读取
        while (s!=null){
            System.out.println(s);
            bw.write(s+"\r\n");
            bw.flush();
           s= br.readLine();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        br.close();
        bw.close();
    }
}

FileWriter

//打印流
public static void main(String[] args) {
    PrintWriter pw=null;
    try {
        pw=new PrintWriter(new FileWriter("C:\\Users\\A450\\Desktop\\aaa\\2.txt"),true);
        pw.print("hello world");
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        pw.close();

    }

}

ObjectOutputStream

//对象输入流 调用的学生类必须引用接口Serializable
public static void main(String[] args) throws IOException {
    Student stu1=new Student("赵东",11);
    Student stu2=new Student("赵2",12);
    Student stu3=new Student("赵3",13);
    Student stu4=new Student("赵4",14);
    ArrayList<Student> al=new ArrayList<Student>();
    al.add(stu1);
    al.add(stu2);
    al.add(stu3);
    al.add(stu4);
    ObjectOutputStream oos=null;
    try {
        oos=new ObjectOutputStream(new FileOutputStream("C:\\Users\\A450\\Desktop\\aaa\\3.txt"));
        oos.writeObject(al);
        oos.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        oos.close();

    }
}

ObjectInputStream

//对象输入流ObjectInputStream
public static void main(String[] args) {
    ObjectInputStream ois=null;
    try {
        ois=new ObjectInputStream(new FileInputStream("C:\\Users\\A450\\Desktop\\aaa\\3.txt"));
        ArrayList<Student> al=(ArrayList<Student>)ois.readObject();
        for (Student student : al) {
            System.out.println("姓名"+student.name+"年龄"+student.age);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}