惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
F
Fortinet All Blogs
Engineering at Meta
Engineering at Meta
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
The Exploit Database - CXSecurity.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
Intezer
P
Privacy & Cybersecurity Law Blog
M
MIT News - Artificial intelligence
MyScale Blog
MyScale Blog
P
Privacy International News Feed
MongoDB | Blog
MongoDB | Blog
Project Zero
Project Zero
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tenable Blog
Security Latest
Security Latest
Stack Overflow Blog
Stack Overflow Blog
L
Lohrmann on Cybersecurity
V
Vulnerabilities – Threatpost
Microsoft Azure Blog
Microsoft Azure Blog
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
L
LangChain Blog
Simon Willison's Weblog
Simon Willison's Weblog
WordPress大学
WordPress大学
SecWiki News
SecWiki News
博客园 - 三生石上(FineUI控件)
Forbes - Security
Forbes - Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
GRAHAM CLULEY
K
Kaspersky official blog
W
WeLiveSecurity
A
Arctic Wolf
TaoSecurity Blog
TaoSecurity Blog
Recorded Future
Recorded Future
AI
AI
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Last Week in AI
Last Week in AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
雷峰网
雷峰网
GbyAI
GbyAI
S
SegmentFault 最新的问题
N
News and Events Feed by Topic
C
CXSECURITY Database RSS Feed - CXSecurity.com
Google Online Security Blog
Google Online Security Blog
博客园 - Franky
罗磊的独立博客

LINUX DO - 最新话题

谷歌云盘下载700g数据集,求方法 OpenAI推出了100美元的Pro订阅后,plus的Codex 5小时限额大幅缩水 之前买的super grok居然还没掉 关于CPA认证文件周限 佬们,默认CDK的要求是什么等级啊? 最新版本的微信群聊机器人方案 有没有人知道如何free号没有封,那么是否可以循环使用,因为我看主要是周限 L站改版了?吓我一跳,我以为我浏览器崩了 淘宝这种宽带可信吗,500兆移动宽带月费8元到2099年 docker内部应用访问宿主机mysql和redis时被拒绝connection refuse Erp全栈想转行做Ai有什么推荐的吗 boost有bug 佬们,有没有靠谱点的 Plus 购买渠道 大妈,狗妈用的 lg 服务有源头开源项目吗? 有人有能过验证码打码的嘛 上次帖里好像发过通过大模型来打码的 gpt plus 封号似乎也太快了点,一天就给封号了 按流量/token收费的国产官方AI推荐 我算是知道了为什么Oracle总是ABC了 佬友们帮我分析一下 ChatGPT Team账号只有一个人使用和4个席位邀请满了使用的总额度是一样的吗? gpt-free 10个带rt CPA反代claude是默认1m吗? 我终于敢说我做出来windows上tmux的替代了,目标windows/全平台最强的终端Ai编程工具 claude pro升级max,除了原来的$20,好像还能再领一次$100 关于AI agent的知识框架 独乐乐不如众乐乐,分享一下我的的AI对话程序 佬们自建网站支付问题是怎么解决的 怎么能让gpt模仿claude风格输出 codex free已经死了,下一个会是plus或者team吗 请问chatgpt pro里的fast模式,速度快了,降智吗 天才程序员想要复活,还有可用的codex公益站么 里斯本丸沉没照进现代了 [富可敌国] [一叶知秋API]友仔们 我们换域名了~~ 记得更新一下哦 有点莫名其妙,被阿里云警告了 从道观回家之前,我和师兄问道 【picpi 皮皮公益站】为了防止有人拿去卖,邀请码发放规则更新。 美国 FAA: 我们需要你,游戏玩家,来当空管吧 vibe时用文言省tok吗? 有没有用? 会降表现吗? Codex CLI 官方这个 imagegen 的 Skill 到底是干啥的?哪有对应工具啊? 求问关于尼区和美区开通Claude 换设备登录telegram国内号码老账号 需要收费咋办? 发现hotmail的额度特别耐用 最近还有能正常用的claude中转站吗? 避雷闲鱼上面的CC中转站 现在cursor的优势是什么呢? OpenAI 回应马斯克要求罢免奥尔特曼:搞法律突袭,扰乱诉讼 谁在吹opencode go套餐啊,又慢量又少 【SamAltman】奥特曼被燃烧瓶袭击后的回应 咸鱼上359买的claude MAX 5x ,美国假家宽,看看能活几天 想问问跳蚤市场开的Pro和Plus 虚拟卡链接求助 [开源插件] 做了一个适合科研佬的GPT插件 【AI小说】拿AI跑了一部小说,佬们看看质量怎么样 总是能在首页看到opus4.6鞭尸推送 这个别名邮箱可以注册gpt 一个人在外地的话,佬们周末都做什么 你们ddg还能行不 获取不到新的邮箱 了····· claude code修复codex windows升级0.120.0 无法打开问题 我现在Zeabur上搭建了CPA服务,怎么再接入new api来做分发 杭州有么有佬友在搞AI应用这块的,四年前端转AI开发 汇丰、渣打两家银行获得香港稳定币牌照 【开源推广】 AIUsage:聚合多个 AI 平台配额与用量的 高颜值 macOS端 CPA看板 APP Newapi吃服务器内存多吗 中行跨境通疑限制无卡连续交易 或为应对盗刷 突然不能用表情回应话题了 codex是不是降额度了 反馈关于 “快问快答”标签的乱象 opencode版本1.4.3 无法上传图片问题 想问一下怎么解决这个问题,就是终端太多? codex更新到0.120.0之后无法加载以前的会话 sub2api怎么部署? 分享一个自用的南京继续教育平台视频自动播放下一集的油猴脚本 zotero9出来了 Claude正在向我推销付费项目,那能让你轻易得逞嘛 甲骨文用脚本开出来4个2+12咋办啊佬们,我还是免费号 各个厂的coding plan lite都绝版了? claude code 20美金账户问题 联通元景套餐续费问题 ai时代下的一些思考(诚邀大家讨论) 出境易GPT订阅pro求助 今年到目前股市的操作。 刚收到短信之前跑路的那家可以兑换了 佬们都用境外服务器做什么呢? 甲骨文4+24 求助领pro时候报错-付款页面出错。请重试。如果问题依然存在,请访问help.openai.com。 cloudflare 浏览器渲染增加了 CDP与mcp支持 SUB2API 导入 rt 时报错显示 Request failed with status code 502 如何解决 讨论一下怎么整理笔记 codex0.120.0更新后无法启动,回退 0.119.0正常使用 冰佬的公益站也不行了吗 三角洲直接给我封了10年 有佬友知道怎么起诉么 88VIP邀请 经过排查大概确定反重力代理报错问题了 【求助】openrouter 今年4月用国内visa卡充值后导致封禁,无法使用外国模型 奥特曼家被炸 自用,高信息量回复收集 求助sub2api分组问题 【新人报道】注册成功了 分享100个codex free账号 招聘 深圳客户端开发(flutter) 20k+
古法编程java之Arrays、日期类、大数类及练习题
pkqbszs (皮卡丘不是竹鼠) · 2026-06-16 · via LINUX DO - 最新话题

