Java中的一些基础代码片段_5


=Start=

缘由:

现在很少做纯Java开发的工作,但有时候又少不了用Java实现一些功能,对于部分常见的功能不应该每次都去即时Google,一个是浪费时间,再一个是缺少积累,所以,每隔一段时间就尝试着把最近碰到的问题、方法记录一下,方便以后参考。

正文:

参考解答:
1、字符串判等

面试题:请解释字符串比较之中“==”和equals()的区别?

  •  ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;
  •  equals():比较的是两个字符串的内容,属于内容比较。

以后进行字符串相等判断的时候都使用equals()。

一、Java中的数据类型和“==”的含义:

  • 基本数据类型(也称原始数据类型):byte,short,char,int,long,float,double,boolean。它们之间的比较,应用双等号(==),因为要比较的是它们的值。
  • 引用数据类型:当它们用(==)进行比较的时候,比较的是它们在内存中的存放地址(确切的说,是堆内存地址)。

注:对于第二种类型,除非是同一个new出来的对象,它们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。

二、Java中的equals()方法介绍:

Java当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,equals的源码是这样写的:

public boolean equals(Object obj) {
    //this - s1
    //obj - s2
    return (this == obj);
}

可以看到,这个方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String、Integer、Date。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。 所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。

 

2、字符(串)替换

使用「双引号」包裹(即便需要转义),而不用「单引号」包裹。

message = message.replaceAll(",", "\",\"").replaceAll(":", "\":\"").replaceAll(" ", "");

wifiObject.getString("ssid").replace("\"", "").toLowerCase();

 

3、json数组解析
// String wifiStr = "[{\"bssid\":\"12:34:56:78:c4:90\",\"ssid\":\"wifi-1\"},{\"bssid\":\"12:34:56:78:c4:a9\",\"ssid\":\"wifi-2\"},{\"bssid\":\"12:34:56:78:c4:a8\",\"ssid\":\"wifi-3\"}]";

String wifiStr = dataObject.getString("wifiList");
if (wifiStr == null || "unknown".equals(wifiStr.toLowerCase()) || !wifiStr.startsWith("[")) {
    return null;
}
JSONArray wifiList = dataObject.getJSONArray("wifiList");
JSONObject wifiObject = null;
for (int i = 0; i < wifiList.size(); i++) {
    wifiObject = wifiList.getJSONObject(i);
    System.out.println("wifi_name: " + wifiObject.getString("ssid").replace("\"", "").toLowerCase());
    System.out.println("wifi_mac: " + wifiObject.getString("bssid"));
}

 

4、一些Java基础编程练习题资源

 

参考链接:

=END=

,

