数据结构Api
Arrays
排序
Arrays.sort(int[] arr, int fromIndex, int toIndex, 比较器); //一定是需要泛型Arrays.sort(arr, (o1, o2) -> o2 - o1); //数组全部 从大到小排序 跟Collections.sort()一样Arrays.sort(arr, 0, 3, (o1, o2) -> o2 - o1); //从大到小排序,只排序[0, 3)
列表
注意,ArrayList的扩容 需要将旧的数组的元素复制到新的数组,时间复杂度为O(n)
两种实现,ArrayList利于查找,LinkedList 利于增删。
List<Integer> list = new ArrayList<> ();// 添加元素list.add (1);list.add (2);list.add (5);list.add (6);System.out.println (list);// 移除 index = 1 的元素list.remove (1);System.out.println (list);// 移除元素 1 list.remove(Integer.valueOf (1));System.out.println (list);// 判断是否包含某个元素boolean contains = list.contains (6);System.out.println (contains);// 获取元素的个数int size = list.size ();System.out.println (size);// 判断是否为空boolean isEmpty = list.isEmpty ();System.out.println (isEmpty);// 获取 index = 1 的元素Integer res = list.get (1);System.out.println (res);// 清空 listlist.clear ();System.out.println (list);
栈
LinkedList<Integer> stack=new LinkedList<> ();// 加入元素stack.push (1);stack.push (3);stack.push (5);stack.push (2);System.out.println(stack);// 弹出元素Integer popVal = stack.pop ();System.out.println (popVal);System.out.println (stack);// 栈大小System.out.println (stack.size ());// 栈顶元素System.out.println (stack.peek ());// 判断栈是否为空System.out.println (stack.isEmpty ());
队列
LinkedList<Integer> queue=new LinkedList<> ();// 加入元素queue.offer (1);queue.offer (5);queue.offer (3);queue.offer (2);System.out.println (queue);// 弹出 队头元素Integer pollVal = queue.poll ();System.out.println (pollVal);System.out.println (queue);// 查看 队头元素System.out.println (queue.peek ());// 判断是否为空System.out.println (queue.isEmpty ());// 获取队列长度System.out.println (queue.size ());
双向队列
LinkedList<Integer> queue=new LinkedList<> ();// 加入元素queue.offerFirst (1);queue.offerFirst (3);queue.offerLast (5);queue.offerLast (8);System.out.println (queue) ; // 3 1 5 8System.out.println (queue.pollFirst ()) ; // 3System.out.println (queue) ;System.out.println (queue.pollLast ()); // 8System.out.println (queue);// 队列长度System.out.println (queue.size ());// 判断队列是否为空System.out.println (queue.isEmpty ());// 查看 左侧队头System.out.println (queue.peekFirst ());// 查看 右侧队头System.out.println (queue.peekLast ());
优先队列
在Java中的实现是 PriorityQueue
,底层是一棵树, 以小根堆为例。对于任意结点来说,该节点的值比其左右孩子的值都要小。 (就是最上面的结点最小)。 大根堆类似,最上面结点最大
// 小根堆
PriorityQueue<Integer> queue = new PriorityQueue<> ((a, b) -> a - b);
// PriorityQueue<Integer> queue = new PriorityQueue<> (100,(a, b) -> a - b);
// 加入元素
queue.offer (1);
queue.offer (5);
queue.offer (3);
queue.offer (2);
System.out.println (queue);// 获取 堆顶元素
Integer pollVal = queue.poll ();
System.out.println (pollVal); // 1
System.out.println (queue);// 查看堆顶元素
System.out.println (queue.peek ());
// 判断堆是否为空
System.out.println (queue.isEmpty ());
// 查看堆大小
System.out.println (queue.size ());
Set
/*** Set集合是一种 不允许有重复元素的集合* 无序的* 无索引* 不能有重复元素* 允许有一个null*/HashSet<Integer> set = new HashSet<> ();set.add (1);set.add (2);set.add (null);set.add (2);set.add (3);set.add (4);// 打印Set集合System.out.println (set);int size = set.size ();// 打印Set集合的大小System.out.println (size);boolean empty = set.isEmpty ();// 打印Set集合是否为空System.out.println (empty);boolean contains = set.contains (1);System.out.println (contains);// 移除指定元素set.remove (1);System.out.println (set);// 清空Set集合set.clear ();
Map
// HashMap 无序
// 可存储自定义对象
Map<String, Integer> map = new HashMap<> ();
// 添加元素 put
map.put ("小米", 2000);
map.put ("华为", 3000);
map.put ("苹果", 5000);
System.out.println (map);/*** 键 不存在,直接添加键值对* 键 存在,覆盖*/
map.put ("苹果", 6000);
System.out.println (map);// putIfAbsent 不存在键时,才添加
map.putIfAbsent ("小米", 1000);
System.out.println (map);// 获取键对应的值,不存在 返回null
Integer huawei = map.get ("华为");
System.out.println ("华为价格:" + huawei);
Integer huaweiS = map.get ("华为s");
System.out.println ("华为s价格:" + huaweiS);// 获取键对应的值,不存在 返回默认值
Integer huaweiS2 = map.getOrDefault ("华为s", 9999);
System.out.println ("华为s价格:" + huaweiS2);System.out.println ("=========================");
/*** 获取 键值对集合 来遍历map*/
Set<Map.Entry<String, Integer>> entries = map.entrySet ();
for (Map.Entry<String, Integer> entry : entries) {String key = entry.getKey ();Integer value = entry.getValue ();System.out.println (key + " " + value);
}
System.out.println ("=========================");
/*** 获取所有的键*/Set<String> keySet = map.keySet ();
for (String key : keySet) {Integer val = map.get (key);System.out.println (key + " " + val);
}
System.out.println ("=========================");/*** Lambda表达式 遍历map*/
map.forEach ((k, v) -> {System.out.println (k + " " + v);
});
System.out.println ("=========================");// 删除键值对,返回值是 键对应的值
Integer val = map.remove ("小米");
System.out.println (val);
System.out.println (map);
System.out.println ("=========================");
// 判断键是否存在
boolean keyHua = map.containsKey ("华为");
boolean keyXm = map.containsKey ("小米");
System.out.println ("华为:" + keyHua + " " + "小米:" + keyXm);
System.out.println ("=========================");
// 判断值是否存在
boolean containsValue = map.containsValue (1000);
System.out.println ("值是否存在:" + containsValue);
System.out.println ("=========================");
// 判断是否为空
boolean empty = map.isEmpty ();
System.out.println ("map为空:" + empty);
System.out.println ("=========================");// 集合大小
int size = map.size ();
System.out.println ("集合大小:" + size);
System.out.println ("=========================");
// 清空集合
map.clear ();
字符串
equals()
String s1="abc"; // 字符串池
// 字符串对象
String s2=new String ("aBc");
System.out.println (s1==s2); // 比较地址值 false
System.out.println (s1.equals (s2)); // 比较字符串内容 false
System.out.println (s1.equalsIgnoreCase (s2)); // 比较字符串内容,忽略大小写 true
charAt() 、toCharArray() 、length()
Scanner scanner = new Scanner (System.in);System.out.println ("请输入字符串:");String s = scanner.nextLine ();/*for (int i = 0; i < s.length (); i++) {System.out.print (s.charAt (i) + " ");}*/char[] chars = s.toCharArray ();for (char aChar : chars) {System.out.print (aChar+" ");}
substring()
String s = "abcdefg";
String substring = s.substring (1, 4); // len = 4 -1 = 3,返回值才是截取后的结果
System.out.println (substring); // bcd
// 手机号中间四位屏蔽
String s = "15155644987";
// 截取前三位
String s1 = s.substring (0, 3);
// 截取后四位
String s2 = s.substring (7, 11);
// String s2 = s.substring (7);
String res = s1 + "****" + s2;
System.out.println (res);
trim() 返回
去除前后空格
的新字符串 — O(n)
indexOf(String str)
返回str第一个出现的位置(int),没找到 则返回-1。 — O(m * n) m为原串长度, n为str长度
(假如要找一个字符char c,str可以表示成 String.valueOf© ,然后作为参数传进去.
s.indexOf(String str, int fromIndex); // 同上,但从fromIndex开始找 — O(m * n)
lastIndexOf(String str);
返回str最后出现的位置(int),没找到则返回-1。 — O(m * n) m为原串长度, n为str长度
(假如要找一个字符char c,str可以表示成String.valueOf©,然后作为参数传进去.
lastIndexOf(String str, int fromIndex); // 同上,
但从fromIndex开始从后往前找 [0 <- fromIndex] — O(m * n)
replace()
// 手机号中间四位屏蔽
String talk = "你玩的真好,他妈不要再玩了,TMD,SB,给我去死,傻逼东西";// 定义敏感词库
String[] dicts = {"TMD", "SB", "MLGB", "你妈", "傻逼", "去死", "他妈"};for (String dict : dicts) {// 替换后 赋给原字符串talk = talk.replace (dict, "***");
}
System.out.println (talk);
split() 、 toLowerCase() 、toUpperCase()
split(String regex); // 返回 String[],以regex(正则表达式)分隔好的字符换数组。 ---- O(n)// For example
// 从非"/"算起 若"/a/c" -> 会变成"" "a" "c"
String[] date = str.split("/"); // date[0]:1995 date[1]:12 date[2]:18 --- O(n)s = s.toLowerCase(); // 返回一个新的字符串全部转成小写 --- O(n)
s = s.toUpperCase(); // 返回一个新的字符串全部转成大写 --- O(n)
字符串拼接 StringBuilder
字符串 拼接
字符串 反转
StringBuilder sb = new StringBuilder ("abc");
sb.append (1);
sb.append (2.3);
sb.append (true);
System.out.println (sb.toString ());
StringBuilder reverse = sb.reverse ();
int length = sb.length ();
System.out.println (length); // 字符串长度
// 字符串反转
System.out.println (reverse.toString ());
数学
Math 类
// abs 求绝对值System.out.println (Math.abs (-2));System.out.println (Math.abs (2));// ceil 往 数轴的正方向进一,参数是double类型的,返回值是double类型的System.out.println (Math.ceil (3.14)); // 4System.out.println (Math.ceil (3.99)); // 4System.out.println (Math.ceil (-3.14)); // -3System.out.println (Math.ceil (-3.99)); // -3// floor 往 数轴的负方向进一,参数是double类型的,返回值是double类型的System.out.println (Math.floor (-3.14)); // -4System.out.println (Math.floor (-3.99)); // -4System.out.println (Math.floor (3.99)); // 3System.out.println (Math.floor (3.14)); // 3// max 求最大值,参数可以是int、double、float、long等System.out.println (Math.max (1, 2)); // 2System.out.println (Math.max (2, 1)); // 2System.out.println (Math.max (2, 5)); // 5// min 求最小值,参数可以是int、double、float、long等System.out.println (Math.min (1, 2)); // 1System.out.println (Math.min (2, 1)); // 1System.out.println (Math.min (2, 5)); // 2// pow 求幂, 第一个参数是底数, 第二个参数是指数,参数类型是double类型的// 结果是一个double类型的数System.out.println (Math.pow (2, 3)); // 8System.out.println (Math.pow (2, 4)); // 16System.out.println (Math.pow (2, 5)); // 32// round 四舍五入,参数是double类型的,返回值是long类型的System.out.println (Math.round (3.14)); // 3System.out.println (Math.round (3.5)); // 4System.out.println (Math.round (3.99)); // 4System.out.println (Math.round (-3.14)); // -3
Integer
// 将字符串转换为intInteger integer = Integer.valueOf ("123");System.out.println (integer);// 求int的最大值int maxValue = Integer.MAX_VALUE;System.out.println (maxValue);// 求int的最小值int minValue = Integer.MIN_VALUE;System.out.println (minValue);// 将字符串转换为int ----->Integer.parseIntint i = Integer.parseInt ("4500");System.out.println (i);