Java个人笔记(持续更新中)
1. 用 StringUtils.isBlank()方法时,如果该class下,有较多包引用该class时,可以通过
org.apache.commons.lang3.StringUtils.isBlank(); 调用该方法。
2. “The nested type FunctionService cannot hide an enclosing type”
表明两个类不能放在一个class文件中。
3. System.out.println(((System) environment).getProperties());
Error: The static method getProperties() from the type System should be accessed in a static way.
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错:
类的加载:由引导类加载器负责加载的核心类比如 String 类在 JVM 启动时(main 方法开始执行前)就会被加载,其它类在使用前(new 它对象或调用其静态方法访问静态域等等前)会被动态加载,要注意的是 子类被加载前它的所有超类要根据由父到子的顺序被逐一加载。
4 . super的另外一个作用是调用父类的protected函数。只有通过"super",我们才能操作父类的protected成员,别无它法。
5.更改Eclipse里面的Maven配置让其能下载源码。
勾选 Artifact Sources 与 Artifact JavaDoc
6、在windows环境中部署SpringBoot 的jar包:
1)首先,将本地服务打jar包:
1.右击项目,选择Run As - Maven clean
2.右击项目,选择Run As - Maven install
3.成功后 会在项目的target文件夹下生成jar包
4.将打包好的jar包 发布到服务器,运行java -jar jar包
2)通过控制台杀死一个占用端口的进程
1:使用:netstat -ano|findstr 端口号 直接查出占用端口的程序和它的pid
例如:netstat -ano|findstr 8080
2:知道pid后,就可以使用taskkill /pid pid 来杀死进程(/pid是参数)。
例如:taskkill -f -pid 1780
7、在eclipse打开多个console窗口
如果你想要2个窗口,解决步骤:
1.运行2个程序:test1和test2(它们需要不同的控制台)
4.在一个console上,点击Display Selected Console下拉按钮,选择test1;而在另一个console上,点击Display Selected Console下拉按钮,选择test2。
5.在2个console上都点击Pin Console按钮
8、在java中通过编程设置代理服务器并访问网络
1
,讲解一下基础知识:
HTTP:是应用层协议,是基于传输层协议的。
TCP: 是传输层协议,是基于网络层协议的。
IP: 是网络层协议。
一个TCP的连接要进行三次握手(就像转户口一样,不详说),HTTP只是一个应用协议,也就是相当于一个自定义协议,即其没有对底层的传输方式进行干涉,只是对数据内容格式进行了定义。
2 ,我们再说说HTTP代理,从上可以理解,HTTP代理服务器就是这样一台机器:你把所有的 HTTP请求 都发到这个 HTTP代理服务器,然后这个HTTP代理服务器请求你要访问的最终地址,把响应回传给你。这里还要注意它代理的是HTTP协议,而HTTP又是基于 TCP的,也就是说这个服务器代理的是指定HTTP内容格式的TCP连接。再说下去也没意思了,看以下代码:
//以下地址是代理服务器的地址
Socket socket = new Socket("10.1.2.188", 80);
//写与的内容就是遵循
HTTP请求
协议格式的内容,请求百度
socket.getOutputStream().write(new String("GET
http://www.
baidu.com/
HTTP/1.1\r\n\r\n").getBytes());
byte[] bs = new byte[1024];
InputStream is = socket.getInputStream();
int i;
while ((i = is.read(bs)) > 0) {
System.out.println(new String(bs, 0, i));
}
is.close();
3
,当然在Java中,有Proxy
代理上网
的使用,此时使用URL(HTTP)就不涉及Socket(TCP)了,看如下代码
//设置代理
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", "10.1.2.188");
System.setProperty("http.proxyPort", "80");
代码示例:
public static void main(String[] args) throws IOException {
String urlStr = "http://ip.taobao.com/service/getIpInfo.php";
URL url;
HttpURLConnection connection = null;
url = new URL(urlStr);
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(2000);
connection.setReadTimeout(2000);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
//设置代理
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", "10.*.*.*");
System.setProperty("http.proxyPort", "80");
connection.connect();
System.out.println("____");
}
9. split方法需要注意的地方。
split("\\.") 和 split("\\|")
1. 首先要明白split方法的参数含义:public String[] split(String regex)根据给定的正则表达式的匹配来拆分此字符串。
2. 然后就要明确正则表达式的含义了:
'.'点 匹配除“\n”和"\r"之外的任何单个字符。
'\'表示 转义字符 ,而双重转义相当于原意,
10. flush 方法。
在java开发中,有时我们会进行流的操作,会经常遇到这样一段代码:
out.flush();
out.close();
flush()这个函数是清空的意思,用于清空缓冲区的数据流,进行流的操作时,数据先被读到内存中,然后再用数据写到文件中,那么当你数据读完时,我们如果这时调用close()方法关闭读写流,这时就可能造成数据丢失。
java.io.IOException: Broken pipe, Linux对超过时间不连接的长连接会踢掉的,在Linux里面有设置。
在Unix/Linux下的网络结构和windows略有不同,至少在java的网络编程上有一些差异。
程序在windows上运行正常,在linux上就broken pipe了。不过我是单线程也出现了同样问题,是flush()时发生异常。
11. Nginx 反向代理
反向代理的主要作用是分发请求。可以提高吞吐量,但不能提高性能。在单机环境下是没啥作用的。在集群环境下,Nginx可以支持负载均衡,使网站获得更好的性能和稳定性。
Nginx会把Request在读取完整之前buffer住,这样交给后端的就是一个完整的HTTP请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。同样,Nginx也可以把response给buffer住,同样也是减轻后端的压力。
12 Java 中的session对象及其常用方法
- session对象用于在会话范围内,记录每个客户端的访问状态,以便于跟踪每个客户端的操作状态,在会话存储的信息,在浏览器发出后续请求时可以获取这些会话的有效数据。
- HTTP协议是一种无状态协议,客户向服务器发出的请求request,然后服务器返回响应response,连接就被关闭了,在服务器不保存连接的有关信息,因此在下一次连接时,服务器已经没有以前的连接信息了,无法判断这一次连接和上一次连接时同一个客户信息,因此,必须使用会话记录有关连接的信息。
- 从客户打开浏览器连接到服务器,到客户关闭浏览器离开这个服务器,称做一个会话。当客户访问服务器是,可能会反复连接这个服务器上的几个页面、反复刷新一个页面或不断地向一个页面提交信息等,服务器应当通过某种方法知道这是同一个客户,这时就需要session对象
- session的工作原理如下:
1、 客户首次访问服务器的一个页面时,服务器就会为该用户分配一个session对象,同时为这个session指定唯一的ID,并且将该ID发送到客户端并写入到cookie中,使得客户端与服务器的session建立一一对应的关系;
2、当客户端继续访问服务器端的其它资源时,服务器不再为该客户分配新的session对象,直到客户端浏览器关闭、超时或调用session的invalidate()方法使其失效,客户端与服务器的会话结束。
3、当客户重新打开浏览器访问网站时,服务器会重新为客户分配一个session对象,并重新分配sessionID。
5. session对象的销毁时机
当需要在程序中手动设置Session失效时,可以手工调用session.invalidate方法,摧毁session。
HttpSession session = request.getSession();
//手工调用session.invalidate方法,摧毁session
session.invalidate();
同时在web.xml中修改配置文件,也可以设置web.xml的失效时间。
这里设置为-1代表永不失效,如果设置为 30 ,代表30分钟后失效。
13、将List转化为 String类型,并打印输出。
JSONObject json =JSONObject.fromObject(ListArray);
json.toString;
14、时间格式转化
在Java中: new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(ag.getEditTime())
在JS中 :function dateTransfer(x1){
var x2 ;
if(x1 !=null){
x2= new Date(x1 + "Z");
}else {
x2 = '';
var x3 = x2.toISOString().slice(0, 19).replace(/T/, " ");
return x3;
}
14 Java程序执行超时——Future接口介绍
Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future 接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。
Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果,也可以设置任务执行的超时时间。这个设置超时的方法就是实现Java程 序执行超时的关键。
Future的实现类有java.util.concurrent.FutureTask<V>即 javax.swing.SwingWorker<T,V>。通常使用FutureTask来处理我们的任务。FutureTask类同时又 实现了Runnable接口,所以可以直接提交给Executor执行。使用FutureTask实现超时执行的代码如下:
ExecutorService executor = Executors.newSingleThreadExecutor();
FutureTask<String> future =
new FutureTask<String>(new Callable<String>() {//使用Callable接口作为构造参数
public String call() {
//真正的任务在这里执行,这里的返回值类型为String,可以为任意类型
executor.execute(future);
//在这里可以做别的任何事情
try {
result = future.get(5000, TimeUnit.MILLISECONDS); //取得结果,同时设置超时执行时间为5秒。同样可以用future.get(),不设置执行超时时间取得结果
} catch (InterruptedException e) {
futureTask.cancel(true);
} catch (ExecutionException e) {
futureTask.cancel(true);
} catch (TimeoutException e) {
futureTask.cancel(true);
} finally {
executor.shutdown();
}
15 java 中获取一个接口的执行时间
long time1 = System.currentTimeMillis();
long time2 = System.currentTimeMillis();
long finish =TimeUnit.MILLISECONDS.toMillis(time2-time1);
System.out.println(type+"DAO层查询需要的时间::"+finish);
16 eclipse:解决修改文件需要重启tomcat才能生效
先双击tomcat server 弹出server配置信息,然后按照如图所示勾选,
17 java时间戳和时间的相互转换
// 将时间转换为时间戳
public static String dateToStamp(String s) throws ParseException{
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(s);
long ts = date.getTime();
res = String.valueOf(ts);
return res;
// 将时间戳转换为时间
public static String stampToDate(String s){
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long lt = new Long(s);
Date date = new Date(lt);
res = simpleDateFormat.format(date);
return res;
}
18 Java在Linux服务器中内存溢出的问题
19Java 如何将String转化为Int
需要使用Integer类中的 parseInt()方法或者 valueOf()方法进行转换.
String str = "123";
try {
int a = Integer.parseInt(str);
} catch (NumberFormatException e) {
e.printStackTrace(); }
String str = "123";
try {
int b = Integer.valueOf(str).intValue()
} catch (NumberFormatException e) {
e.printStackTrace(); }
20 java怎么检查程序内存溢出
java程序大家都知道,内存溢出是经常见的错误,下面从基本的开始分析!
内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:
一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;
二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)
三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)
四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。
五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。
六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行"+"就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。
如String s1 = "My name";
String s2 = "is";
String s3 = "xuwei";
String str = s1 + s2 + s3 +.........;这是会容易造成内存溢出的
但是String str = "My name" + " is " + " xuwei" + " nice " +" to " + " meet you"; //但是这种就不会造成内存溢出。因为这是”字面量字符串“,在运行"+"时就会在编译期间运行好。不会按照JVM来执行的。
在使用String,StringBuffer,StringBuilder时,如果是字面量字符串进行"+"时,应选用String性能更好;如果是String类进行"+"时,在不考虑线程安全时,应选用StringBuilder性能更好。
内存分析工具:
下载记得下载9.X的版本
21 java中textfield和textarea有什么区别啊
textfield只有一行可写;textarea是一个区域,可以有很多行;textarea的方法比textfield多。
22 spring-boot启动失败 Unregistering JMX-exposed beans on shutdown
pom文件添加如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
23 he server time zone value '?й???????' is unrecognized or represents more than one time zone.
24 、集合框架Map之entrySet方法的使用
Map的entrySet函数的使用,取得是键和值的映射关系,Entry就是map接口中的内部类接口,类似与我们熟悉的内部类一样,内部类定义在外部类内部,可以直接访问到外部类中的成员
public static void main(String[] args) {
18 Map<Integer, String> map=new HashMap<Integer, String>();
19 map.put(8, "wangwu");
20 map.put(2, "lisi");
21 map.put(7, "zhangsan");
22 map.put(6, "xuliu");
23 method_3(map);
24 }
26 private static void method_3(Map<Integer, String> map) {
27 Set entrySet=map.entrySet();//entrySet()方法返回反应map键值的映射关系,存储在set集合中
28 Iterator it=entrySet.iterator();//使用迭代器获得每一个映射关系
29 while(it.hasNext()){
30 Map.Entry me=(Map.Entry) it.next();//映射关系类型为Map.Entry类型,是一个接口类型
31 System.out.println(me.getKey()+":::"+me.getValue());
32 // System.out.println(me.getValue());
33 }
35 }
}
Map是一个接口不能实例化,HashMap是Map的一个是实现
25、Java中的ArrayList的初始容量和容量分配
也可以使用下面的方式进行声明:
List arrayList = new ArrayList(4);
将ArrayList的默认容量设置为4。当ArrayList中的元素超过4个以后,会重新分配内存空间,使数组的大小增长到7。
26 java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Context
在SpringBoot项目中跑Junit单元测试发现此错,解决方案:把你的SpringBoot启动类放到项目包的根目录下 (包括测试类也一样)
27 Mongo中报错 com.mongodb.MongoSocketOpenException: Exception opening socket
28 java里面double类型数相除
4和10都是int型,所以它会以int型的方式先计算右边的4/10得到的结果是0;然后再赋值doouble型的yy,输出结果就会变成0.0,用double yy=(double)4/10就可以得出0.4了;
29 java中怎样把double基本数据类型包装在Double类
double double1 = 1.2d ;
Double c = Double.valueOf(double1);
30 :JSON格式的字符串-用java解析取出
31: Multipartfile和File有什么区别么
这两个词一般是Java中出现的吧,前者代表HTML中form data方式上传的文件,后者是文件系统的抽象,前者信息较少,只有二进制数据+文件名称。
32: javaNIO中ByteBuffer用法
ByteBuffer类是在javaNIO中常常使用的额一个缓存区类,使用
33: 怎么理解Spring中注入
Spring通过“ 控制反转 ”实现了“ 依赖注入 ”。所谓的注入,我的理解是程序实现就像盖房子,spring允许你在类(class)里搭个框架,在配置文件中注明在什么地方用什么材料,在运行时spring按照你的配置真正向这个架子里“注入”了水泥、钢筋等等。这在实际运用中很方便,比如你需要向日志服务器提交记录,但是日志服务器的ip地址可能会变更,你可以把ip地址写在配置文件里,这样当ip改变时,只需更改配置文件,而不需要修改类再重新编译。
34: System.load 与 System.loadLibrary 的区别
相同点
它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。
在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。
System.load
System.load 参数必须为库文件的绝对路径,可以是任意路径,例如:
System.load("C:\\Documents and Settings\\TestJNI.dll"); //Windows
System.load("/usr/lib/TestJNI.so"); //Linux.
System.loadLibrary
System.loadLibrary 参数为库文件名,不包含库文件的扩展名。
System.loadLibrary ("TestJNI"); //加载Windows下的TestJNI.dll本地库
System.loadLibrary ("TestJNI"); //加载Linux下的libTestJNI.so本地库
注意:TestJNI.dll 或 libTestJNI.so 必须是在JVM属性java.library.path所指向的路径中。
本地库的依赖库
如果你要载入的库文件静态链接到其它动态链接库,如TestJNI.dll 静态链接到dependency.dll,必须注意:
1)如果你选择System.load("D:\\lib\\TestJNI.dll");
那么即使你把dependency.dll同样放在D:\\lib下,load还是会因为找不到依赖的dll而失败。
因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到dependency.dll。
你有两个方法解决这个问题:
一是把D:\\lib加入到java.library.path的路径中。
二是先调用System.load("D:\\lib\\dependency.dll"); 让jvm先载入dependency.dll,
然后再调用System.load("D:\\lib\\TestJNI.dll");
2)如果你选择System. loadLibrary ("TestJNI");
那么你只要把dependency.dll放在任何java.library.path包含的路径中即可
34:java生成UUID的方法总结
UUID.randomUUID().toString().replace("-", "").toLowerCase()
35:java 下载文件到本地,输出样式 header('Content-Type:application/xxx')
36: Java 异常类层次结构
粉红色的是受检查的异常(checked exceptions),其必须被 try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 CHecked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守.
绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除...
而声明为Error的,则属于严重错误,需要根据业务信息进行特殊处理,Error不需要捕捉。
37 JAVA BufferedReader 类从标准输入读取数据
1,从标准输入上建立输入流:
BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
http:// System.in 表示标准输入,一般指键盘。
建立输入流,从标准输入读取数据到缓冲区中。
当在标准输入中输入一行字符串时,按回车之后,这行数据就会被读取到缓冲区中。
比如: abc \r\n(表示按下回车键)
那么msg就会赋值为 abc
String msg = null;