Arrays

Arrays类的常见方法

1.toString:返回数组的字符串形式

2.sort:自然排序or定制排序

定制排序写法如下

public static void main(String[] args) {
    int[] arr = {1, 5, 3, 9, 2, 7, 4, 6, 8};
​
    bubbleSort(arr, new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            return ((Integer) o2).compareTo((Integer) o1);
        }
    });
​
    for (int i : arr) {
        System.out.println(i);
    }
}
​
public static void bubbleSort(int[] arr, Comparator c) {
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if (c.compare(arr[j], arr[j + 1]) > 0) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

3.binarySearch:通过二分搜索进行查找,要求传入的数组必须排好序,返回查找值的索引

int index = Arrays.binarySearch(arr, target);

4.copyOf:数组元素的复制

Integer[] newArr = Arrays.copyOf(arr, arr.length);

5.fill:数组元素的填充

Integer[] num = new Integer[]{9,3,2};
Arrays.fill(num, 99);

6.equals:比较两个数组元素内容是否完全一致

boolean equals = Arrays.equals(arr1, arr2);

7.asList:将一组值转换成list

List<Integer> asList = Arrays.asList(2,3,4,5,6,1);

课堂练习

第一题

案例:自定义Book类,里面包含 name 和 price ,按 price 排序(从大到小)。实现对对象的某个属性排序,已有Book[] books = 4本书对象。
要求:使用前面学习过的传递、实现Comparator接口匿名内部类(定制排序)完成该任务。
Book[] books = new Book[4];
books[0] = new Book("红楼梦", 100);
books[1] = new Book("金瓶梅", 90);
books[2] = new Book("青年文摘", 5);
books[3] = new Book("java从入门到放弃", 300);

答案:

public static void main(String[] args) {
    Book[] books = new Book[4];
    books[0] = new Book("红楼梦~", 100);
    books[1] = new Book("金瓶梅", 90);
    books[2] = new Book("青年文摘", 5);
    books[3] = new Book("java从入门到放弃", 300);
​
    bubbleSort(books, new Comparator() {
        @Override
        public int compare(Object o1, Object o2){
            Book book1 = (Book) o1;
            Book book2 = (Book) o2;
            double diff = book1.getPrice() - book2.getPrice();
            if (diff > 0){
                return -1;
            }else if (diff < 0){
                return 1;
            }else {
                return 0;
            }
        }
    });
​
    bubbleSort(books, new Comparator(){
        @Override
        public int compare(Object o1, Object o2){
            Book book1 = (Book) o1;
            Book book2 = (Book) o2;
            return book1.getName().length() - book2.getName().length();
        }
    });
​
    for (Book book : books) {
        System.out.println( book);
    }
}
​
public static void bubbleSort(Book[] books, Comparator c){
    for (int i = 0; i < books.length-1; i++) {
        for (int j = 0; j < books.length-1-i; j++)
            if (c.compare(books[j], books[j+1]) > 0){
                Book temp = books[j];
                books[j] = books[j+1];
                books[j+1] = temp;
            }
    }
}

解析:

要注意 getPrice 返回的是 double 类型,但是 compare 返回的是 int 类型。

这个时候不可以直接把它强转成 int 类型,因为可能会有零点几的精度被忽略,从而造成错误。同时也不能用三元运算符,因为 compare 默认两个对象相等时要返回 0,而如果只用三元运算符,就没有返回 0 的情况了。

System类

常见方法

1.exit:退出当前程序

2.arraycopy:复制数组元素,比较适合底层调用,一般使用 Arrays.copyOf 完成复制数组。

3.currentTimeMillis:返回当前时间距离1970-1-1的毫秒数

4.gc:运行垃圾回收机制 System.gc();

大数(BigInteger和BigDecimal)

应用场景:

  • BigInteger适合保存比较大的整数。

  • BigDecimal适合保存比较大的浮点数

BigInteger使用:

BigInteger a = new BigInteger("123333332135213333333333333222224432153332233");
BigInteger b = new BigInteger("123");
a = a.add(b);
System.out.println(a);
BigInteger c = new BigInteger("123");
b = b.subtract(c);
System.out.println(b);
a = a.multiply(a);
System.out.println(a);
a = a.divide(c);
System.out.println(a);

BigDecimal使用:

BigDecimal bd1 = new BigDecimal("21321342140.1242350124");
System.out.println(bd1);
BigDecimal bd2 = new BigDecimal("0.1242350124");
BigDecimal add = bd1.add(bd2);
System.out.println(add);
BigDecimal subtract = bd1.subtract(bd2);
System.out.println(subtract);
BigDecimal multiply = bd1.multiply(bd2);
System.out.println(multiply);
BigDecimal divide = bd1.divide(bd2, 10, RoundingMode.CEILING);
System.out.println(divide);

除法要注意:可能遇到无限循环小数,需要添加ROUND_CEILING

日期类

内容略

包装类小练习

第一题

(1) 将字符串中指定部分进行反转。比如将 “abcdef” 反转为 “aedcbf”

(2) 编写方法 public static String reverse(String str, int start , int end) 实现该功能

public static void main(String[] args) {
    String str = "abcdef";
    int start = 0;
    int end = str.length();
    if (!(str != null && start >= 0 && end <= str.length() && start < end)) {
        throw new RuntimeException("参数有误");
    }
    System.out.println(reverse(str, start, end));
}

public static String reverse(String str, int start, int end) {
    String str_rev = str.substring(start, end);
    String str_rev_new = new StringBuffer(str_rev).reverse().toString();
    String result = str.substring(0, start) + str_rev_new + str.substring(end);
    return result;
}

解析:

题目没说不能用包装类已有的方法,所以就直接用就好了。对于这种比较复杂的条件判断,如果写错误情况不容易写出来的话,你就直接把唯一的正确条件写进去,然后再给正确的条件取反。

第二题

输入用户名、密码、邮箱,如果信息录入正确,则提示注册成功,否则生成异常对象
要求:
(1) 用户名长度为2或3或4
(2) 密码的长度为6,要求全是数字 ‘12345’
(3) 邮箱中包含@和. 并且@在.的前面

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入用户名、密码和邮箱");
    String name = scanner.next();
    String pwd = scanner.next();
    String email = scanner.next();

    try {
        Login login = new Login(name, pwd, email);
        System.out.println(login);
    } catch (Exception e) {
        System.out.println(e.getMessage());;
    }
}

