文章目录
常用数据类型和类
String
构造
String s = “xxx”
String(String original)
String(char数组)
String(char数组,起始下标,长度)
String(byte数组)
String(byte数组,起始下标,长度)
String(StringBuffer buffer)
String(StringBuilder builder)
方法
boolean isEmpty() 字符串是否为空
int length() 字符串长度
char charAt(int index) 返回指定位置的字符
boolean contains(CharSequence s) 判断字符串是否包含s
String replace(CharSequence target, CharSequence replacement) 用replacement替换字符串target的字符
---------------------------------------------------------------------------------------------
boolean startsWith(String prefix) 判断字符串是否以prefix开始
boolean endsWith(String suffix) 判断字符串是否以suffix结尾
int indexOf(String str) 返回str在字符串第一次出现的位置
int lastIndexOf(String str) 返回str最后一次出现的位置
---------------------------------------------------------------------------------------------
String[] split(String regex) 将字符串以regex分割
String substring(int beginIndex) 从beginIndex开始截取字串
String substring(int beginIndex, int endIndex) 截取beginIndex到endIndex - 1的字符串
---------------------------------------------------------------------------------------------
boolean equals(Object anObject) 判断两个串是否相等
boolean equalsIgnoreCase(String anotherString) 忽略大小写判断两个串是否相等
int compareTo(String anotherString) 比较两个字符串。相等返回0;前大后小返回1;前小后大返回-1
---------------------------------------------------------------------------------------------
byte[] getBytes() 将字符串串变成字节数组返回
char[] toCharArray() 将字符串转换乘char数组
String toLowerCase() 字符串转小写
String toUpperCase() 字符串转大写
String trim() 去除字符串两边空格
静态方法
static String valueOf(int i) 将 i 转换成字符串
int[]
import java.util.Arrays;
**长度
list.length()
**二维数组及排序
Integer[] num = {1,3,5,7,9};
Integer[] num_ = new Integer(num);
Integer[][] num_2d = {{1,3,5,7,9}, {2,4,6,8,10}};
Arrays.sort(num);
//Arrays.sort(num_2d); 不可以
**数组作为函数返回值
//public int[] func();
void BubbleSort(int array[], int n)
{
int i, j, k;
for(i=0; i<n-1; i++)
for(j=0; j<n-1-i; j++)
{
if(array[j]>array[j+1])
{
k=array[j];
array[j]=array[j+1];
array[j+1]=k;
}
}
}
List
格式:[ , , , ]
index: 0, 1,... < length
依赖:import java.util.List;
List list_init = new ArrayList<Integer>();
/*
void add(int index, E element) 指定位置添加元素
E set(int index, E element) 替换指定位置的元素,返回更新前的元素
E get(int index) 获取指定索引的元素
E remove(int index) 删除指定索引的元素
-----------------------------------------------------------------------
boolean contains(Object o) list中是否包含某个元素
int indexOf(Object o) 获取指定元素的索引
boolean isEmpty() 判断list是否为空
boolean equals(List l) 对比两个list中的所有元素
-----------------------------------------------------------------------
List subList(fromIndex, toIndex) 利用list中索引位置重新生成一个新的list(截取集合)
String toString() 将集合转换为字符串
Array toArray() 将集合转换为数组
*/
list_init.add(1);
list_init.add(2);
list_init.add(4); //[1, 2, 4]
list_init.add(1, 3); //[1, 3, 2, 4]
list_init.set(3, 1); //[1, 3, 2, 1]
System.out.println("5的位置:" + list_init.indexOf(5)); //5的位置:-1
List<List<Integer>> list_2d = new ArrayList<>();
比较排序
方法一(修改原有类)
Collections.sort(list);
被排序对象Person的方法重写:
@Override
public int compareTo(Person p) {
return p.getAge() - this.getAge();
}
方法二(扩充一个原有类的比较器)
Collections.sort(list, new PersonComparator());
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p2.getAge() - p1.getAge();
}
}
@Getter
@Setter
@ToString
class Person {
...
LinkedList
增加: 删除: 查:
默认加载表尾 默认移出表头
add(E e) = push(E e) remove() = pop()
add(int index, E element) remove(E e) get(int index)
addFirst(E e) removeFirst(E e) getFirst()
addLast(E e) removeLast(E e) getLast()
---------------- ---------------
offer(E e) poll() peekFirst()
offerFirst(E e) pollFirst() offerLast(E e) pollLast()
增加:
add(E e):在链表后添加一个元素; 通用方法
addFirst(E e):在链表头部插入一个元素; 特有方法
addLast(E e):在链表尾部添加一个元素; 特有方法
push(E e):与addFirst方法一致
offer(E e):在链表尾部插入一个元素 add(int index, E element):在指定位置插入一个元素。
offerFirst(E e):JDK1.6版本之后,在头部添加; 特有方法 offerLast(E e):JDK1.6版本之后,在尾部添加; 特有方法
删除:
remove() :移除链表中第一个元素; 通用方法
remove(E e):移除指定元素; 通用方法
removeFirst(E e):删除头,获取元素并删除; 特有方法
removeLast(E e):删除尾; 特有方法
pollFirst():删除头; 特有方法
pollLast():删除尾; 特有方法
pop():和removeFirst方法一致,删除头。
poll():查询并移除第一个元素 特有方法
查:
get(int index):按照下标获取元素; 通用方法
getFirst():获取第一个元素; 特有方法
getLast():获取最后一个元素; 特有方法
peek():获取第一个元素,但是不移除; 特有方法
peekFirst():获取第一个元素,但是不移除;
peekLast():获取最后一个元素,但是不移除;
pollFirst():查询并删除头; 特有方法
pollLast():删除尾; 特有方法
poll():查询并移除第一个元素 特有方法
Stack:基于数组实现,随机访问(查找)效率更高,增删改效率较低
LinkedList:基于链表实现,增删改效率更高,随机访问(查找)效率较低
ArrayDeque和LinkedList这两者底层,一个采用数组存储,一个采用链表存储;
数组存储,容量不够时需要扩容和数组拷贝,通常容量不会填满,会有空间浪费;
链表存储,每次push都需要new Node节点,并且node节点里面有prev和next成员,也会有额外的空间占用。
ArrayDeque用作栈时比Stack快没有疑问,用作队列的时候似乎也会比LinkedList快!
Deque<Character> stack = new LinkedList<Character>();
LinkedList<Character> stack = new LinkedList<Character>();
Dictionary
格式:key:value
依赖:import java.util.*;
Dictionary<String, Integer> dict = new Hashtable<>();
/*
int size() 返回字典的大小。
boolean isEmpty() 如果没有键值映射,则返回true,否则返回false。
Enumeration<K> keys() 返回字典中键的枚举。
Enumeration<K> elements() 返回字典中值的枚举。
V get(Object key) 返回与键关联的值,如果键不存在,则返回null。
V put(K key, V value) 将键值对添加到字典中。 如果任何键值为null,则抛出NullPointerException 。 如果键已经存在,则返回关联的值,然后更新新值。 如果是新密钥,则返回null。
V remove(Object key) 从字典中删除键/值对。 返回与键关联的值。 如果键在字典中不存在,则不执行任何操作,并返回null。
*/
应用
转换
String 转 char[]
char[] chars = s.toCharArray();
String 转 int
int i = Integer.parseInt([String]);
int i = Integer.valueOf(my_str).intValue();
int 转 String
String s = String.valueOf(i);
String s = Integer.toString(i);
String s = "" + i;
int 转 Integer
Integer A=new Integer(a);
Integer A=Integer.valueOf(a);
Integer 转 int
int a=A.intValue();
int[] 转 List
List<Integer> list1 = Arrays.stream(data).boxed().collect(Collectors.toList());
或
List item = castList(data, Integer.class);
public static <T> List<T> castList(Object obj, Class<T> clazz)
{
List<T> result = new ArrayList<T>();
if(obj instanceof List<?>) {
for (Object o : (List<?>) obj) {
result.add(clazz.cast(o));
}
return result;
}
return null;
}
ArrayList 转 int[]
List<Integer> list = new ArrayList<>();
int size = list.size();
先转Integer数组
Integer[] arrs = list.toArray(new Integer[size]);
for(int i = 0; i < intarrs.length; i++){
intarrs[i] = arrs[i].intValue();
}
或 直接遍历
int []intarrs=new int[size];
for(int i=0;i<intarrs.length;i++){
intarrs[i]=list.get(i);
}
判断 int 是否为空
Integer b = new Integer(a); a不可为null,否则报错
排序
Arrays.sort(es, (e1, e2) -> {
if(e1[0] == e2[0]) return e2[1] - e1[1];
return e1[0] - e2[0];
});
Arrays.sort(a, cmp);
class MyComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
//如果o1小于o2,我们就返回正值,如果o1大于o2我们就返回负值,
//这样颠倒一下,就可以实现反向排序了
if(o1 < o2) {
return 1;
}else if(o1 > o2) {
return -1;
}else {
return 0;
}
}
格式
数据结构
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) {this.val = val;}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
防止溢出
try {
sum = Math.addExact(nums[i], nums[j]);
sum = Math.addExact(sum, nums[p]);
} catch (ArithmeticException aex) {
break;
}
字符串拼接
StringBuilder sb = new StringBuilder();
sb.append(bull);
sb.append("A");
sb.append(count);
sb.append("B");
return sb.toString();
最大/小值
Math.max();
Math.min();
反射机制
public static Object getFieldValue(Object target, String fieldName){
// get field from class
Field field = target.getClass().getDeclaredField(fieldName);
// set accessability to "public"
field.setAccessible(true);
try{
// get value
return field.get(target);
} catch(IllegalAccessException e){
// or throw error
throw new IllegalStateException(e);
}
}
然后可以使用以下命令轻松地调用它:
Object value = getFieldValue(this, "sample");
遍历
for (int i : list) {
... list.get(i)...
}
list.forEach(
item -> {
...item...;
});
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
...iterator.next()...
}
Leetcode
编写一个函数来查找字符串数组中的最长公共前缀。
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs == null) {
return "";
}
String prefix = strs[0];
int count = strs.length;
for (int i = 1; i < count; i++) {
prefix = longestCommonPrefix(prefix, strs[i]);
if (prefix.length() == 0) {
break;
}
}
return prefix;
}
public String longestCommonPrefix(String str1, String str2) {
int len = Math.min(str1.length(), str2.length());
int index = 0;
while (index < len && str1.charAt(index) == str2.charAt(index)) {
index++;
}
return str1.substring(0, index);
}
}