《“Java中的一些基础代码片段_5”》 有 13 条评论

  1. 你遇到过哪些质量很高的 Java 面试?
    https://www.zhihu.com/question/60949531
    `
    提醒大家:java只是一个工具;应用必不可少,但是基础知识是安身立命以及决定自己上限的东西。

    下面为拼多多、饿了么、蚂蚁金服、哈啰出行等公司给我留下较深印象的一些java面试题:

    private修饰的方法可以通过反射访问,那么private的意义是什么
    Java类初始化顺序
    对方法区和永久区的理解以及它们之间的关系
    一个java文件有3个类,编译后有几个class文件
    局部变量使用前需要显式地赋值,否则编译通过不了,为什么这么设计
    ReadWriteLock读写之间互斥吗
    Semaphore拿到执行权的线程之间是否互斥
    写一个你认为最好的单例模式
    B树和B+树是解决什么样的问题的,怎样演化过来,之间区别
    写一个生产者消费者模式
    写一个死锁
    cpu 100%怎样定位
    String a = “ab”; String b = “a” + “b”; a == b 是否相等,为什么
    int a = 1; 是原子性操作吗
    可以用for循环直接删除ArrayList的特定元素吗?可能会出现什么问题?怎样解决
    新的任务提交到线程池,线程池是怎样处理
    AQS和CAS原理
    synchronized底层实现原理
    volatile作用,指令重排相关
    AOP和IOC原理
    Spring怎样解决循环依赖的问题
    dispatchServlet怎样分发任务的
    mysql给离散度低的字段建立索引会出现什么问题,具体说下原因
    其它经常问的HashMap底层实现原理,常规的多线程问题考的太多了,没什么新意就不写了

    平时不能光抱着应用Java的目的去学习,要深入了解每个知识点背后底层实现原理,为什么这么设计,比如问烂的HashMap 既然有hash进行排位还需要equals()作用是什么?就这个问题照样能问倒一些人,所以一定要抠细节,真的把每个知识点搞懂

    一时记起来的就是这23个吧,其它想起来后续补充。
    `

  2. Java中如何将一个对象转换成json字符串?
    java convert object to json fastjson

    fastjson生成和解析json数据
    https://blog.csdn.net/neu_yousei/article/details/23184727
    `
    一. fastjson生成json字符串(JavaBean,List,List,List<Map)
         String jsonStrng = JSON.toJSONString(object);

    二. fastjson 解析json字符串为四种类型
          1. JavaBean

              Person person = JSON.parseObject(jsonString, Person.class);

          2. List

              List listPerson =JSON.parseArray(jsonString, Person.class);

          3. List

              List listString = JSON.parseArray(jsonString, String.class);

          4. List<Map>

              List<Map> listMap = JSON.parseObject(jsonString, new TypeReference<List<Map>>(){}); //(注意:此处可看出fastjson反射机制比gson更准确, id = 1001 通过fastjson反射仍是 id = 1001 , 而通过gson反射结果 为 id =1001.0 ,参考前篇程序运行结果图GSON方式生成和解析json数据)
    `
    https://stackoverflow.com/questions/26911603/converting-mapstring-object-to-json

  3. 在Java中如何计算字符串中某个字符出现的次数?
    https://stackoverflow.com/questions/275944/how-do-i-count-the-number-of-occurrences-of-a-char-in-a-string
    `
    #方法一(原生方法,推荐)
    int count = line.length() – line.replace(“.”, “”).length();

    #方法二(借助 StringUtils 包)
    int count = StringUtils.countMatches(“a.b.c.d”, “.”);
    // Spring Framework’s
    int occurance = StringUtils.countOccurrencesOf(“a.b.c.d”, “.”);
    `
    http://commons.apache.org/proper/commons-lang/

  4. 原创 | 不了解这12个语法糖,别说你会Java!
    https://mp.weixin.qq.com/s/EBnM7QAOPjDk5bG3M0Mu-w
    `
    糖块一、 switch 支持 String 与枚举
    糖块二、 泛型
    糖块三、 自动装箱与拆箱
    糖块四 、 方法变长参数
    糖块五 、 枚举
    糖块六 、 内部类
    糖块七 、条件编译
    糖块八 、 断言
    糖块九 、 数值字面量
    糖块十 、 for-each
    糖块十一 、 try-with-resource
    糖块十二、Lambda表达式
    `

  5. Java程序中如何定时执行某段功能代码?
    https://stackoverflow.com/questions/11361332/how-to-call-a-method-on-specific-time-in-java
    http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html
    `
    借助 java.util.Timer 类实现。

    // 设定在「时间time」或「delay毫秒之后」执行 task 功能
    schedule(TimerTask task, Date time)
    schedule(TimerTask task, long delay)

    // 设定在「delay毫秒之后」执行 task 功能,并且以后在「每隔period毫秒之后」循环执行
    schedule(TimerTask task, long delay, long period)
    scheduleAtFixedRate(TimerTask task, long delay, long period)

    // 设定在「时间firstTime」执行 task 功能,并且以后在「每隔period毫秒之后」循环执行
    schedule(TimerTask task, Date firstTime, long period)
    scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
    `

  6. Java中如何将毫秒转换成「时:分:秒」的形式?
    https://stackoverflow.com/questions/42655647/milliseconds-to-hoursmore-than-24
    `
    System.out.println(LocalDateTime.now());

    long millis = System.currentTimeMillis();
    System.out.println(millis);

    long hoursMath = (millis / 3600000) % 24; // 需要考虑时区的概念,否则不一定准确
    long minutesMath = ((millis % 3600000) / 60000) % 60;
    long secondsMath = ((millis % 60000) / 1000) % 60;
    String outMath = String.format(“%02d:%02d:%02d”,hoursMath, minutesMath, secondsMath);
    System.out.println(outMath);
    `
    Java中的时间相关的常量
    https://stackoverflow.com/questions/2442486/time-consts-in-java

  7. Java switch case 语句
    https://www.runoob.com/java/java-switch-case.html
    `
    switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。

    public class Test
    {
    public static void main(String[] args)
    {
    String str = “two”;
    switch(str) {
    case “one”:
    System.out.println(“one”);
    break;
    case “two”:
    System.out.println(“two”);
    break;
    case “three”:
    System.out.println(“three”);
    break;
    default:
    System.out.println(“no match”);
    }
    }
    }
    `
    Java中的Switch对整型、字符型、字符串型的具体实现细节
    https://www.hollischuang.com/archives/61

  8. Java 编码技巧之高效代码 50 例
    https://mp.weixin.qq.com/s/CqVgOJGGK8hPN9FielHuRg
    `
    世界上只有两种物质:高效率和低效率;
    世界上只有两种人:高效率的人和低效率的人。
    — 萧伯纳

    同理,世界上只有两种代码:高效代码和低效代码;
    世界上只有两种人:编写高效代码的人和编写低效代码的人。
    如何编写高效代码,是每个研发团队都会面临的一个重大问题。

    本文作者根据实际经验,查阅了大量资料,总结了”Java 高效代码 50 例”,让每一个 Java 程序员都能编写出”高效代码”。
    `

    Java 编程技巧之数据结构
    https://mp.weixin.qq.com/s/krp-QdvnKYOYqEgoadI1Zw

  9. Java在字符串相等比较时如何避免空指针异常?
    Compare Strings avoiding NullPointerException [duplicate]
    https://stackoverflow.com/questions/43409500/compare-strings-avoiding-nullpointerexception
    `
    // 使用下面的方式
    if (“something”.equals(your_string)) {
    // Do something
    }
    // 而不是
    if (your_string.equals(“something”)) {
    // Do something
    }
    `
    https://stackoverflow.com/questions/5712100/interview-java-equals
    https://softwareengineering.stackexchange.com/questions/313673/is-use-abc-equalsmystring-instead-of-mystring-equalsabc-to-avoid-null-p

  10. 理解Java8中的时间API
    https://mp.weixin.qq.com/s?__biz=MzIwNDUxNTAxNA==&mid=2247483858&idx=2&sn=06d1e8442ad39b5145e085a98a0b141f
    `
    在Java8之前,在Java开发过程中,如果要操作时间,是使用Date这个类,在Java8中新增了LocalTime、LocalDate和LocalDateTime,日期和时间的处理变得更加方便和容易。

    # 为什么要有新的时间API
    既然Date类已经存在了那么多年,为什么要花那么大的精力去做这个改动?收益是什么呢?

    首先,因为Date类真的很难用,有很多过于Geek的设计,比如月份是从0开始,0是一月,11是十二月。好吧,我已经知道程序员是从0开始计数了,但是每次用的时候都要做各种转换,特别是跟其他输出端有交互的时候,改错一个地方就凌乱了。在新的APIjava.time里,这些都用常量表示了,不会用错,代码看起来也更加清晰。

    在业务代码中,往往有很多种需求,获取某一天的0点,获取下一天的中午时间,将当前时间往前或者往后移动几天,等等这类的需求,这些功能使用Date类配合Calendar要写好多代码,代码简洁性也不够好。

    另外一个,Date里面的很多方法都弃用了,如果新的项目还敢用这些类,那就是给自己埋坑了,还是趁早改了为好。

    旧的时间类java.util.Date和格式化类SimpleDateFormatter都是可变类,不是线程安全的,在多线程环境下对共享变量Date进行操作时,需要自己保证线程安全。而新的时间APILocalTime和LocalDate和格式化类DateTimeFormatter都是final类(不可变)且是线程安全的。

    基于上面的这些原因,就没有理由不使用新的时间API了。

    从一个用着习惯了很多年的工具切换到新的工具总是很不习惯,过程是痛苦的,但是结果是美好的。

    # 怎么理解新的时间API
    在新的时间API里,有LocalTime、LocalDate、LocalDateTime三个类,LocalTime只处理时间,无法包含日期,LocalDate只处理日期,无法包含时间,只有LocalDateTime能同时处理日期和时间。
    `

回复 hi 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注