【Java】带你用Java玩转力扣

写在前面

我之前一直是以Golang为主语言的,最近开始转Java,包括平时刷题(欢迎来互粉哈: 千杉沐雪的力扣)的语言也改为使用Java。

在转语言的过程中,总避免不了要频繁地查基本的语法和一些常见函数操作。为了方便其他也有类似需要的朋友,我特此将我记的一些笔记重新梳理后发上来分享。

本文主要目标:

  1. 提供常用工具类的介绍,如:字符串,日期,随机数,正则等;
  2. 提供常见集合的介绍和操作,如:List,Map,堆栈等;
  3. 介绍一些Java与其他语言可能不一样的语法,如:数组操作,可变长参数等;

常用类

String类

基本知识

java中所有的字符串值都是用String类的实例实现,比如: String str = "abc";等价于String str = new String(new char[]{'a','b','c'});
通过String类的函数和构造函数,可以实现char[], byte[]和String的互转。

注意事项
  1. 字符串本身是常量,在创建后不能更改
  2. 判断内容相等需要用equals判断(默认是比较地址,但是String类重写了equals方法为比较内容),直接用==还是比较地址,不能比较内容
其他功能
  • 替换:"hello".replace("l", "k")
  • 去除字符串的两端空格:" hello ".trim() => "hello"
  • 字典序排序比较 —— 比较第一个不相等的字符做减法:"habc".compareTo("hz"),相当于'a'-'z'=-25
String和Int互转
  1. Int转字符串
System.out.println(String.valueOf(123));
System.out.println(123+"");
  1. 字符串转Int
