Arrays
java.util.Arrays提供了大量的静态方法用来实现数组常见的操作
public static String toString(数组)将参数数组变成字符串(按照默认格[元素1, 元素2, …])public static void sort(数组)按照默认(升序)对数组进行排序ArrayList
• ArrayList可以任意改变长度
• ArrayList 中E为指定泛型,泛型只能是引用类型,不能是基本类型
• 如果希望存储基本类型数据,则必须使用基本类型所对应的“包装类”
• byte —-> Byte
• short —-> Short
• int —-> Integer
• long —-> Long
• float —-> Float
• double —-> Double
• char —-> Character
• boolean —-> Boolean
• ArrayList直接打印得到的不是地址值,而是其中的内容
常用方法public boolean add(E e)public void add(int i, E e)public E get(int index)public boolean isEmpty()public E remove(int index)public int size()-
Calendar
java.util.Calendar是一个抽象类,直接已知子类为GregorianCalendarstatic 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()把日历对象转换成为日期对象Collection
Collection是所有单列集合的根接口 ,主要有两个子接口List- 有序的集合(存取元素顺序相同)
- 允许存储重复的元素
- 有索引,可以使用普通的for循环遍历
Set- 不允许存储重复元素
- 没有索引,不可使用for循环遍历
Collection常用功能
public boolean add(E e)public void clear()public boolean remove(E e)public boolean contains(E e)public boolean isEmpty()public int size()-
Collections
常用方法
public static <T> boolean addAll(Collection<T> c, T...elements)往集合中添加一些元素public static void shuffle(List<?> list)打乱集合顺序public static <T> void sort(List<T> list)将集合中元素按照默认规则排序public static <T> void sort(List<T> list, Comparator<? super T>)将集合中元素按照指定规则排序
使用 sort(List<T> list) 的前提
- 被排序的集合里面存储的元素必须实现
Comparable,并且重写接口中的compareTo()方法 - 排序规则:
return this - obj为升序,return obj - this为降序
自定义规则的前提
- 必须生成一个
Comparator对象,重写其中的compare(o1, o2)方法 return o1 - o2为升序,return o2 - o1为降序 ```java package Pro;
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator;
public class DemoCollections {
public static void main(String[] args) {
ArrayList
<a name="SkMi3"></a># Date- `java.util.Date` 表示特定的瞬间,精确到毫秒- `Date()` 获取当前日期- `Date(long dateNum)` 将毫秒值转化为日期- `System.currentTimeMillis()` 与 `Date.getTime()` 获取日期的毫秒值<a name="G5rUe"></a># DateFormat- `java.text.DateFormat` 是一个抽象类,直接已知子类为 `SimpleDateFormat`- `String format(Date date)` 按照指定模式将Date格式化为符合模式的字符串- `Date parse(String source)` 把符合模式的字符串解析为Date日期- `SimpleDateFormat(String pattern)` 使用给定的模式构造<a name="A7uYf"></a># HashMap- `HashMap<K,V>` 集合 `implements` `Map<K,V>` 接口**HashMap集合的特点**- 底层是哈希表,查询速度特别快- JDK1.8之前:数组+单向链表- JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8),提高查询速度**存储自定义类型键值**- 必须重写 `hashCode()` 方法- 必须重写 `equals()` 方法<a name="zH6cD"></a># HashSet- **哈希值** :是一个十进制的整数,由系统随机给出,模拟了对象的内存地址,使用 `Object.hashCode()` 可以获取对象的哈希值- `String` 类重写了 `hashCode` 方法,不同字符串可能返回相同的哈希值**集合中不能存储重复元素的原理**- 在调用 `add` 方法时,会调用新增元素s2的 `hashCode` 方法计算哈希值,若s2的哈希值与已有元素s1哈希值相同(哈希冲突),则会调用 `s1.equals(s2)` ,若返回true,则认为s1与s2相同,不进行存储。- 底层实现原理:哈希表(数组+链表/红黑树)<br />**存储自定义类型元素**- 必须重写 `hashCode` 方法- 必须重写 `equals` 方法```javapackage API;import java.util.HashSet;import java.util.Objects;public class DemoHashCode {public class Person{private String name;private int age;// @Override// public int hashCode() {// return name.hashCode() + age;// }//// @Override@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && name.equals(person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}// public boolean equals(Object obj) {// Person person = (Person) obj;// return this.name.equals(person.name) && this.age == person.age;// }public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{姓名:" + name + ",年龄:" + age + "}";}}public static void main(String[] args) {DemoHashCode hs = new DemoHashCode();DemoHashCode.Person p1 = hs.new Person("大聪明", 18);DemoHashCode.Person p2 = hs.new Person("大聪明", 18);DemoHashCode.Person p3 = hs.new Person("大聪明", 19);HashSet<Person> set = new HashSet<>();set.add(p1);set.add(p2);set.add(p3);for (Person person : set) {System.out.println(person);}}}
Hashtable
- 任何 非null 对象都可以用作键或值
- 单线程,因此线程安全,但是速度慢
Hashtable已被取代,但其子类
Properties仍然活跃Iterator
迭代器用于对集合进行遍历
boolean hasNext()判断集合中是否有下一个元素E next()返回迭代的下一个对象
必须使用Iterator的实现类才能使用以上两个方法,一般使用 Iterator<E> iterator() 返回此Collection元素上进行迭代的迭代器
package API;import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class DemoIterator {public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("富强");coll.add("民主");coll.add("文明");coll.add("和谐");Iterator<String> iterator = coll.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}}}
LinkedHashMap
具有可预测迭代顺序的
HashMap
LinkedHashSet
具有可预测迭代顺序的
HashSet
LinkedList
- 使用
LinkedList特有的方法时,不能使用多态(编译看左边,会报错) LinkedList可以看作是一个“栈”结构
特有方法
public void addFirst(E e)等效于public void push(E e)public void addLast(E e)等效于public void add(E e)public E getFirst()public E getLast()public E removeFirst()等效于public E pop()public E removeLast()List
java.util.List接口是有序的Collection
特有方法
public void add(int index, E e)public E get(int index)public E remove(int index)-
Map
Map的常用子类
HashMap<K,V>LinkedHashMap<K,V>
Map的常用方法
public V put(K key, V value)把指定的键与指定的值添加到Map集合中- 如果key不重复,返回值V是null
- 如果key重复,会使用新的value替换map中的value,返回被替换的value值
public V remove(Object key)把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值public V get(Object key)根据指定的键,在Map集合中获取对应的值public Set<K> keySet()获取Map集合中所有的键,存储到Set集合中public Set<Map.Entry<K,V>> entrySet()获取到Map集合中所有的键值对对象的集合
Map.Entry
- 当Map集合一创建,就会在Map集合中创建一个Entry对象,用来记录键与值的映射关系
public K getKey()返回key的值public V getValue()返回value的值
Math
public static double abs(double num)获取绝对值public static double ceil(double num)向上取整public static double floor(double num)向下取整public static long round(double num)四舍五入-
Object
java.lang.Object类是Java语言中的根类,即所有类的父类,它描述的所有方法子类都可以使用。常用的方法
equals方法:对两个对象进行比较,可以防止空指针异常public static boolean equals(Object a, Object b){return (a == b) || (a != null && a.equals(b));}
判断对象是否为空
public static <T> T requireNonNull(T obj){if (obj == null)throw new NullPointerException();return obj;}
Random
用于生成随机数字
Random r = new Random();```java package oop.basic;
import java.util.Random;
/Random类用来生成随机数字/ public class DemoRandom { public static void main(String[] args) { Random r = new Random(); int num1 = r.nextInt(); System.out.println(“随机数1为:” + num1); // 产生整型范围内的整数值 int num2 = r.nextInt(100); // 产生一个[0,100)的随机数 System.out.println(“随机数2为:” + num2); for (int i = 0; i < 10; i++) { int num = r.nextInt(20); System.out.println(num); } } }
<a name="mGnpv"></a># Scanner- 用于从键盘中获取输入值 `Scanner sc = new Scanner(System.in);`- `sc.nextInt()` 获取一个整数- `sc.next()` 获取一个字符串(不带空格)<a name="zTy2g"></a># String**1.字符串的特点**- 字符串的内容永不改变- 由于字符串内容不可改变,所以字符串可以共享使用**2.字符串的创建**- `public String()` :创建一个空白字符串- `public String(char[] array)` :根据字符数组来创建对应的字符串- `public String(byte[] array)` :根据字节数组来创建对应的字符串- 直接创建```javapackage oop.basic;public class DemoString {public static void main(String[] args) {//使用空参构造String str1 = new String();//根据字符数组char[] charArray = new char[]{'a', 'b', 'c', 'd'};String str2 = new String(charArray);//根据字节数组byte[] byteArray = new byte[]{97, 98, 99, 100, 101};String str3 = new String(byteArray);//直接创建String str4 = "Hello, world";System.out.println(str1);System.out.println(str2);System.out.println(str3);System.out.println(str4);}}
3.字符串的常量池: 只有程序中直接双引号生成的字符串,才在字符串常量池(堆内存)中,所有指向这一 字符串常量 的引用具有相同的地址
4.常用字符串方法
- 比较方法
public boolean equals(Object obj)public boolean equalsIgnoreCase(Object obj)忽略大小写进行内容比较
- 获取方法
public int length()返回字符串长度public String concat(String str)拼接字符串public char charAt(int index)返回字符public int indexOf(String str)查找参数字符串在本字符串中首次出现的索引位置,若找不到,返回-1
- 截取方法
public String substring(int index)返回从index至字符串末尾的字符串public String substring(int begin, int end)返回[begin, end)范围内的字符串
- 转换方法
public char[] toCharArray()将当前字符串拆分成为字符数组public byte[] getBytes()获得当前字符串的字节数据public String replace(CharSequence oldString, CharSequence newString)替换字符串 ```java package oop.basic;
import java.nio.charset.StandardCharsets;
public class DemoStringConvert { public static void main(String[] args) { String str1 = “Hello”; String str2 = new String(new char[]{‘w’, ‘o’, ‘r’, ‘l’, ‘d’}); String str3 = str1.concat(“, “).concat(str2); String str4 = str3.replace(“l”,”o”); char[] charArray = str3.toCharArray(); byte[] byteArray = str3.getBytes(StandardCharsets.UTF_8); System.out.println(str3); System.out.println(str4); System.out.println(charArray); for (int i = 0; i < byteArray.length; i++) { System.out.print(byteArray[i] + “ “); } } }
```
分割方法
由于字符串不可改变,所以进行字符串的相加,内存中会有多个中间字符串,占用空间多,效率低下
- 而
StringBuilder的长度可变,因此可以提高字符串操作的效率 StringBuilder初始化byte[] value = new byte[16]- 构造方法
StringBuilder()构造方法, 构造一个不带任何字符,容量为16的缓冲区StringBuilder(String str)构造一个字符串生成器,初始化为指定字符串的内容StringBuilder(CharSequence seq)StringBuilder(int capacity)
StringBuilder append(Object obj)向sb对象中添加obj对象的字符串表示形式 ,具有多种重载方式,append方法实际返回的是this,因此无需 接受返回值public String toString()将sb对象转化成为String对象System
public static long currentTimeMillis()返回毫秒表示的当前时间public static void arraycopy(Object src, int srcPos, Object dest, int desPos, int length)将数组中指定区间拷贝到另一个数组中
