每日知识点整理(1)
2020年8月11-12日
目的:整理错题,相关知识点学习
知识点1:冒泡排序
1.原理:比较两个相邻的元素,将值大的元素交换到右边
2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
(2)比较第2和第3个数,将小数 放在前面,大数放在后面。
......
(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
(6)依次类推,每一趟比较次数减少依次
3.举例:
数组为:[10,2,8,5,3,7,4] ,第一轮循环,两两比较,大的数放在后边.所以第一轮循环数组变化为:
[2,10,8,5,3,7,4]
[2,8,10,5,3,7,4]
[2,8,5,10,3,7,4]
[2,8,5,3,10,7,4]
[2,8,5,3,7,10,4]
[2,8,5,3,7,4,10]
显然,每次循环都会讲一个最大的数放在最后边,然后,进行第二次循环,对除最大数以外的剩余数组进行同样的排序,选出第二大的数,以此类推,完成排序.
附上手写的排序代码
public class BubbleSort { public static void main(String[] args) { Random random = new Random(); int[] arr = new int[10]; for (int i = 0; i < arr.length - 1; i++) { arr[i] = random.nextInt(100); } System.out.println(Arrays.toString(arr)); sort(arr); } public static void sort(int[] arr) { System.out.println("开始排序"); if (arr != null && arr.length > 0) { for (int i = arr.length - 1; i >= 1; i--) { if (arr[i - 1] > arr[i]) { int temp; temp = arr[i - 1]; arr[i - 1] = arr[i]; arr[i] = temp; } for (int j = 0; j < arr.length - 1; j++) { if (arr[j + 1] < arr[j]) { int temp; temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } System.out.println("第" + j + "次排序" + Arrays.toString(arr)); } } } System.out.println("排序结束,结果为:"+Arrays.toString(arr)); } }
PS:升序排列还是降序排列都实现了排序,只是顺序不同而已.
知识点2:XSS和XSSFilter
XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等
简单来说,就是攻击者通过恶意注入js代码的方式,来获取敏感信息.原理是拼接代码,类似于sql注入
XSS攻击主要分为三类:
1.反射型XSS:
将XSS代码段以URL形式提交,比如内容为<script>document.cookie</script>
,即可获取cookie信息.
2.存储型XSS
存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码
最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与Js解析执行,于是触发了XSS攻击.
3.DOM XSS
DOM XSS和反射型XSS,存储型XSS的差别在于DOM XSS的代码并不需要服务器参与,触发XSS靠的是浏览器端的DOM解析,完全是客户端的事情.
举例:http:/www.xxx.com/xss/domxss.html#alert(xss)
,这个URL#后的内容是不会发送到服务器端的,仅仅在客户端被接收并解执行,从而实现xss攻击.
XSS攻击的解决办法:
1.过滤输入和转义输出.对用户的输入进行校验,在输出时进行转义,禁止代码形式的输入存在,即可避免XSS攻击.但是黑客亦可针锋相对,想出新的注入方式,比如<img>
标签注入代码等等,在此按下不表.
2.XSSFilter可以过滤或者转义一些特定字符,在此不展开.
题目赏析:
知识点3:科学计数法
在刷牛客上编程题的时候遇到了科学计数法该如何转换成普通计数法的问题.在此整理一下:
首先科学计数法的表示采用符号E,代表十的次幂,比如:3.156E+7表示31560000,3.156E-7表示0.0000003156
在java中,整数部分位数大于等于8时开始以科学计数法显示,整数位为0,当小数位以0开始连续出现大于等于3时开始以科学计数法显示
目前有三种方式可以将科学计数法转变成普通计数法:
1.NumberFormat,代码如下:
public static void main(String[] args) { BigDecimal bigDecimal = new BigDecimal("3.156E-3"); NumberFormat format = NumberFormat.getInstance(); //设置小数位的有效数字 format.setMaximumFractionDigits(4); System.out.println(format.format(bigDecimal)); }
注意:如果设置的位数比实际长度短,结果会四舍五入
2.BigDecimalFormat,代码如下:
public static void main(String[] args) { BigDecimal bigDecimal = new BigDecimal("3.156E-3"); //设置格式 DecimalFormat format = new DecimalFormat("0.000"); System.out.println(format.format(bigDecimal)); }
注意:同上,也会四舍五入.
3.BigDecimal的toPlainString()方法,代码如下:
public static void main(String[] args) { BigDecimal bigDecimal = new BigDecimal("3.156E-3"); System.out.println(bigDecimal.toPlainString()); }
注意:精度不可变.BigDecimal的构造方法很多,不一定是要传入String类型的值。
BigDecimal中的toString方法和toPlanString方法的区别:
toString():返回此BigDecimal的字符串表示形式,如果需要指数,则使用科学计数法
toPlainString():返回不带指数字段的此BigDecimal的字符传表示形式
知识点整理的比我想象要慢点多,所以要减量+提速.