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
是一个抽象类,直接已知子类为GregorianCalendar
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()
把日历对象转换成为日期对象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相同,不进行存储。
- 底层实现原理:哈希表(数组+链表/红黑树)
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1674030/1611823929215-b312df52-4d91-49b2-9867-3211bc69bd69.png#height=206&id=IVnPI&margin=%5Bobject%20Object%5D&name=image.png&originHeight=412&originWidth=848&originalType=binary&ratio=1&size=115382&status=done&style=none&width=424)<br />**存储自定义类型元素**
- 必须重写 `hashCode` 方法
- 必须重写 `equals` 方法
```java
package 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
@Override
public 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);
}
@Override
public 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;
}
@Override
public 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)` :根据字节数组来创建对应的字符串
- 直接创建
```java
package 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)
将数组中指定区间拷贝到另一个数组中