首页 > 编程语言 >day03 - Java集合和常用类

day03 - Java集合和常用类

时间:2024-09-17 18:23:32浏览次数:12  
标签:Java String day03 System int Student 集合 public out

第一章 Collection集合

1. Collection概述

集合:java中提供的一种容器,可以用来存储多个数据
集合和数组既然都是容器,它们有啥区别呢?

  • 数组的长度是固定的。集合的长度是不固定的。集合可以随时增加元素,其大小也随之增加
  • 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储
  • 集合除了可以通过角标操作外,还具有其它操作元素的方式

2. 集合框架

集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map
集合框架
简化图
集合框架简化图

  • Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分 别是java.util.List 和java.util.Set
  • List 的特点是元素有序、元素可重复。List 接口的主要实现类有java.util.ArrayListjava.util.LinkedList
  • Set 的特点是元素无序,而且不可重复。Set 接口的主要实现类有java.util.HashSetjava.util.TreeSet

3. 常用功能

Collection是所有单列集合的父接口,在Collection中定义的通用方法,可用于操作所有的单列集合

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中元素的个数
Object[] toArray()把集合中的元素,存储到数组中

例:

    public static void main(String[] args) {
        Collection<String> list = new ArrayList<String>();

        list.add("张三");
        list.add("王五");

        System.out.println("集合中是否包含小二:"+list.contains("小二"));

        Object[] str = list.toArray();
        for(Object o:str){
            System.out.println(o);
        }

        list.remove("张三");
        System.out.println("集合中元素个数:"+list.size());
        if(!list.isEmpty()){
            list.clear();
        }
        System.out.println("集合中元素个数:"+list.size());
    }

结果:

集合中是否包含小二:false
张三
王五
集合中元素个数:1
集合中元素个数:0

第二章 Iterator迭代器

1. Iterator接口

想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,可以对集合中的元素进行删除操作

public Iterator iterator(): //获取集合对应的迭代器,用来遍历集合中的元素

Iterator接口的常用方法如下:

方法名说明
public E next()返回迭代的下一个元素。
public boolean hasNext()如果仍有元素可以迭代,则返回 true
void remove()删除迭代器对象当前指向的元素

如果集合中没有元素,还使用迭代器的next方法,将会发生java.util.NoSuchElement
Exception
没有集合元素的错误
例:

    public static void main(String[] args) {
        Collection<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("王五");
        list.add("李四");
        list.add("老六");
         //迭代器就好比是一个指针,默认指向集合的0索引处
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String str = it.next();//获取元素并移动指针
            if("老六".equals(str)){
                it.remove();//删除当前指向
            }
            System.out.println("元素:"+str);
        } //迭代器遍历完毕,指针不会复位,再次使用,就新建迭代器对象
        System.out.println("集合元素:"+list);
    }

结果:

元素:张三
元素:王五
元素:李四
元素:老六
集合元素:[张三, 王五, 李四]

2. 增强for

增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它
的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。实现
Iterable接口的类才可以使用迭代器和增强for
格式:

 for(元素的数据类型  变量 : Collection集合or数组){ 
    //操作区
}

例:

public class CollectionTest {
    public static void main(String[] args) {
        Collection<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("王五");
        list.add("李四");
        list.add("老六");
        for (String str:list) {
            System.out.println(str);
        }
    }
}

结果:

张三
王五
李四
老六

3. 注意事项

  • 报错NoSuchElementException (集合中没有元素,还使用迭代器的next方法)
  • 迭代器遍历完毕,指针不会复位
  • 循环中只能用一次next方法
  • 迭代器遍历时,不能用集合的方法进行增加或者删除
  • 增强for循环必须有被遍历的目标。目标只能是Collection或者是数组。增强for仅仅作为遍历操作出现

第三章 List集合

1. List集合特点

  1. 元素可重复(可用元素的equals方法,来比较是否为重复的元素)
  2. 元素有序,即元素的存入顺序和取出顺序一致
  3. 带有索引的集合,通过索引就可以精确的操作集合中的元素

