Java知识点和总结 (update@20210717)
Java环境搭建
可以使用的idea插件
插件无法通过idea直接安装时, 可去plugins.jetbrains.com下载到本地后再手动安装。
lombok
引入maven包(引入失败问题)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
哈哈之前一直导入失败, 还以为是自己手动装的lombok插件没装好, 按照Java效率工具之Lombok给的dependency(和我原来相比多了版本号, maven dependency without version)
alibaba guidelines(alibaba 代码检查)
free mybaits plugin
其他工具
mybatis逆向生成工具:Spring-generator
IDEA无法启动
一般都是改了jvm内存导致的,直接删除用户目录下.IdeaIC2019.3\config的vmoptions文件即可
IDEA代码自动提示与补全功能消失
网上很多资料说的是开启了省电模式,但是我的状况是pom.xml文件未被引入maven管理,可以看到文件的图标颜色已经发生了变化
浮点数到整数的转换
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int)23.7 == 23; (int)-45.89f == -45
这一点和C的是不同的
Java的标识符规则
Java的标识符和C的一样都是美元符($)开始的, 这个C和JAVA我都没记得可以这样用
Java中的null
-
java 中string 和null相加,
String nstr; String str1 = "hello" + nstr; String str2 = "world" + null;
结果会变成
hellonull
,worldnull
-
java中判断某个某个
String
对象是否是null
或者为空字符串, 需要先判断是否为null
, 顺序不能调换if(str != null && !str.equals("")){}
重载overload vs. 重写override
- 重载overload(实现不同参数列表的同名方法)
- 重写override(重新实现同名方法的内容, 参数列表,返回值都相同, 仅方法内容即方法体不同)
Java类的加载顺序
java类的加载顺序: 父类static代码块,方法 –> 子类static代码块,方法 –> 父类构造方法- -> 子类构造方法
所以java中静态代码块, 方法(static context)不能使用非静态方法(non static method or Object)
Spring Bean名称重复ConflictingBeanDefinitionException解决
最近多次遇到过这个问题, 虽然原因已经知晓,但是原理还不是很清楚, 有空再来深入理解下,Spring Bean名称重复ConflictingBeanDefinitionException解决
记一次困扰自己3天的序列化偶发问题
入手公司的新架构, 写了个服务,部署到开发测试环境之后, 总是发现客户端调用服务时有遇到序列话问题, com.esotericsoftware.kryo.KryoException: Encountered unregistered class, Serialization trace:
百度后有看到说是对象太大,于是精简后也还是遇到了相同的状况, 后来请教了同事后发现是自己服务有做过迁移, 老的服务再自己新服务VO对象有改动的情况下没有重新部署过,导致服务在请求到2个新服务的提供者之外的另一服务时就会遇到问题(这里自己要检讨为什么自己不去关注自己的请求在两台机器的log里都没找到), 同事当时用了命令查看到服务此时有3个提供者而不是两个,用的命令可以参考zookeeper客户端命令行查看dubbo服务的生产者和消费者
System.exit(0)问题
在参考别人的代码时, 也随手学别人写了个System.exit(0)
, 但是实际上这个会停掉整个进程在使用的虚拟机, 后果很严重😂
Ant部署
ant还是单独使用命令来跑,可以看到更多的报错信息,idea继承的ant错误信息几乎没有,报错都是最低成,根本没法看。
ThreadLocal
ThreadLocal vs. Synchronized
ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题,不同的点[ingxin简书ThreadLocal
- Synchronized是通过线程等待,牺牲时间来解决访问冲突
- ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。
记threadlocal引发的一个问题
使用threadlocal时一般都是使用全局静态变量,在赋值和使用时一定要小心。(自己写过一个线上bug,双活机器每台第一次请求数据时会先分别设置不同的DB路径,去捞取必须数据,再进行后续查询,结果DB路径就错误的变成了最后一次的DB路径)
Java传值还是引用
先占个坑,以后再仔细去研究实现机制以及和C++的区别,现在我的理解是java是一个特殊的引用, 该引用可以重新指向别的地址(一旦指向别的地址,就跟原有指向的内容无关), 可以使用一下的代码进行测试
class TestClass {
public String a;
public String b;
}
static void testFunc(TestClass t) {
t.a = "hello";
t.b = "world";
System.out.println(t.hashCode());
TestClass s = new TestClass();
System.out.println(s.hashCode());
s.a = "test";
s.b = "java";
t = s;
System.out.println(t.hashCode());
}
public static void main(String[] args) throws Exception {
TestClass t = new TestClass();
System.out.println(t.hashCode());
testFunc(t);
System.out.println(t.a + "," + t.b);
System.out.println(t.hashCode());
}
Readlist
- 为什么函数不能根据返回类型来区分重载?, 这个自己一直有误解, C++, Java都要注意
- Java线程同步:synchronized锁住的是代码还是对象
- @Synchronized
synchronized
done right: Don’t expose your locks. - lombok注解介绍
- JVM系列三:JVM参数设置、分析
- scheduleAtFixedRate vs scheduleWithFixedDelay
- scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别
- Dubbo-Fail to decode request due to: RpcInvocation
- Checked vs Unchecked Exceptions in Java
- log4j日志文件在java+maven工程中的使用
- Arthas - Java 线上问题定位处理的终极利器
- java异常8:finally关键字的特点及作用
- java中的map集合存放null值总结
- 线程安全 vs 线程局部安全
- Java对象占用内存空间分析及实战
- java8接口新特性,default关键字,接口可以拥有方法体
- java 中变量存储位置的区别
- 详述 @Service 和 @Resource 注解的区别
- Java JVM虚拟机选项Xms/Xmx/PermSize/MaxPermSize
- HashMap初始化时为什么建议使用HashMap(int initialCapacity)指定集合大小
- SimpleDateFormat线程不安全原因及解决方案
- Java中的闭包之争
- Effective Java Item86 - 謹慎實現Serializable介面
- Effective Java - 序列化
- mybatis查询缓存(一、二级缓存useCache, flushCache)
- Error querying database. Cause: java.lang.NumberFormatException: For input string: “否”
- context:component-scan使用说明
- 还在使用if else写代码?试试 “策略模式” 吧!
- How to Avoid Scientific Notation in Double?
- How to work with wait(), notify() and notifyAll() in Java?
- Java排查問題工具、命令總結
- 细节知多少 - spring @Value注解解析
- spring的@Value注解使用
- Java 8 中的 Streams API 详解
- 深入浅出parallelStream
- Java7并发编程实战手册 学习笔记(六)——Fork/Join框架
- Logback does not recreate log file after file has been deleted
- How to make @autowire work in spring when creating instance manually
- Java回调机制解读
- Ant Javac error, Setting the target version of Java in ant javac
- Kafka General Broker Settings
- Spring BeanPostProcessor
- Java PATH, classpath, 运行jar包要指定这两个路径
- IntelliJ IDEA自身以及maven项目打包方式
- JVM编译优化技术:逃逸分析
- maven release版本不更新原因分析
- Spring “spring.profiles.include” overrides