System.out.println(Integer.parseInt(“123"));

StringBuffer/StringBuilder类 - 可变长字符串

分类
  • StringBuffer 线程安全的可变字符串
  • StringBuilder 单线程场景下的可变字符串,所有操作完全一样
    有capacity()和length()两个概念:空对象的容量为16,长度为0
背景

一个长字符串拼接时,由于字符串不可更改,这个过程中会生成一大堆String对象

String a = "";
for(int i=0;i<10;i++){
     a += i;
}

使用StringBuffer/StringBuilder在拼接(append)过程中使用同一对象,内存地址不变!

常用操作
StringBuffer sb = new StringBuffer();
sb.append("123").append("456"); // 追加
sb.insert(5, “hi”) // 在第5个字符之后插入
System.out.println(sb); // “12345hi6”
StringBuffer/StringBuilder和String的互转
  • String => StringBuffer:创建一个空对象,append String进去即可
  • StringBuffer => String:sb.toString() 方法
作为形参使用
  • String作为形参要当做基本类型,复制值;
  • StringBuffer即为普通的引用类型,形参会改变;

日期类 Date

获取当前时间戳
new Date().getTime(); // 毫秒,除以1000即是秒
日期转字符串 - 需要用到SimpleDateFormat类
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
System.out.println(sdf.format(d));
字符串转日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
try {
    Date d2 = sdf.parse("2021-08-08 22:08:04");
} catch (ParseException e) {
    e.printStackTrace();
}

随机数 Random

使用默认随机种子(当前毫秒时间戳):Random r = new Random();
使用随机种子(相同种子生成相同随机数序列):Random r = new Random( int seed );
获取随机数:r.nextInt(n); // 返回[0,n)范围内的随机数

正则表达式 Pattern/Matcher

基本用法

用字符串的方法即可,判断目标字符串是否满足正则表达式/按照正则表达式替换

        // 示例的正则,20xx年份
        String regex = "20\\d\\d";

        // 1. 基本用法,判断是否符合正则的格式
        System.out.println("2019".matches(regex)); // true
进阶用法

遍历目标字符串中所有满足正则表达式的子串替换操作

        // 1. 依次找到所有符合条件的字符串并输出
        Matcher m = Pattern.compile(regex).matcher("2033,2088,1977,哈哈");
        while (m.find()) {
            System.out.println(m.group() + "子串的起始位置:" + m.start() + ",其结束位置:" + m.end());
        }

        // 2.1 正则匹配后替换,用matcher
        System.out.println(m.replaceAll("[%year%]"));

Integer类

int类型的最大值,最小值(做比较时常用):Integer.MAX_VALUE, Integer.MIN_VALUE

Math的各类操作:

  1. 最大/最小/绝对值(支持int,float,double等各数值类型):
Math.max(a,b); 
Math.min(a,b); 
Math.abs(a);
  1. 求幂:
Math.pow(double a, double b) // a的b次方
  1. 求平方跟:
Math.sqrt(double a) // a开根号

集合/泛型

泛型

基础知识
  • 是一种将明确类型的工作推迟到创建对象或者调用方法时才去明确的特殊类型。
  • 避免了由于对集合使用Object代表任意类型,导致容器中对象类型前后不一致的问题:在编译时报错
  • 只能用于引用类型,不能用于基本类型(用包装类替代,如Integer,Character代替int, char)。
  • 一般在集合中使用,比如List<Integer> l = new ArrayList<>();
根据指定泛型的具体类型的位置区分:
  • 泛型类:public class ObjectTool<T>{}
  • 泛型接口:public interface ObjectInt<T>{}
  • 泛型方法:public <T> objectMethod(T t){}
高级通配符

假设 Class Dog extends Animal {}

  • ?:表示任意类
  • ? extends E:向下限定,需要是E及其子类,比如List<? extends Animal> l = new ArrayList<Dog>();
  • ? super E:向上限定,需要是E及其父类,比如List<? super Animal> l = new ArrayList<Animal>();

集合

为了方便对于多个对象的操作,提供了集合:和数组的区别在于,数组长度固定而集合长度可变。

集合只存储对象(用包装类,比如Integer,Character代替基础数据类型)。
可使用迭代器遍历集合:

Iterator<Integer> i = a.iterator();
while(i.hasNext()){
    System.out.println(i.next());
}

集合介绍和常见操作

Map 字典
  1. 初始化操作
Map<Integer> m = new HashMap<>(); // 最常用,线程不安全的哈希表;线程安全可用ConcurrentHashMap
  1. 遍历操作
for (Map.Entry<String, String> entry : map.entrySet()) {          
    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
  1. 读写操作
// 正常写入
map.put(k,v);
//  value为容器时写入空
map.putIfAbsent(key, new ArrayList<>());
//  正常读
map.get(k);
// 带默认值的读
map.getOrDefault(domTreat,0);
List 列表
  1. 初始化操作
List<String> result = new ArrayList<>(); // 基于数组实现的列表;基于链表实现LinkedList
  1. 遍历操作
for ( String tmp: l ) {
    System.out.println(tmp);
}
  1. 读写操作
// 添加:
list.add(Object a); 
list.set(int idx, Object a);
// 读:
list.get(int idx);
// 删除:
list.remove(Object a); list.remove(int idx);
// 排序:
Collections.sort(list, (a,b) -> a.compareTo(b))
// 逆序:
Collections.reverse(list); 
Stack 栈
  1. 初始化操作
Stack<Integer> = new Stack<>(); // 基于Vector实现(List的一种,底层为数组)
  1. 入栈/出栈操作
T pop() // 出栈
push(T t) // 入栈
T peek() // 获取栈顶
Queue 队列
  1. 初始化操作
Queue<Integer> = new LinkedList<>(); // LinkedList实现了Queue接口
  1. 入队/出队操作
offer(T t) // 加入到队尾
T poll() // 队列头出队
T peek() // 获取队列头
PriorityQueue 堆
  1. 初始化操作
PriorityQueue<Integer> heap = new PriorityQueue<>((a,b)->a-b);

构造函数中为使用lambda表达式简化Comparator的写法
用于表明a和b的关系,如上所示就是小根堆

  1. 入堆/出堆操作
offer(T t) // 加入到堆中
T poll() // 删除堆顶
T peek() // 获取堆顶

其他语法

数组

  1. 声明和初始化
  • 动态声明:给定长度并通过new关键字申请内存空间,系统用默认值初始化(比如int是0):
    int[] a = new int[5];
  • 通过字面量声明:
    int[] t = new int[]{1,2,3,4};可以简写为 int []a = {1,2,3,4,5};
  1. 打印:
  • 直接打印是出内存地址:System.out.println(array);
  • 一维数组可以用容器方法转换:System.out.println(Arrays.toString(array));
  1. 赋值:数组为引用类型,存储在堆上,所以赋值是给的内存地址
int[] t = new int[5]; 
int[] s = t;

遍历:

for(int i=1;i<nums.length;i++) { 
    System.out.println(nums[i]);
}

可变长参数

参数长度可变化,在方法内获取参数时实际上就是数组

public void testParams(int... a){
    for(int x:a){
        System.out.println(a);
    }
}

testParam(1,2,3,4,5); // 使用

参考

  1. Java Pattern类和Matcher类的使用
  2. Java map 详解 - 用法、遍历、排序、常用API等
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容