java

java学习

J2SE的架构

1
2
3
java -cp %classpath; HelloWorld

-Dfile.encoding=UTF-8
1
2
3
4
5
6
7
8
9
10
WKQ@WKQ-PC C:\Users\WKQ
> chcp
活动代码页: 936

WKQ@WKQ-PC C:\Users\WKQ
> chcp 65001

Active code page: 65001

java -Dfile.encoding=UTF-8 -jar test.jar
1
2
3
InputStream in = DictsLoader.class.getClassLoader().getResourceAsStream("application.properties");

InputStream in = DictsLoader.class.getClassLoader().getResourceAsStream("dictionary/segDicts/stopwords.txt");

Premature end of file

3 字节的 UTF-8 序列的字节 2 无效

com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 2 无效。
编码原因,使用UTF-8编码

Java有关身份证的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
* 有关身份证的操作<br>
*
* http://www.cnblogs.com/10158wsj/p/7050736.html
* http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/ 行政区划代码
*
* <pre>
* 要进行身份证号码的验证,首先需要了解我国身份证号码的编码规则。
* 我国身份证号码多由若干位数字或者数字与字母混合组成。
* 早期身份证由15位数字构成,这主要是在1980年以前发放的身份证,
* 后来考虑到千年虫问题,
* 因为15位的身份证号码只能为1900年1月1日到1999年12月31日出生的人编号,
* 所以又增加了18位身份证号码编号规则。
*
* 15位身份证号
* 3 7 0 9 8 6 8 9 0 6 2 3 2 1 2
* A A A A A A Y Y M M D D N N S
*
* 18位身份证号
* 3 7 0 9 8 6 1 9 8 9 0 6 2 3 2 1 2 3
* A A A A A A Y Y Y Y M M D D N N S J
*
* 前六位AAAAAA是身份证编码对象的所在地(出生地)的编码,
* 该号码可由国家统计局公布的相关标准中得到。
* YY表示出生年的后两位,
* MM和DD表示出生月和日,不足两位的高位补0,
* NNS为顺序号,无法确定。
* S为性别识别码,男性为奇数,女性为偶数。
*
* 了解了身份证号码的规则后,我们就可以推断出,身份证的15位转化位需要两步。
* 首先把15位身份证号补全为17位,然后再补全最后一位。
* 但是最后一位是数字还是字母X?这里又出现了问题。
* 我们知道,身份证的最后一位为校验位,那么最后一位是怎么得到的呢?
* 原来,最后一位是由数字1-9组成,超过9的比如11就用字母X表示,否则号码就变成了19位。
* 了解了这些,经过整理得出身份证补全算法实现思想如下:
* step1 将15位身份证号码加入出生年变为17位
* step2 将step1得到的身份证17位数分别乘以不同的系数。从第1位到第17位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2.
* step3 将这17位数字和系数相乘的结果相加
* step4 将step3的结果除以11,得出余数
* 由于数字的特殊性,这些余数只可能是0-10这11个数字,身份证最后一位的对应数字为1-0-X-9-8-7-6-5-4-3-2.。
* 例上面的余数结果为3那么对应身份证号码的最后一位就是9,如果是10,身份证最后一位便是2。
*
* </pre>
*
* http://www.cnblogs.com/10158wsj/p/7050736.html
*
*/
public class IDCard {

public static void main(String[] args) {

System.out.println(transIDCard15to18("370986890623212"));

System.out.println(transIDCard15to18("370725881105149"));

}

/**
* 把15位身份证转化为18位标准证件号
*
* @param IdCardNO
* @return
*/
public static String transIDCard15to18(String IdCardNO) {

String cardNo = null;

if (null != IdCardNO && IdCardNO.trim().length() == 15) {

IdCardNO = IdCardNO.trim();

StringBuffer sb = new StringBuffer(IdCardNO);

sb.insert(6, "19"); // 19xx年,15位的身份证省略了19

sb.append(transCardLastNo(sb.toString()));

cardNo = sb.toString();

}

return cardNo;

}

/**
* 15位补全‘19’位后的身份证号码
*
*/

private static String transCardLastNo(String newCardId) {

char[] ch = newCardId.toCharArray();

int m = 0;
int[] co = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
char[] verCode = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

for (int i = 0; i < newCardId.length(); i++) {
m += (ch[i] - '0') * co[i];
}

int residue = m % 11;

return String.valueOf(verCode[residue]);

}

}

Java-Web-error

junit.framework.AssertionFailedError: Test method isn’t public: test

1
junit.framework.AssertionFailedError: Test method isn't public: test

java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest

1
2
3
4
5
6
7
8
2017-07-02 20:58:46.771 [main] [ERROR] [org.springframework.boot.SpringApplication] [821] - Application startup failed
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
at java.lang.Class.getDeclaredMethods0(Native Method)

Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

2017-07-02 20:58:46.774 [main] [INFO ] [o.s.b.logging.ClasspathLoggingApplicationListener] [57] - Application failed to start