2. 常用方法

方法名描述
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素

例:

public class CollectionTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("王五");
        list.add("李四");
        list.add(1,"老六");
        System.out.println(list.get(1));
        System.out.println(list.set(1,"老五"));
        list.remove(0);
        System.out.println(list.get(1));
        for (String str:list) {
            System.out.println(str);
        }
    }
}

结果;

老六
老六
王五
老五
王五
李四

3. List集合的五种遍历方式

  1. 迭代器
  2. 列表迭代器(在迭代器原有方法上,新增可以添加元素的方法)
  3. 增强for
  4. Lambda表达式
  5. 普通for循环
public class CollectionTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("王五");
        list.add("李四");
        //列表迭代器
        ListIterator<String> it = list.listIterator();
        while(it.hasNext()){
            String str =it.next();
            if("王五".equals(str)){
                it.add("孙七");//此方法,迭代器没有
            }
        }
        System.out.println(list);
    }
}

List系列集合中的两个删除的方法
1.直接删除元素(boolean remove(Object o))
2.通过索引进行删除(remove(int index))

4. ArrayList集合

java.util.ArrayList 集合数据存储的结构是可变数组结构。查询遍历元素的效率比较高,增删元素的效率比较低,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList 是最常用的集合。
许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的
例:

public class CollectionTest {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("王五");
        list.add("李四");
        //列表迭代器
        ListIterator<String> it = list.listIterator();
        while(it.hasNext()){
            String str =it.next();
            if("王五".equals(str)){
                it.add("孙七");//此方法,迭代器没有
            }
        }
        System.out.println(list);
    }
}

5. LinkedList集合

java.util.LinkedList 集合底层使用链表结构(链表的特点:有头有尾),查询遍历元素效率比较低,增删元素的效率比较高

常用方法:

方法名说明
boolean addFirst(E e)将指定元素插入列表开头
boolean addLast(E e)将指定元素添加到列表结尾
E getFirst()获取列表第一个元素
E getLast()获取列表最后一个元素
E removeFirst()移除并返回列表的第一个元素
E removeLast()移除并返回列表的最后一个元素
boolean isEmpty()如果列表中没有元素,返回true
E pop()从此列表所表示的堆栈处弹出一个元素

例:

public class CollectionTest {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<String>();
        list.add("李四");
        list.addLast("张三");
        list.addFirst("王五");

        System.out.println(list.getFirst());
        System.out.println(list.getLast());

        System.out.println(list.removeFirst());
        System.out.println(list.removeLast());

        while(!list.isEmpty()){
            System.out.println(list.pop());//弹出集合中栈顶元素
        }
    }
}

第四章 Set集合

1. Set集合

jSet 接口和List 接口一样,同样继承自Collection 接口,它与Collection 接口中的方法基本一致,并没有对Collection 接口进行功能上的扩充,只是比Collection 接口更加严格。

与List接口不同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复,没有索引,不能使用普通for循环遍历
例:

public class CollectionTest {
    public static void main(String[] args) {
        Set<String> set = new TreeSet<String>();
        set.add("李四");
        set.add("张三");
        set.add("王五");
        set.add("李四");

        for (String s :set){
            System.out.println(s);
        }
    }
}

结果:

张三
李四
王五

2. HashSet集合

java.util.HashSet 是Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。
java.util.HashSet 底层的实现是哈希表结构(其实是java.util.HashMap 支持),最多只能存储一个null元素。
HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与equals 方法

例:

public class CollectionTest {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<String>();
        set.add("李四");
        set.add("张三");
        set.add("王五");
        set.add("李四");

        for (String s :set){
            System.out.println(s);
        }
    }
}

结果:

张三
李四
王五

3. TreeSet集合

TreeSet集合使用红黑树数据结构实现元素的排序和存储,底层实际上是一个TreeMap集合,放到TreeSet集合中的元素:有序且唯一,即不可重复,有序是指存储的元素会按照指定的规则自动排序
可以将元素按照规则进行排序
TreeSet():根据其元素的自然排序进行排序
TreeSet(Comparator comparator) :根据指定的比较器进行排序
例:

public class CollectionTest {
    public static void main(String[] args) {
        TreeSet<String> set = new TreeSet<String>();
        set.add("李四");
        set.add("张三");
        set.add("王五");
        set.add("李四");

        for (String s :set){
            System.out.println(s);
        }
    }
}
3.1 自然排序

实现步骤

  1. 使用空参构造创建TreeSet集合
    用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
  2. 自定义的Student类实现Comparable接口
    自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法
  3. 重写接口中的compareTo方法
    重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

例:

public class Student extends Person implements Comparable<Student>{
    private int sex;//性别
    public Student(){

    }
    public Student(String name, int age, int sex) {
        super(name, age);
        this.sex = sex;
    }
    @Override
    public void eat(){
        System.out.println(super.getName()+"要吃饭!");
    }
    @Override
    public void work() {
        System.out.println("我要上学");
    }

    @Override
    public int compareTo(Student o) {
        int result = this.getAge() - o.getAge();
        return result==0?this.getName().compareTo(o.getName()):result;//不相等就比较姓名,否则就返回结果
    }
}
public class CollectionTest {
    public static void main(String[] args) {
        TreeSet<Student> set = new TreeSet<Student>();
        Student student = new Student("张三",23,1);
        Student student1 = new Student("李四",22,1);
        Student student2 = new Student("王五",29,1);
        Student student3 = new Student("陈六",20,1);
        set.add(student);
        set.add(student1);
        set.add(student2);
        set.add(student3);
        
        for (Student s :set){
            System.out.println(s);
        }
    }
}

结果:

Person{name='陈六', age=20}
Person{name='李四', age=22}
Person{name='张三', age=23}
Person{name='王五', age=29}
3.2 比较器排序

实现步骤

  • 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序
  • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2) 方法
  • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

例:

public class Student extends Person {
    private int sex;//性别
    public Student(){

    }
    public Student(String name, int age, int sex) {
        super(name, age);
        this.sex = sex;
    }
    @Override
    public void eat(){
        System.out.println(super.getName()+"要吃饭!");
    }
    @Override
    public void work() {
        System.out.println("我要上学");
    }
}

public class CollectionTest {
    public static void main(String[] args) {
        TreeSet<Student> set = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int result = o1.getAge() - o2.getAge();
                return result == 0?o1.getName().compareTo(o2.getName()):result;
            }
        });
        Student student = new Student("张三", 23, 1);
        Student student1 = new Student("李四", 22, 1);
        Student student2 = new Student("王五", 29, 1);
        Student student3 = new Student("陈六", 20, 1);
        set.add(student);
        set.add(student1);
        set.add(student2);
        set.add(student3);

        for (Student s : set) {
            System.out.println(s);
        }
    }
}

结果:
Person{name=‘陈六’, age=20}
Person{name=‘李四’, age=22}
Person{name=‘张三’, age=23}
Person{name=‘王五’, age=29}

3.3 两种排序的区别

排序

  • 自然排序: 自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序
  • 比较器排序: 创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序
  • 在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,必须使用比较器排序

返回值的规则

  • 如果返回值为负数,表示当前存入的元素是较小值,存左边
  • 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
  • 如果返回值为正数,表示当前存入的元素是较大值,存右边

第五章 Map集合

1. Map概述

Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值
如:身份证–姓名(key–value),身份证不可重复,姓名可重复
基本上都需要重写键的的hashCode()方法、equals()方法

2. 常用方法

方法名说明
public V put(K key, V value)把指定的键与指定的值添加到Map集合中。
public V remove(Object key)把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值
public V get(Object key)根据指定的键,在Map集合中获取对应的值
public Set keySet()获取Map集合中所有的键,存储到Set集合中
public Set<Map.Entry<K,V>> entrySet()获取到Map集合中所有的键值对对象的集合(Set集合)

例:
需要提前重写自定义类的hashCode()方法、equals()方法

