Java基础知识一

标签: Java 分类: Java 创建时间:2019-06-20 07:30:45 更新时间:2024-12-03 13:01:37

java基础知识,其实所有的知识都是基础知识。在这里权当记录下常用的东西吧。(我只是一个搬运工)

1.lambda表达式中的局部变量要用final

在使用Java8及其高版本的lambda表达式时,在表达式内部引用外部的局部变量时,应该将外部的局部变量声明为final类型,否则不可以用。为什么 Lambda 表达式(匿名类) 不能访问非 final 的局部变量呢?因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该局部变量已经被销毁了,而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。

2.Exception和RuntimeException

在try-catch语句中,如果想在catch语句中抛出异常,应该抛出RuntimeException而不是throw new Exeption,否则会报unhandle的错误.

3.java构建http请求

使用java构建http请求,主要有两种方式,一种时通过原生的 HttpURLConnection 连接,另一种方式就是通过第三方库 Apache HttpClient。 参考文章中已经把很多的方法列的很明白了。

4.java转发与重定向

url转发与重定向的关系:

1)重定向两次请求,转发一次请求

2)重定向地址栏的地址变化,转发地址不变

3)重新定向可以访问外部网站,转发只能访问内部资源

4)转发的性能要优于重定向

转发的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 转发
@RequestMapping("/getPipeline")
public void getPipeline(HttpServletRequest request, HttpServletResponse response){
String url=urlConfig.getPipeline();
try {

RequestDispatcher requestDispatcher=request.getRequestDispatcher(url);
requestDispatcher.forward(request,response);

}catch (Exception e){
logger.error("getPipeline",e);
}
}
// 重定向
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("redirectServlet's doGet");
String path="testServlet";
response.sendRedirect(path);
}

5.java数组

(1) 数组的声明方式:

1
2
3
4
5
6
7

type[] arr_name;//推荐使用方式

type arr_name[];

//静态初始化
int[] a={1,2,3,4,5,6,7,8,9,11,12,32,43,,54,34,35};

(2) 反转数组

1
Collections.reverse(color_list);

(3) 数组和list相互转换

参考文章:
1.Java数组详解

6.java中list和数组相互转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
List<Integer> sColorChange = new ArrayList<>();
sColorChange.toArray(new Integer[sColorChange.size()]);

//先准备一个List
List<String> testList=new ArrayList<>();
testList.add("a");
testList.add("b");
testList.add("c");
//List转String
String[] strs1=testList.toArray(new String[testList.size()]);
for(String s:strs1){
System.out.println(s);
}

//准备一个String数组
String[] strs = {"aa","bb","cc"};
//String数组转List
List<String> strsToList1= Arrays.asList(strs);
for(String s:strsToList1){
System.out.println(s);
}

7.HttpServletRequest中读取HTTP请求的body

8.获取当前时间戳

1
2
3
4
5
6
//方法 一 效率最高
System.currentTimeMillis();
//方法 二 效率最慢
Calendar.getInstance().getTimeInMillis();
//方法 三 效率其次
new Date().getTime();

9.对字符串进行sha1加密

微信接入的时候,需要对字符串进行sha1加密,有两种方式,一种是自己写,一种是使用现成的函数包commons-codec,我选择使用commons-codec包。

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>

然后使用:

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
// MD5
String str = "abc";

DigestUtils.md5Hex(str);

// SHA1
String str = "abc";
DigestUtils.shaHex(str); //新版的废弃了

//使用
DigestUtils.sha1Hex(str);

//BASE64

//加密
String str= "abc"; // abc为要加密的字符串
byte[] b = Base64.encodeBase64(str.getBytes(), true);
System.out.println(new String(b));


//解密
String str = "YWJj"; // YWJj为要解密的字符串
byte[] b = Base64.decodeBase64(str.getBytes());
System.out.println(new String(b));

10.获取url地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 返回的是完整的url,包括Http协议,端口号,servlet名字和映射路径,但它不包含请求参数。
request.getRequestURL()

// 得到的是request URL的部分值,并且web容器没有decode过的
request.getRequestURI()

// 返回 the context of the request.
request.getContextPath()

// 返回调用servlet的部分url.
request.getServletPath()

// 返回url路径后面的查询字符串
request.getQueryString()

11.注解@SuppressWarnings

@SuppressWarings注解,用于抑制编译器产生的警告信息,其注解目标为类、字段、函数、函数入参、构造函数和函数的局部变量,专家建议注解应声明在最接近警告发生的位置。

1
2
3
4
5
6
7
8
9
// 抑制单类型的警告:
@SuppressWarnings("unchecked")

// 抑制多类型的警告
@SuppressWarnings(value={"unchecked", "rawtypes"})

// 抑制所有类型的警告:
@SuppressWarnings("all")

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。