=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基础编程练习题资源
参考链接:
- Java语法—-Java中equals和==的区别
- Java中equals和==的区别
- 如何记住 string==null 和 string.equals(“”) 的区别?
- What is the difference between == and equals() in Java?
- Java中字符串替换——使用「双引号」包裹,而非「单引号」
https://stackoverflow.com/questions/1234510/how-do-i-replace-a-character-in-a-string-in-java - fastjson的JSONArray和JSONObject
- FastJSON 简介及其Map/JSON/String 互转
- How to parse JSON Array (Not Json Object) in Android
=END=
《 “Java中的一些基础代码片段_5” 》 有 13 条评论
你遇到过哪些质量很高的 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个吧,其它想起来后续补充。
`
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
在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/
原创 | 不了解这12个语法糖,别说你会Java!
https://mp.weixin.qq.com/s/EBnM7QAOPjDk5bG3M0Mu-w
`
糖块一、 switch 支持 String 与枚举
糖块二、 泛型
糖块三、 自动装箱与拆箱
糖块四 、 方法变长参数
糖块五 、 枚举
糖块六 、 内部类
糖块七 、条件编译
糖块八 、 断言
糖块九 、 数值字面量
糖块十 、 for-each
糖块十一 、 try-with-resource
糖块十二、Lambda表达式
`
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)
`
Trying to call a function every 24 hours
https://stackoverflow.com/questions/33105701/trying-to-call-a-function-every-24-hours
https://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html
`
Timer
ExecutorService
Spring @Scheduled
Quartz
`
How to get the current date/time in Java
https://stackoverflow.com/questions/5175728/how-to-get-the-current-date-time-in-java
`
new Date() #接口已废弃,不太推荐,但一般用着也没啥问题
Calendar.getInstance() #API比较笨重,但也可以实现功能
new org.joda.time.DateTime() #需额外引入Joda-time
LocalDateTime.now() #需要Java8及以上版本
`
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
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
Java 编码技巧之高效代码 50 例
https://mp.weixin.qq.com/s/CqVgOJGGK8hPN9FielHuRg
`
世界上只有两种物质:高效率和低效率;
世界上只有两种人:高效率的人和低效率的人。
— 萧伯纳
同理,世界上只有两种代码:高效代码和低效代码;
世界上只有两种人:编写高效代码的人和编写低效代码的人。
如何编写高效代码,是每个研发团队都会面临的一个重大问题。
本文作者根据实际经验,查阅了大量资料,总结了”Java 高效代码 50 例”,让每一个 Java 程序员都能编写出”高效代码”。
`
Java 编程技巧之数据结构
https://mp.weixin.qq.com/s/krp-QdvnKYOYqEgoadI1Zw
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
理解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能同时处理日期和时间。
`
使用 Java 解析 XML 文件
https://linux.cn/article-14381-1.html
https://opensource.com/article/21/7/parsing-config-files-java