import java.util.Objects;

public class Student extends Person {
    private int sex;//性别
    public Student(){

    }
    public Student(String name, int age, int sex) {
        super(name, age);
        this.sex = sex;
    }
    @Override
    public void eat(){
        System.out.println(super.getName()+"要吃饭!");
    }
    @Override
    public void work() {
        System.out.println("我要上学");
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        if(getAge()!= student.getAge())
            return false;
        return getName()!= null?getName().equals(student.getName()):student.getName() == null;
    }

    @Override
    public int hashCode() {
        int result = getName() != null ? getName().hashCode() : 0;
        result = 31 * result + getAge();
        return result;
    }
}
public class CollectionTest {
    public static void main(String[] args) {
        //创建Map对象
        HashMap<Student,Integer> map = new HashMap<Student,Integer>();
        //新增元素
        Student student = new Student("张三", 23, 1);
        Student student1 = new Student("李四", 22, 1);
        Student student2 = new Student("王五", 29, 1);
        Student student3 = new Student("陈六", 20, 1);
        Student student4 = new Student("李四", 22, 1);
        //将元素添加进集合
        map.put(student,1);
        map.put(student1,2);
        map.put(student2,3);
        map.put(student3,4);
        map.put(student4,5);
        System.out.println(map);
        if(map.containsValue(5)){//if有值为5就删除student4
            map.remove(student4);            
        }
        System.out.println(map);
        System.out.println(map.get(4));
        System.out.println(map.get(student3));
        
        //for循环遍历1
        //获取键集合(把单个键取出来,存入集合)
        Set<Student> keys = map.keySet();
        //遍历键集合
        for(Student key:keys){
            System.out.println(key+"的值是: "+map.get(key));
        }
        
        //for循环遍历2
        //获取所有entry对象集entrySet(把一行行键值当成一个个对象取出,存入集合)
        Set<Map.Entry<Student, Integer>> entries= map.entrySet();
        //遍历每个entry对象
        for(Map.Entry<Student, Integer> entry:entries){
            System.out.println(entry.getKey()+"的值是: "+entry.getValue());
        }
        
        //foreach遍历
        map.forEach((Student key,Integer value)->{
            System.out.println(key+" : "+value);
        });
    }
}

结果:

{Person{name='张三', age=23}=1, Person{name='陈六', age=20}=4, Person{name='李四', age=22}=5, Person{name='王五', age=29}=3}
{Person{name='张三', age=23}=1, Person{name='陈六', age=20}=4, Person{name='王五', age=29}=3}
null
4
Person{name='张三', age=23}的值是: 1
Person{name='陈六', age=20}的值是: 4
Person{name='王五', age=29}的值是: 3
Person{name='张三', age=23}的值是: 1
Person{name='陈六', age=20}的值是: 4
Person{name='王五', age=29}的值是: 3
Person{name='张三', age=23} : 1
Person{name='陈六', age=20} : 4
Person{name='王五', age=29} : 3
  • 使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中
  • 若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值

3. Map常用子类

HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法
例:不重写

public class CollectionTest {
    public static void main(String[] args) {
        HashMap<Student,Integer> map = new HashMap<Student,Integer>();
        Student student = new Student("张三", 23, 1);
        Student student1 = new Student("李四", 22, 1);
        Student student2 = new Student("王五", 29, 1);
        Student student3 = new Student("陈六", 20, 1);
        Student student4 = new Student("李四", 22, 1);
        map.put(student,1);
        map.put(student1,2);
        map.put(student2,3);
        map.put(student3,4);
        map.put(student4,5);

        map.forEach((Student key,Integer value)->{
            System.out.println(key+" : "+value);
        });
    }
}

结果:

Person{name='陈六', age=20} : 4
Person{name='王五', age=29} : 3
Person{name='李四', age=22} : 2
Person{name='李四', age=22} : 5
Person{name='张三', age=23} : 1

例:重写:

import java.util.Objects;