class Login {
    private String name;
    String pwd;
    String email;

    public Login(String name, String pwd, String email) {
        if (!(name.length() >= 2 && name.length() <= 4)) {
            throw new RuntimeException("用户名长度必须在2-4之间");
        }
        if (!(isNumeric(pwd) && pwd.length() == 6)) {
            throw new RuntimeException("密码必须是数字且长度为6");
        }
        if (!(email.contains("@")) || !(email.contains(".")) || email.indexOf("@") > email.lastIndexOf(".")) {
            throw new RuntimeException("邮箱格式错误");
        }
        this.name = name;
        this.pwd = pwd;
        this.email = email;
    }

    private static boolean isNumeric(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    @Override
    public String toString() {
        return "Login{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

第三题

(1) 编写java程序,输入形式为:Han Shun Ping的人名,以Ping,Han .S的形式打印出来 。其中.S是中间单词的首字母。

(2) 例如输入“William Jefferson Clinton”,输出形式为:Clinton,William .J

答案(我的版本):

public static void processName(String name) {
    String[] strs = name.split(" ");
    String res = strs[2] + "," + strs[0] + " ." + strs[1].charAt(0);
    System.out.println(res);
}

答案(老师写的):

public static void processName(String name) {
    if (name == null) {
        System.out.println("name is null");
        return;
    }

    String[] names = name.split(" ");
    if (names.length != 3) {
        System.out.println("name is not valid");
        return;
    }

    System.out.println(String.format("%s,%s .%c", names[2], names[0], names[1].toUpperCase().charAt(0)));
}

第四题

输入一个字符串,判断里面有多少个大写字母、多少个小写字母和多少个数字

答案:

public static void main(String[] args) {
    String str = "fDFHNqe1 20h13rAoHI Ufiohn2149y349dgfuo21pofq";
    int up = 0;
    int low = 0;
    int num = 0;
    for (int i = 0; i < str.length(); i++) {
        if (Character.isUpperCase(str.charAt(i))) {
            up++;
        } else if (Character.isLowerCase(str.charAt(i))) {
            low++;
        } else if (Character.isDigit(str.charAt(i))) {
            num++;
        }
    }

    System.out.println(
            "大写字母有:" + up + "\t小写字母有:" + low + "\t数字有:" + num
    );
}

第五题:

已知 Animal 类有属性 name,可以通过有参构造为属性赋值,判断下面的程序输出什么。

class Animal {
    String name;
    public Animal(String name) {
        this.name= name;
    }
}

String s1="hspedu";
Animal a = new Animal(s1);
Animal b = new Animal(s1);
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a.name==b.name);
String s4= new String("hspedu");
String s5 = "hspedu";

System.out.println(s1==s4);
System.out.println(s4==s5);

String t1 = "hello"+s1;
String t2 = "hellohspedu";
System.out.println(t1.intern()==t2);

答案:

false
false
true
false
false
true
前两个比较简单,它比较的是对象 a 和 b(Animal 对象)。a == b 和 a.equals(b) 判断的都是两个对象的地址是否相等,由于它们两个都是 new 出来的,所以显然结果都是 false。如果 Animal 类重写了 equals 方法的话,那判断逻辑就另说了。

第三个判断是 a.name 和 b.name,判断的是两个字符串引用是否指向同一个地址(即是否为同一个对象)。也就是说,它不是逐字符比较,而是比较这两个字符串的地址;但由于它们指向的都是 s1 这个字符串对象,所以确实一致。

关于 s1 和 s4:

1. 我们之前学过,s1 这种直接赋值字符串的方式,是直接指向字符串常量池中的对象。
2. 而 s4 这种通过 new 出来的,是在堆中创建一个新的 String 对象。
3. 至于 s4 == s5,比较的是地址,结果为 false(虽然它们的内容相同);而 s1 和 s5 都指向常量池中的同一个字符串,所以 s1 == s5 为 true。

最后看最后一个判断:

t1 = "hello" + s1 这种写法,是不会在常量池中创建 "hellohspedu" 的。因为 s1 是变量,拼接操作在运行时使用 StringBuilder 进行,在堆中创建了一个新的 String 对象。所以刚刚创建好 t1 的时候,常量池中并没有 "hellohspedu"。

而 t2 = "hellohspedu" 这种写法,是直接引用(或创建)字符串常量池中的 "hellohspedu"。

intern 方法会去常量池中查找是否有与 t1 内容相同的字符串:
1. 如果没有,就把 t1 对象的引用记录添加到常量池中,并返回该引用。
2. 如果有的话,就直接返回常量池中已有对象的引用。

因此 t1.intern() 返回的是常量池中 "hellohspedu" 的地址,与 t2 指向同一个对象,所以结果为 true。

t1 和 s4 一样,都是指向 String