在初次使用 IntelliJ IDEA 中,当你使用javax.servlet包下的类时(例:javax.servlet.http.HttpServlet), 在你会发现在IntelliJ IDEA里无法成功编译这个程序。
报错如下:

java.lang.ClassNotFoundException:javax.el.ELResolver

为什么呢?因为IntelliJ IDEA 没有导入 servlet-api.jar 这个架包,需要你手动导入支持。

解决方案如下:
1、选中项目(在IntelliJ中称为Module);
2、点击右键,选择open modual settings(或者直接按F4);
3、在弹出的窗口左端选择Libraries;
4、点击顶端的一个类似加号“+”的图标;
5、在右端选择第一项(Attach Classes…);
6、在弹出的窗口中选择tomcat所在的目录,进入里面的lib目录,寻找servlet-api.jar这个jar包(如果JSP页面也有相关的JavaWeb对象,则还要寻找jsp-api.jar;如果只有Servlet,则只选择servlet-api.jar);
7、选中上述jar包,依次点击OK。

Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

1
2
3
4
5
6
7
8
2017-07-02 21:09:54.505 [main] [ERROR] [org.springframework.boot.SpringApplication] [821] - Application startup failed
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133)

Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185)

2017-07-02 21:09:54.507 [main] [INFO ] [o.s.b.logging.ClasspathLoggingApplicationListener] [57] - Application failed to start

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry ‘????(????)’ for key

1
2
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '????(????)' for key 'UK_ijdlfwufomeirxn4yddpckkui'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_121]

编码问题
修改数据库编码,表编码,字段编码
如果数据库是空的,可以删除数据库,重新建一个

The main resource set specified [/war/test-0.1] is not valid

1
2
3
4
5
6
7
17-Aug-2017 10:54:49.821 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.4
17-Aug-2017 10:54:49.839 SEVERE [Catalina-startStop-1] org.apache.catalina.core.ContainerBase.startInternal A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/test]]
at java.util.concurrent.FutureTask.report(FutureTask.java:122)

Caused by: java.lang.IllegalArgumentException: The main resource set specified [/home/admin/software/test/war/test-0.1] is not valid
at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:725)

/home/admin/software/test/war/test-0.1 这么目录路径写错了,导致tomcat访问不到,路径该了就好了。

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

jar creation failed see details additional information

1、选中项目右键=>properties=>Java Compiler=>JDK Compliance level栏换一个JDK,最好版本换成1.6以上的
2、正常打包流程,一步步点,如果总是不成功,可以尝试将以下两个选项的勾去掉
3、选择Project——>Clean 然后选择你的项目,clean一下(由于某种原因,缓存导致)
4、如果以上三步都不行的话, 这个时候就看看你项目有没有引用外部jar包,而且这个jar包路径不存在
右键项目——>build Path 看看项目的jar包,如果有不存在的jar包,要么去掉,要么换个路径

Could not find or load main class

1、检查JDK环境,环境变量是不是配置有问题
2、包名和文件路径不对应,去掉包名。

Java面试题

1 Switch能否用string做参数?

a.在 Java 7 之前, switch 只能支持byte,short,char,int 或者其对应的封装类以及 Enum 类型。在JAVA 7中,String 支持被加上了。

2 equals与==的区别:

a.==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同

3 Object有哪些公用方法?

a.方法equals测试的是两个对象是否相等

b.方法clone进行对象拷贝

c.方法getClass返回和当前对象相关的Class对象

d.方法notify,notifyall,wait都是用来对给定对象进行线程同步的

4 Java的四种引用,强弱软虚,用到的场景

a.利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题

b.通过软可及对象重获方法实现Java对象的高速缓存:比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的 id,value为这个对象的软引用,另一方面是取出引用,缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,并保存对这个新建实例的软引用。

c.强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象

d.软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

e..弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象

f.虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。

g.使用场景:

5 Hashcode的作用,与 equal 有什么区别

a.同样用于鉴定2个对象是否相等的,java集合中有 list 和 set 两类,其中 set不允许元素重复实现,那个这个不允许重复实现的方法,如果用 equal 去比较的话,如果存在1000个元素,你 new 一个新的元素出来,需要去调用1000次 equal 去逐个和他们比较是否是同一个对象,这样会大大降低效率。hashcode实际上是返回对象的存储地址,如果这个位置上没有元素,就把元素直接存储在上面,如果这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较,相同的话就不存了,散列到其他地址上

6 String、StringBuffer与StringBuilder的区别

a.String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象

b.StringBuffer和StringBuilder底层是 char[]数组实现的

c.StringBuffer是线程安全的,而StringBuilder是线程不安全的

7 Override和Overload的含义去区别

a.Overload顾名思义是重新加载,它可以表现类的多态性,可以是函数里面可以有相同的函数名但是参数名、返回值、类型不能相同;或者说可以改变参数、类型、返回值但是函数名字依然不变。