public class Student extends Person {
    private int sex;//性别
    public Student(){

    }
    public Student(String name, int age, int sex) {
        super(name, age);
        this.sex = sex;
    }
    @Override
    public void eat(){
        System.out.println(super.getName()+"要吃饭!");
    }
    @Override
    public void work() {
        System.out.println("我要上学");
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        if(getAge()!= student.getAge())
            return false;
        return getName()!= null?getName().equals(student.getName()):student.getName() == null;
    }

    @Override
    public int hashCode() {
        int result = getName() != null ? getName().hashCode() : 0;
        result = 31 * result + getAge();
        return result;
    }
}

public class CollectionTest {
    public static void main(String[] args) {
        HashMap<Student,Integer> map = new HashMap<Student,Integer>();
        Student student = new Student("张三", 23, 1);
        Student student1 = new Student("李四", 22, 1);
        Student student2 = new Student("王五", 29, 1);
        Student student3 = new Student("陈六", 20, 1);
        Student student4 = new Student("李四", 22, 1);
        map.put(student,1);
        map.put(student1,2);
        map.put(student2,3);
        map.put(student3,4);
        map.put(student4,5);

        map.forEach((Student key,Integer value)->{
            System.out.println(key+" : "+value);
        });
    }
}

结果:

Person{name='张三', age=23} : 1
Person{name='陈六', age=20} : 4
Person{name='李四', age=22} : 5
Person{name='王五', age=29} : 3

LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法
例:同上

TreeMap:TreeMap底层是红黑树结构,依赖自然排序或者比较器排序,对键进行排序,如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则
例:

    public static void main(String[] args) {
        TreeMap<Student,Integer> map = new TreeMap<Student,Integer>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int result = o1.getAge() - o2.getAge();
                return result == 0?o1.getName().compareTo(o2.getName()):result;
            }
        });
        Student student = new Student("张三", 23, 1);
        Student student1 = new Student("李四", 22, 1);
        Student student2 = new Student("王五", 29, 1);
        Student student3 = new Student("陈六", 20, 1);
        Student student4 = new Student("李四", 22, 1);
        map.put(student,1);
        map.put(student1,2);
        map.put(student2,3);
        map.put(student3,4);
        map.put(student4,5);

        map.forEach((Student key,Integer value)->{
            System.out.println(key+" : "+value);
        });
    }

结果:

Person{name='陈六', age=20} : 4
Person{name='李四', age=22} : 5
Person{name='张三', age=23} : 1
Person{name='王五', age=29} : 3

Map接口中的集合都有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量的数据类型可以相同,也可以不同

第六章 常用库

1. Object

  • java.lang.Object 类是Java语言中的根类,即所有类的父类
  • 它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object
  • 如果一个类没有特别指定父类, 那么默认则继承自Object类

常用方法

方法名说明
public String toString()返回该对象的字符串表示
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”
int hashCode()返回该对象的哈希码值。
void notify()唤醒在此对象监视器上等待的单个线程
void wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待
Class<?> getClass()返回此 Object 的运行时类

反射常用最后一个,多线程常用45,集合常用23,一般常用1
例:

import java.util.Objects;

public class Student extends Person {
    private int sex;//性别
    public Student(){

    }
    public Student(String name, int age, int sex) {
        super(name, age);
        this.sex = sex;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        if(getAge()!= student.getAge())
            return false;
        return getName()!= null?getName().equals(student.getName()):student.getName() == null;
    }

    @Override
    public int hashCode() {
        int result = getName() != null ? getName().hashCode() : 0;
        result = 31 * result + getAge();
        return result;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sex=" + sex +
                "} " + super.toString();
    }
}

java.util.Objects 类
Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优
化了这个问题。方法如下:

  • public static boolean equals(Object a, Object b):判断两个对象是否相等

源码如下:

public static boolean equals(Object a, Object b) {  
return (a == b) || (a != null && a.equals(b));  
}

2. 日期时间类

2.1 Date类

java.util.Date 类 表示特定的瞬间,精确到毫秒

