java面试知识点整理(未完待续)

J2SE基础

九种基本数据类型的大小,以及他们的封装类

java提供的九种基本数据类型:boolean、byte、char、short、int、long、float、double、void
以及它们的封装类:Boolean、Byte、Character、Short、Integer、Long、Float、Double、Void

Switch能否用string做参数

能,这是Java1.7之后的特性

equals与==的区别

==是比较引用是否相等。equals是比较对象的值是否相等,可以自己重写对象的次方法

Object有哪些公用方法
  • clone 实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常
  • equals在Object中与==是一样的,子类一般需要重写该方法
  • hashCode 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到
  • getClass final方法,获得运行时类型
  • wait 使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。
    wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生:
    1. 其他线程调用了该对象的notify方法
    2. 其他线程调用了该对象的notifyAll方法
    3. 其他线程调用了interrupt中断该线程
    4. 时间间隔到了,此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常
  • notify 唤醒在该对象上等待的某个线程
  • notifyAll 唤醒在该对象上等待的所有线程
  • toString 转换成字符串,一般子类都有重写,否则打印句柄

Read More

PostgreSQL和MySQL之间的比较

对比表如下:

features PostgreSQL MySQL
Known as The world’s most advanced open source database The world’s most popular open source database
Development PostgreSQL is an open source project MySQL is an open-source product
Pronunciation post gress queue ell my ess queue ell
Licensing MIT-style license GNU General Public License
Implementation programming language C C/C++
GUI tool PgAdmin MySQL Workbench
ACID Yes Yes
Storage engine Single storage engine Multiple storage engines e.g., InnoDB and MyISAM
Full-text search Yes Yes
Drop a temporary table No TEMP or TEMPORARY keyword in DROP TABLE statement MySQL supports the TEMP or TEMPORARY keyword in the DROP TABLE statement that allows you to remove the temporary table only.
DROP TABLE Support CASCADE option to drop table’s dependent objects e.g., tables, views, etc. Does not support CASCADE option
TRUNCATE TABLE PostgreSQL TRUNCATE TABLE supports more features like CASCADE, RESTART IDENTITY, CONTINUE IDENTITY, transaction-safe, etc. MySQL TRUNCATE TABLE does not support CASCADE and transaction safe i.e,. once data is deleted, it cannot be rolled back.
Auto increment Column SERIAL AUTO_INCREMENT
Analytic functions Yes No
Data types Support many advanced types such as array, hstore, user-defined type, etc. SQL-standard types
Unsigned integer No Yes
Boolean type Yes Use TINYINT(1) internally for Boolean
IP address data type Yes No
Set default value for a column Support both constant and function call Must be a constant or CURRENT_TIMESTAMP for TIMESTAMP or DATETIME columns
CTE Yes No
EXPLAIN output More detailed Less detailed
Materialized views Yes No
CHECK constraint Yes No (MySQL ignores the CHECK constraint)
Table inheritance Yes No
Programming languages for stored procedures Ruby, Perl, Python, TCL, PL/pgSQL, SQL, JavaScript, etc. SQL:2003 syntax for stored procedures
FULL OUTER JOIN Yes No
INTERSECT Yes No
EXCEPT Yes No
Partial indexes Yes No
Bitmap indexes Yes No
Expression indexes Yes No
Covering indexes Yes (since version 9.2) Yes. MySQL supports covering indexes that allow data to be retrieved by scanning the index alone without touching the table data. This is advantageous with large tables with millions of rows.
Common table expression (CTE) Yes No
Triggers Support triggers that can fire on most types of command, except for ones affecting the database globally e.g.,roles and tablespaces. Limited to some commands
Partitioning RANGE, LIST RANGE, LIST, HASH, KEY, and composite partitioning using a combination of RANGE or LIST with HASH or KEY subpartitions
Task Schedule pgAgent Scheduled event
Connection Scalability Each new connection is an OS process Each new connection is an OS thread

JVM常用参数

1.Java堆参数

