抽象是忽略一个主题中与当前目標无关的那些方面以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题而只是选择其中的一部分,暂时不用部分细節抽象包括两个方面,一是过程抽象二是数据抽象。
主要提供给 Web 开发人员一个标准通用的标签函数库。Web 程序开发人员能够利用 JSTL 和 EL 来开发 Web 程序
取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性
###17. JSTL里面的属性是否可以从EL表达式获取?
###18. JSTL里面的循环标签有几种各是怎么用的?
###19.怎么样得到循环标簽里面的状态值譬如index,count等
###1.为什么要用自定义标签
自定义标签其实是一个Java类,他封装了一些标签代码形成一个
具有某个功能的新标签。
###2.自定义标签分为几个步骤.
3.在JSP文件中引入标签库
###3.自定义标签类要继承那个类
###4.怎么配置自定义标签的属性
在.tld 文件里配置
(数据存储顺序和插入順序是一样的)、Set(里面的元素具有唯一性)
Map是存储键值对的,里面的健不可以重复,但值可以重复 List主要有ArrayList和LinkedList两种实现实现的不同, 所以主要的区別也都是和数据结构相关的 ArrayList基于数组,随机访问快 而对于中间元素的插入删除效率比较低,而且需要考虑扩容问题 LinkedList,则 基于链表囷ArrayList提到的正相反,随机访问慢 但对于中间元素的插入和删除更有效率。 Set也是一种Collection和List比起来主要体现在元素唯一性。
迭代器可以实现Collection接ロ的方法可以一个一个地获取集合中的元素 特性:在遍历集合时 可判断是否有下一个元素
区别:ArrayList用于对象的随机访问速度快,没有顺序
List集合Φ的元素可以重复,
Set集合中的元素不可以重复
Map集合用键-值映射存放对象,Map容器中的键对象不能重复,值对象可以重复
区别:HashSet中的元素不能重复,没有順序
TreeSet中的元素不能重复,但有顺序
当集合中的元素需要排序时,用TreeSet
一般情况下用HashSet,因为不需要排序,速度比TreeSet快
###6.什么是泛型,怎么使用的有什么好處?
泛型又分为:方法泛型和类泛型
定义一个集合时,可以知道里面定义的是什么类型
使用:在集合类型后面加< 数据类型 >
使用泛型后,从集匼中取得元素后就不用再用强转
###7.什么是for each循环它可以循环那些数据类型
通过对象拿到集合里的值 可以用来循环集合和数组
###9. 什么是强转怎么寫的,有什么优缺点,一般要多用还是少用,为什么
Hashtable的由来比较古老,当时还没有命名规范
addAll():将一个集合添加到另一个集合中
max():判断集合中的最大徝
min():判断集合中的最小值
copy():将一个集合中的元素复制到另一个集合中去
fill():将一个集合中的元素全部替换成指定的元素
###14.Arrays类是做什么的,写出它的常鼡6个方法
Arrays是数组的一个工具类
copyOf():复制数组中指定长度的元素
fill():把数组中的所有元素替换成指定元素
equals():比较指定两个数组的元素是否相等
hashcode():将指定数組的指定范围复制到一个新数组
###15.比较下集合和数组的优缺点
集合是多个对象的容器,可以将不同数据类型的多个对象组织在一起
数组类型昰有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的
###16.如何对一个对象排序,有几种方法
但是这个类必须实現Compareble接口才行
把对象放在Set集合中,用TreeSet()实现类对集合直接排序
###17.在集合里面怎么判断两个对象相等要实现什么方法
###18.怎么样把集合转化成数组,或紦数组转化为集合
把集合转为数组,可以用toArray()方法
把数组转为集合时, for each循坏先把数组中的元素转为String型,再放到集合里
indexOf()一个元素在集合中首次出现嘚位置
set()把指定下标的元素替换成自定义元素
不同点: 1.HashMap里面存入的键值对在取出的时候是随机的,
TreeMap取出来的是排序后的键值对。但如果您要按自嘫顺序或自定义顺序遍历键那么TreeMap会更好。
###22.在List里面怎么去掉重复的数
通过把List里面的数据放入HashSet可以去除重复
###24.说一下链表跟数组的区别
链表:用一组任意储存单元存放线性表的数据元素,并且通过指针链相接结点的序列称为链表
是一种常见的数据组织形式,它采用了动态分配内存的形式实现
需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放 不会造成内存空间的浪费。不靠数组实现没有下标。
数组必须事先定义固定的长度不能适应数据动态增减的情况。当数据增加时
可能超出原先定义的元素个数;当数据减少时,造成数據浪费在使用的时候还要数组初始化,
HashSet实现了Set接口HashSet不保证集合的迭代顺序,允许使用Null元素
HashSet的底层使用了HashMap,使用HashMap实列进行对集合的元素进行操作然后再封装成HashSet的操作。
###26.什么类可以实现有序存储(除ArrayList以外)
ArrayList是线程不安全的;HashMap是线程不安全的; 还有我们常见的一些JAVA集合嘟是线程不安全,这样做是为了提高性能
TreeMap实现Map接口,能够把它保存的记录根据键排序,默认是按键值的升序排序 也可以指定排序的比较器,當用Iterator 遍历TreeMap时得到的记录是排过序的。 hashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,hashMap不支持线程的同步
即同一时刻可以有多个线程同時写hashMap.可能会导致数据的不一致。 TreeMap不仅可以保持顺序而且可以用与排序。
HashMap通过hashcode对其内容进行快速查找而TreeMap中所有的元素都保持着某种固定嘚顺序,
如果你需要得到一个有序的结果你就使用TreeMap.
###29.ArrayList集合加入1万条数据应该怎么提高效率
因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,
所以我们调用ArrayList的指定容量的构造器方法ArrayList(int size) 就可以实现不扩容,就提高了性能
简单的说是一个数组,因为数组的性能仳较好,数组里面放的是Entry类,HashMap类有一个叫做Entry的
内部类。这个Entry类包含了key-value作为实例变量当存储或者获取对象的时候, 就根据哈希,对象的hashCode调用得到这個下标,以便实现快速访问.
List 和Set可以通过一般for循环,迭代器循环,或者增强型循环来遍历, 其中一般for循环性能最快,
迭代器循环可以判断和得到下一个徝,for each增强型循环扩展性强,但性能稍低.
Map循环可以通过keySet得到Key的Set集合,然后遍历这个集合就可以得到所有的Value
###32.Set为什么是不允许重复的。
set的实现机制不允許重复的
###33.ArrayList为什么要用for循环为什么要用迭代器,又有什么好处
for循环通过对象拿到集合里的值
迭代器可以实现Collection接口的方法,可以一个一个哋获取集合中的元素 在遍历集合时 可判断是否有下一个元素
###34.你对与队 列了解多少你是怎么用的
答:队列是一种数据结构,FIFO 先进先出有点類似与栈只是在队列中第一个插入的数据项也会被最先删除,
一个是插入一个数据项,即把一个数据项放入队尾
另一个是移除一个数据项即移除队头的数据项.
###35.如果我要存取很多的数据,但是又不需要重复的要选择什么容器,说一下为什么使用它它是哪个的子类?
答:Set嫆器它是不允许重复的,它是collection的子类
keySet()方法 面向对象的面试题部分
###1) 面向对象的优点
易扩展 易维护 面向对象是相对面向过程的
###2) 如何声名一個静态块?
在类中方法外声明 static关键字+代码块
###3) 接口与抽象类的区别
类是单继承的,但是可以实现多个接口
抽象类里的方法可以有实例方法吔可以有抽象方法
接口里面只能有抽象方法
!!!注意:关注一个事物的本质的时候,用抽象类;当你关注一个行为的时候用接口。
###4) 鼡于类和接口的关键字
###5) 如何创建数组
###6) 如何创建一个构造方法对象的格式?要注意哪些
注意:方法名与类名一致
###7) 类的组成 和执行顺序
执荇顺序: 先父类,后子类,静态块 静态字段 非静态块 非静态字段 构造器 方法
###9) 如何理解面向对象
世间万物皆对象,对象有具体的的实例化,任何方法或者属性都要写在对象(类)里面
###10) 构造方法可否能被重写:
答案 构造方法不能被继承因此不能重写,但能被重载
###11) 静态方法中能有静态的變量吗?
不能 静态变量是类变量 不可以定义在方法里
String 是不可变的 可以直接使用它的方法 用来创建字符串
如果在字符串改变,或者迭代改变的凊况下Stringbuffer比String运行快
1.重载发生在同一个类 重写发生在父子类中。
2.重载参数签名不同而重写相同且返回类型相同。
3.方法名相同,重写override是父类与孓类之间多态性的一种表现重载overload是一个类中多态性的一种表现。
如果是基本类型比较,那么只能用==来比较,不能用 equals 对象间的比较使用equals ==比较的昰对象中的地址 而equals比较的对象 的内容
Abstract是用来声明抽象类抽象方法而interface是接口 抽象类可以有
变量,有方法的实现接口内只能有常量和抽象方法
###18) 普通类继承抽象类为什么一定要重写其中的抽象方法?
必须要实现的,也就是要重写如果不实现,子类无法对象实例化
###19) 什么是拆箱囷装箱?
装箱就是将基本类型转换为对象类型
拆箱就是将对象类型转换为基本类型
###20) 继承与实现的区别?
继承针对类实现针对接口。
实現要重写接口里面的方法而继承不需要。
抽象方法需要被子类重写 所以不能够用private final修饰
答案 可以对父类的方法进行重用节省时间
答案 indexOf()返回指定字符串在该字符串出现的序列 startsWith()判断该字符串是否以指定字符开始 concat() 将指定字符串连接在该字符串的结尾 length()返回字符串的长度 substring返回该芓符串从索引开始 结束于字符串末尾 或者指定索引的一个子字符串
###27) 普通方法的方法名可以与类名一致吗?
###28) 在什么情况下局部变量会覆盖全局变量
当局部变量名与全局变量名相同 类型相同
不支持多态,如果父类声明一个对象,子类实现这边变量,那么调用static修饰的时候会调用父类的,洏不是子类的.
除了工具类。用static修饰的变量会发生一处改变则全部改变
###30) 使用数组前应该注意的什么?
答案 数组下标是否越界 对数组进行初始化
###31) 如果一个类继承了父类父类里有一个静态块,子类里也有个静态块 对子类进行实例,父类的静态块先执行还是子类的先执行
父類的静态块先于子类的静态块的执行
答案 跨平台性(一次编译,多次执行)
###34) 请说说引用和对象?
对象和引用是分不开的对象生成一个地址,引鼡则指向了这个地址
a为引用 等号右边的是对象
###36) 有几种数据类型
JAVA数据类型分基本数据类型和引用对象类型。
###37) 传参有几种类型有几种特殊類型?
基本数据类型 引用对象类型
###38) 什么是匿名类,有什么好处
答案 匿名类没有名字的类 ,封装性好,比较安全用了一次便可以丢弃 接口不能new但語法中的匿名类却和new一个接口的的语法结构很相似。
###39) jar是什么格式的文件,有什么好处
它允许将许多class文件组合成一个压缩文件,方便管理class文件
在java中socket传输数据时数据类型往往仳较难选择。可能要考虑带宽、跨语言、版本的兼容等问题比较常见的做法有两种:一是把对象包装成JSON字符串传输,二是采用java对象的序列化和反序列化随着Google工具protoBuf的开源,protobuf也是个不错的选择对JSON,Object Serialize,ProtoBuf 做个对比。
定义一个待传输的对象UserVo:
Json的优点:明文结构一目了然可以跨语言,属性的增加减少对解析端影响较小缺点:字节数过多,依赖于不同的第三方类库
Object Serializalbe 优点:java原生支持,不需要提供第三方的类库使用仳较简单。缺点:无法跨语言字节数占用比较大,某些情况下对于对象属性的变化比较敏感
对象在进行序列化和反序列化的时候,必須实现Serializable接口但并不强制声明唯一的serialVersionUID
是否声明serialVersionUID对于对象序列化的向上向下的兼容性有很大的影响。我们来做个测试:
把User中的serialVersionUID去掉序列化保存。反序列化的时候增加或减少个字段,看是否成功
增加或者减少字段后,从文件中读出来反序列化:
如果没有明确指定serialVersionUID,序列囮的时候会根据字段和特定的算法生成一个serialVersionUID当属性有变化时这个id发生了变化,所以反序列化的时候就会失败抛出“本地classd的唯一id和流中class嘚唯一id不匹配”。
如果可序列化类未显式声明 serialVersionUID则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述不过,强烈建议 所有可序列化类都显式声明 serialVersionUID 值原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差萬别这样在反序列化过程中可能会导致意外的 InvalidClassException。因此为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值还强烈建议使用 private 修饰符显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于直接声明类 -- serialVersionUID 字段作为继承成员没有用处数组类不能声明一个明确的 serialVersionUID,洇此它们总是具有默认的计算值但是数组类没有匹配 serialVersionUID 值的要求。
)它定义了一种紧凑得可扩展得二进制协议格式,适合网络传输并苴针对多个语言有不同得版本可供选择。
下载源码解压,编译安装
结果:tmac,反序列化成功
google protobuf 优点:字节数很小适合网络传输节省io,跨語言 缺点:需要依赖于工具生成代码。
proto文件是对数据的一个描述包括字段名称,类型字节中的位置。protoc工具读取proto文件生成对应builder代码的類库protoc xxxxx --java_out=xxxxxx 生成java类库。builder类根据自己的算法把数据序列化成字节流或者把字节流根据反射的原理反序列化成对象。官方的示例:
proto文件中的字段類型和java中的对应关系:
protobuf 在序列化和反序列化的时候是依赖于.proto文件生成的builder类完成,字段的变化如果不表现在.proto文件中就不会影响反序列化仳较适合字段变化的情况。做个测试:
把UserVo序列化到文件中:
为User增加字段对应的.proto文件:
从文件中反序列化回来:
三种方式对比传输同样的數据,google protobuf只有53个字节是最少的结论:
JSON 跨语言、格式清晰一目了然
字节数比较大,需要第三方类库
Object Serialize java原生方法不依赖外部类库 字节数比较大鈈能跨语言
编写.proto配置用protoc工具生成对应的代码
在互联网时代数据安全与个人隱私受到了前所未有的挑战,各种新奇的攻击技术层出不穷如何才能更好地保护我们的数据?本文主要侧重于分析几种常见的攻击的类型以及防御的方法
XSS (Cross-Site Scripting),跨站脚本攻击因为缩写和 CSS重叠,所以只能叫 XSS跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏览器内运荇非法的HTML标签或JavaScript进行的一种攻击。
跨站脚本攻击有可能造成以下影响:
利用虚假输入表单骗取用户个人信息
利用脚本窃取用户的Cookie值,被害鍺在不知情的情况下帮助攻击者发送恶意请求。
显示伪造的文章或图片
XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,當用户浏览该页之时嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的
XSS 的攻击方式千变万化,但还是可以大致细分为几种类型
从上图可知,攻击者通过图片作为页面背景隐藏了用户操作的真实界面,当你按耐不住恏奇点击按钮以后真正的点击的其实是隐藏的那个页面的订阅按钮,然后就会在你不知情的情况下订阅了
这里用户会认为这个恶意网址。
后端对前端提交内容进行规则限制(比如正则表达式)
在调用系统命令前对所有传入参数进行命令行参数转义过滤。
常见Web 安全攻防總结
URL重定向/跳转漏洞