方法说明
public Date()分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)
public Date(long date)分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数
public long getTime()把日期对象转换成对应的时间毫秒值

简单来说:使用无参构造,可以自动设置当前系统时间的毫秒时刻;指定long类型的构造参数,可以自定义毫秒时刻
例:

public static void main(String[] args) {
        //无参构造器
        Date date = new Date();
        System.out.println(date);//Tue Sep 17 16:05:52 CST 2024
        //有参构造器
        Date date1 = new Date(0L);
        System.out.println(date1);//Thu Jan 01 08:00:00 CST 1970
        //获取date日期的毫秒值
        System.out.println(date.getTime());//1726560352988
    }
2.2 DateFormat类

java.text.DateFormat 是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换

格式化:按照指定的格式,从Date对象转换为String对象
解析:按照指定的格式,从String对象转换为Date对象

构造方法
由于DateFormat为抽象类,不能直接使用,常用的子类有java.text.SimpleDateFormat 这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:

格式规则

public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号
构造SimpleDateFormat

参数pattern是一个字符串,代表日期时间的自定义格式

常用的格式规则为:

标识字母(区分大小写)含义
y
M
d
H
m
s

例:

public static void main(String[] args) throws ParseException {
        //无参构造器
        Date date = new Date();
        System.out.println(date);//Tue Sep 17 16:19:31 CST 2024
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(format.format(date));//2024-09-17 16:19:31//Data转字符串
        System.out.println(format.parse(format.format(date)));//Tue Sep 17 16:19:31 CST 2024//字符串转Date
    }
2.3 Calendar类

java.util.Calendar 是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性
常用方法

方法名说明
public static Calendar getInstance()使用默认时区和语言环境获得一个日历
public int get(int field)返回给定日历字段的值。
public void set(int field, int value)将给定的日历字段设置为给定值。
public abstract void add(int field, int amount)根据日历的规则,为给定的日历字段添加或减去指定的时间量。
public Date getTime()返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象

Calendar类中提供很多成员常量,代表给定的日历字段:

字段值含义
YEAR
MONTH月(从0开始,可以+1使用)
DAY_OF_MONTH月中的天(几号)
HOUR时(12小时制)
HOUR_OF_DAY时(24小时制)
MINUTE
SECOND
DAY_OF_WEEK周中的天(周几,周日为1,可以-1使用)

例:

public static void main(String[] args)  {
                // 创建Calendar对象
                Calendar cal = Calendar.getInstance();
                // 获取年
                int year = cal.get(Calendar.YEAR);
                // 设置月
                // 获取月
                int month = cal.get(Calendar.MONTH)+1;
                cal.set(Calendar.MONTH,3);
                int month1 = cal.get(Calendar.MONTH)+1;
                // 获取日
                int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
                System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
                System.out.println(year + "年" + month1 + "月" + dayOfMonth + "日");

                cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
                cal.add(Calendar.YEAR, -3); // 减3年
                int day = cal.get(Calendar.DAY_OF_MONTH);
                int year1 = cal.get(Calendar.YEAR);

                System.out.println(year1 + "年" + month + "月" + day + "日");
                System.out.println(cal.getTime());
            }

结果:

2024年9月17日
2024年4月17日
2021年9月19日
Mon Apr 19 16:46:33 CST 2021

西方星期的开始为周日,中国为周一
在Calendar类中,月份的表示是以0-11代表1-12月
日期是有大小关系的,时间靠后,时间越大

3. System类

java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作
常用的方法

方法名说明
public static long currentTimeMillis()返回以毫秒为单位的当前时间
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)将数组中指定的数据拷贝到另一个数组中
  • currentTimeMillis方法就是 获取当前系统时间与1970年01月01日00:00点之间的毫秒差值
  • 数组的拷贝动作是系统级的,性能很高。System.arraycopy方法具有5个参数,含义分别为源数组,源数组索引起始位置,目标数组,目标数组索引起始位置,复制元素个数

例:

public static void main(String[] args)  {
        System.out.println(System.currentTimeMillis());//打印当前时间的毫秒值
        int[] src = new int[]{1,2,3,4};
        int[] desc = new int[]{5,6,7,8};
        System.arraycopy(src,1,desc,1,2);
        for(int i :src){
            System.out.print("src:"+i+" ");
        }
        for(int i :desc){
            System.out.print("desc:"+i+" ");
        }

    }

结果:

1726563432465
src:1 src:2 src:3 src:4 desc:5 desc:2 desc:3 desc:8 

4. String类

java.lang.String 类代表字符串

4.1 特点
  • 字符串不变:字符串的值在创建后不能被更改
  • 因为String对象是不可变的,所以它们可以被共享
  • “abc” 等效于 char[] data={ ‘a’ , ‘b’ , ‘c’ }, String底层是靠字符数组实现的

4.2 常用方法

方法名说明
public String()初始化新创建的 String对象,以使其表示空字符序列
public String(char[] value)通过当前参数中的字符数组来构造新的String
public String(byte[] bytes)通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String
public boolean equals (Object anObject)将此字符串与指定对象进行比较
public boolean equalsIgnoreCase (String anotherString)将此字符串与指定对象进行比较,忽略大小写
public int length ()返回此字符串的长度
public String concat (String str)将指定的字符串连接到该字符串的末尾。
public char charAt (int index)返回指定索引处的 char值。
public int indexOf (String str)返回指定子字符串第一次出现在该字符串内的索引。
public String substring (int beginIndex)返回一个子字符串,从beginIndex开始截取字符串到字符串结尾
public String substring (int beginIndex, int endIndex)返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex
public char[] toCharArray ()将此字符串转换为新的字符数组
public byte[] getBytes ()使用平台的默认字符集将该 String编码转换为新的字节数组
public String replace (CharSequence target, CharSequence replacement)将与target匹配的字符串使用replacement字符串替换
public String[] split(String regex)将此字符串按照给定的regex(规则)拆分为字符串数组
isEmpty()用于判断字符串是否为空
trim()用于删除字符串的头尾空白符
  • String 中 == 比较引用地址是否相同,equals() 比较字符串的内容是否相同
  • String类是final的,它的所有成员变量也都是final的。为什么是final的?
    • 线程安全:同一个字符串实例可以被多个线程共享,因为字符串不可变,本身就是线程安全
    • 支持hash映射和缓存:因为String的hash值经常会使用到,比如作为 Map 的键,不可变的特性使得 hash 值也不会变,不需要重新计算
    • 字符串常量池优化:String对象创建之后,会缓存到字符串常量池中,下次需要创建同样的对象时,可以直接返回缓存的引用

5. StringBuilder类

StringBuilder又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。StringBuilder是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进行各种操作,线程不安全StringBuffer用于多线程是安全
常用方法

方法名说明
public StringBuilder()构造一个空的StringBuilder容器
public StringBuilder(String str)构造一个StringBuilder容器,并将字符串添加进去
public StringBuilder append(…)添加任意类型数据的字符串形式,并返回当前对象自身
public String toString()将当前StringBuilder对象转换为String对象
public static void main(String[] args)  {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("你好,");
        stringBuilder.append("007");
        System.out.println(stringBuilder.toString());
    }

结果:

你好,007

6. Math类

java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单
常用方法

方法名说明
public static double abs(double a)返回 double 值的绝对值
public static double ceil(double a)返回大于等于参数的最小的整数
public static double floor(double a)返回小于等于参数最大的整数
public static long round(double a)返回最接近参数的 long。(相当于四舍五入方法)

例:

public static void main(String[] args)  {
        double d1 = Math.abs(-6);
        double d2 = Math.ceil(-6.6);
        double d3 = Math.floor(-6.6);
        double d4 = Math.round(-6.6);
        System.out.println(d1);
        System.out.println(d2);
        System.out.println(d3);
        System.out.println(d4);
    }

结果:

6.0
-6.0
-7.0
-7.0

7. Arrays类

java.util.Arrays 类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单
常用方法