b.就是ride(重写)的意思,在子类继承父类的时候子类中可以定义某方法与其父类有相同的名称和参数,当子类在调用这一函数时自动调用子类的方法,而父类相当于被覆盖(重写)了。

8 抽象类和接口的区别

a.一个类只能继承单个类,但是可以实现多个接口

b.接口强调特定功能的实现,而抽象类强调所属关系

c.抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的

9 解析XML的几种方式的原理与特点:DOM、SAX、PULL

a.DOM:消耗内存:先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机

b.SAX:解析效率高,占用内存少,基于事件驱动的:更加简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

c.SAX:与 SAX 类似,也是基于事件驱动,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。

10 wait()和sleep()的区别

sleep来自Thread类,和wait来自Object类

调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁

sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU

sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒

11 JAVA 中堆和栈的区别,说下java 的内存机制

a.基本数据类型比变量和对象的引用都是在栈分配的

b.堆内存用来存放由new创建的对象和数组

c.类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中

d.实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”,实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

e.局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

12 JAVA多态的实现原理

a.抽象的来讲,多态的意思就是同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

b.实现的原理是动态绑定,程序调用的方法在运行期才动态绑定,追溯源码可以发现,JVM 通过参数的自动转型来找到合适的办法。

13 JAVA 垃圾回收机制

a.标记回收法:遍历对象图并且记录可到达的对象,以便删除不可到达的对象,一般使用单线程工作并且可能产生内存碎片

b.标记-压缩回收法:前期与第一种方法相同,只是多了一步,将所有的存活对象压缩到内存的一端,这样内存碎片就可以合成一大块可再利用的内存区域,提高了内存利用率

c.复制回收法:把现有内存空间分成两部分,gc运行时,它把可到达对象复制到另一半空间,再清空正在使用的空间的全部对象。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。

d.分代回收发:把内存空间分为两个或者多个域,如年轻代和老年代,年轻代的特点是对象会很快被回收,因此在年轻代使用效率比较高的算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老年的内存空间,老年代则采取标记-压缩算法

e.引用计数(最简单古老的方法):指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程

f.对象引用遍历(现在大多数 jvm 使用的方法):对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集

g.什么是垃圾回收机:释放那些不再持有引用的对象的内存

h.怎么判断一个对象是否需要收集?

i.几种垃圾回收机制

14 讲讲 Java 中的集合有多少种,区别是什么?

a.HashTable比较老,是基于Dictionary 类实现的,HashTable 则是基于 Map接口实现的

b.HashTable 是线程安全的, HashMap 则是线程不安全的

c.HashMap可以让你将空值作为一个表的条目的key或value

d.ArrayList、LinkedList、Vector的区别:ArrayList 和Vector底层是采用数组方式存储数据,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,随机存取比较慢

e.HashMap的底层源码实现:当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

f.Fail-Fast机制:在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast机制。这一机制在源码中的实现是通过modCount域,modCount顾名思义就是修改次数,对HashMap内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的expectedModCount。在迭代过程中,判断modCount跟expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map.

References

[1] https://www.java.com/zh_CN/about/
[2] https://docs.oracle.com/javase/tutorial/   Java 教程
[3] http://www.oracle.com/technetwork/java/javamagazine/index.html
[4] http://www.oracle.com/technetwork/topics/newtojava/youngdevelopers/index.html
[5] http://www.oracle.com/technetwork/topics/newtojava/overview/index.html
[6] http://www.cnblogs.com/xrq730/p/4826691.html  Java虚拟机1:什么是Java
[7] http://www.importnew.com/ ImportNew - 专注Java & Android 技术分享
[8] http://www.cnblogs.com/zengkefu/p/5633342.html
[9] http://blog.csdn.net/moneyshi/article/details/43056321
[10] http://blog.csdn.net/whorus1/article/details/51518139
[11] https://mp.weixin.qq.com/s/ENxjkPMsBTwImD-sBTNeKw 46张PPT讲述JVM体系结构、GC算法和调优
[12] https://mp.weixin.qq.com/s/sHJoPmbpcGDe1XyyI4qKTg 10种简单的Java性能优化
[13] https://yq.aliyun.com/articles/73581 2016年Java面试题整理
[14] https://yq.aliyun.com/articles/73584 Java集合类操作优化经验总结
[15] http://www.toutiao.com/a6409910051989258498/ 图解Java面试题——JVM
[16] http://www.toutiao.com/a6409986995707871489/ 2017年终BAT的JAVA面试题聚集
[17] http://www.tuicool.com/articles/7RRrIr Java 资源大全中文版

java-web error
[1] https://my.oschina.net/fdblog/blog/161305
[2] http://blog.csdn.net/zhang168/article/details/51423905
[3] https://stackoverflow.com/questions/21783391/spring-boot-unable-to-start-embeddedwebapplicationcontext-due-to-missing-embedd

一点解决版本冲突的应急思路、怎样在所有jar包文件中搜索冲突的方法?