parameter explain example
-Xms 堆最小值 -Xms20M
-Xmx 堆最大值 -Xmm20M
-Xmn 年轻代大小 -Xmn2g (设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8)
-XX:NewSize 新生代大小 -XX:NewSize=20M
-XX:MaxNewSize 年轻代最大值
-XX:SurvivorRatio 新生代/年老代 -XX:SurvivorRatio=2 (新生代是老年代的2倍)
-XX:NewRatio 老年代/新生代 -XX:NewRatio=4 (老年代是新生代的4倍)

例:

1
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

Read More

在nginx中配置Let's Encrypt的https证书

1 、获取 Let’s Encrypt 程序

1
2
3
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
chmod +x letsencrypt-auto

2 、执行安装证书

在执行一下命令之前要注意,你的域名下必须要有服务器正在运行,不然下面脚本无法执行成功。如果你的服务器里已经有Python环境,
直接执行python -m http.server 80开启一个http服务器。一般1024以下端口非管理员用户不能绑定,所以你还需要确保你的80端口可以在公网访问,如果不能请自行Google
寻找解决办法。

1
./letsencrypt-auto certonly -a webroot --webroot-path=/home/www/www.gentlehu.com --email [email protected] -d www.gentlehu.com

将上面的目录、邮箱和域名换成你自己的,如果在输出信息中没有看到错误提示并且在/etc/letsencrypt/live/www.gentlehu.com/目录看到如下五个文件就说明证书申请成功:

1
2
3
4
5
cert.pem  - Apache 服务器端证书  
chain.pem - Apache 根证书和中继证书
fullchain.pem - ssl_certificate
privkey.pem - ssl_certificate_key
README.md

然后就可以关闭之前的http服务器了。

Read More

java中一个强大的工具类-Unsafe

1.简介

Unsafe是java中一个强有力的工具类,很多高性能框架都用到了它,并且在我们常用的ConcurrentHashMap,AtomicInteger类中也用到了它。

ConcurrentHashMap.java中:
Unsafe_in_ConcurrentHashMap

AtomicInteger.java中:
Unsafe_in_AtomicInteger

高性能框架中(包括但不限于):

  • Netty
  • Hazelcast
  • Cassandra
  • Mockito / EasyMock / JMock / PowerMock
  • Scala Specs
  • Spock
  • Robolectric
  • Grails
  • Neo4j
  • Spring Framework
  • Akka
  • Apache Kafka
  • Apache Wink
  • Apache Storm
  • Apache Hadoop
  • Apache Continuum

refer:https://blog.dripstat.com/removal-of-sun-misc-unsafe-a-disaster-in-the-making/
refer:https://adtmag.com/blogs/watersworks/2015/08/java-9-hack.aspx

这个类强大之处在于可以像C的指针一样,直接操作内存。正如它的名字一样,它是不安全的,如果处理不好,会导致程序问题发生的概率增大,官方也不建议使用。

2.限制

Unsafe内部使用的是单例模式,通过其静态方法getUnsafe方法获取,但是有些限制,那就是只有系统类加载器可以加载这个类,其他加载器加载会抛出异常,这个我们可以通过看源码来证明:
Unsafe_of_getUnsafe

但是这个限制也只是普通限制,别忘了java还有一个更强大的特性:反射(reflect)。如果你也想试一试这个类,可以通过下面的方法获取其实例:

1
2
3
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);

里面具体有哪些方法,读者可以自己去源码看下,但是这个类没有官方文档,仅有的是源码上的注释,不过可以通过自己试验来了解和验证其功能。我这里找到一个blog,博主详细介绍了Unsafe中的方法,有兴趣可以去看下:http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

3.移除

Unfortunately,oracle计划在jdk1.9中移除它,而且是没有原因的。下面的是Oracle邮件中部分内容:

Let me be blunt – sun.misc.Unsafe must die in a fire. It is – wait
for it – Unsafe. It must go. Ignore any kind of theoretical rope and
start the path to righteousness

refer:https://blog.dripstat.com/removal-of-sun-misc-unsafe-a-disaster-in-the-making/

如果直接移除的话,必然导致很多框架不得不修改源码以让其可以正常运行,不然就没法使用。

就像java8中使用java.time包来代替java.util中Date类一样,提供一个过渡期,不强制移除Unsafe类,而是在启动JVM的时候提供一个开关,这个开启的时候我们才可以使用Unsafe,默认是关闭的。