方法名说明
public static String toString(int[] a)返回指定数组内容的字符串表示形式
public static void sort(int[] a)对指定的 int 型数组按数字升序进行排序

例:

public static void main(String[] args)  {
        int[] src = new int[]{1,2,3,4};
        int[] desc = new int[]{5,6,7,8,3,21,23,11};
        System.out.println(src);
        System.out.println(Arrays.toString(src));
        System.out.println("排序前:"+Arrays.toString(desc));
        Arrays.sort(desc);
        System.out.println("排序后:"+Arrays.toString(desc));
    }

结果:

[I@6b884d57
[1, 2, 3, 4]
排序前:[5, 6, 7, 8, 3, 21, 23, 11]
排序后:[3, 5, 6, 7, 8, 11, 21, 23]

手出汗

太充实了!!!

标签:Java,String,day03,System,int,Student,集合,public,out
From: https://blog.csdn.net/weixin_51202460/article/details/142308996

相关文章

  • java线程池编程示例
    程序功能这段代码展示了如何使用Java线程池来并发执行多个任务。通过创建一个固定大小为3的线程池,程序提交了5个任务,并让线程池中的线程并发处理这些任务。每个任务模拟了一个耗时操作,最后程序等待所有任务完成后关闭线程池。代码importjava.util.concurrent.Ex......
  • 如何打造动漫天堂?宇宙动漫网站设计与实现,Java SpringBoot Vue技术揭秘
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、微信小程序、大数据实战项目集⚡⚡文末......
  • 3.Java高级编程实用类介绍(一)
    三、Java高级编程实用类介绍(一)文章目录三、Java高级编程实用类介绍(一)一、枚举类型二、包装类三、Math一、枚举类型使用enum进行定义publicenum枚举名字{值1,值2....}二、包装类每个基本类型在java.lang包中都有一个相应的包装类 /* *new包......
  • Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
    0前言在页面中,要实现数据更新的视图实时显示,纯JavaScrip需要手动编写代码来处理数据和视图之间的更新。而Vue提供了数据绑定的能力,使得数据和视图保持同步。我们通过一个实例来体验两者的差别。我们设计一个页面,在页面里提供一个文本框,用户可以在文本框输入内容,然后我们在文本框下......
  • 4.Java高级编程实用类介绍(二)
    四、Java高级编程实用类介绍(二)文章目录四、Java高级编程实用类介绍(二)一、Random类二、字符串常用方法一、Random类//获得随机数Randomrand=newRand();System.out.println(rand.nextInt(100));//获得20-35的随机数Sytem.out.println(rand.nextInt......
  • Java基础:Api 文档注释,字符串种类,String字符串创建,特点及常用方法
    #1API文档注释*有三种注释 1.`单行注释 //` 2.`多行注释/*  */` 3.`文档注释/** */`*文档注释一般建议写在类,属性和方法上。jdk提供了javadoc.exe工具 对程序的所有类及属性和方法生成一个说明文档 :API文档*API:ApplicationProgramInte......
  • Java 性能调优:优化 GC 线程设置
    垃圾回收器使用一组称为GC线程的线程来执行回收工作。有时JVM可能会分配过多或过少的GC线程。本文将讨论JVM为什么会出现这种情况、其影响以及可能的解决方案。1咋查找应用程序的GC线程数量进行线程转储分析来确定应用程序的GC线程数量:从生产服务器捕获threaddu......
  • 计算机毕业设计推荐-基于Java的小区物业管理系统
    精彩专栏推荐订阅:在下方主页......
  • java计算机毕业设计云计算的城乡医疗卫生服务系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,云计算作为新一代信息技术的核心,正深刻改变着各行各业的服务模式与效率。在医疗卫生领域,面对城乡医疗资源分布不均、信息不对......
  • java计算机毕业设计交通事故档案管理平台(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和机动车保有量的持续增长,交通事故已成为影响社会公共安全与经济发展的重要因素之一。传统的手工档案管理方式在面对海量、复杂......