一:Java基本类型
基本类型有8种,又分为三类:1:字符类型char,2:布尔类型boolean,3:数值类型——数值类型又两类,1:整数类型(byte、short、int、long) 2:浮点类型(float、double)
byte(8位)、short(16位)、int(32位)、long(64位); float(32位)、double(64位);
引用类型:类(class)、接口(interface)、数组
字符串属于引用类型
1 Byte = 8 bit 【一个字节 = 8 个比特位】 一个比特表示一个表示二进制就是一个1或者一个0
计算机在任何时候只能识别二进制,例如:101011101101001
【现代的计算机底层采用交流电的方式,接通和断开两种状态,计算机只识别1或0】
1 Byte = 8 bit
1KB = 1024 Byte
1MB = 1024 KB
1GB = 1024 MB
1TB = 1024 GB
二:==和equals的区别是什么?
1:==解读
对于基本类型和引用类型,== 的作用是不同的,如下:
基本类型:比较的是值是否相同
引用类型:比较的是引用是否相同;
String x = “str”;
String y = “str”;
String z = new String(“str”);
System.out.println(x == y); // true
System.out.println(x == z); // false
因为x,y指向的是同一个引用,所以 == 是true,而new String();则是重新开辟了一个内存空间,所以== 是 false;
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
而equals 一直比较的是值,所以,一直都是true。
2:equals 解读
equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。
总结 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;
而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
三: final 在 Java 中有什么作用?
1:final修饰的类叫最终类,该类不能被继承。
2:final修饰的方法不能被重写。
3:final修饰的变量叫常量,常量必须初始化,初始化后值不能被修改
四:Java中操作字符串都有哪些类? 操作字符串的类有:String,StringBuffer,StringBuild。
1:String和StringBuffer、StringBuild的区别在于String声明的是不可变的对象,每次操作都是生产新的String对象,然后将指针指向新的String对象。
而StringBuffer、StringBuild可以在原有对象的基础上进行操作。所以在经常改变字符串内容的情况下不要使用String。
2:StringBuffer和StringBuild最大的区别在于,StringBuffer线程安全,stringBuild是非线程安全,但是,StringBuild的性能优于StringBuffer。
所以,单线程情况下推荐使用StringBuild,多线程情况下推荐使用StringBuffer。
3:如何将字符串反转?使用StringBuffer或者StringBuild的reserve()方法。
五: String 类的常用方法都有那些?
1:indexOf():返回指定字符的索引。
2:charAt():返回指定索引处的字符。
3:replace():字符串替换。
4:trim():去除字符串两端空白。
5:split():分割字符串,返回一个分割后的字符串数组。
6:getBytes():返回字符串的 byte 类型数组。
7:length():返回字符串长度。
8:toLowerCase():将字符串转成小写字母。
9:toUpperCase():将字符串转成大写字符。
10:substring():截取字符串。
11:equals():字符串比较。
六:普通类和抽象类的区别
1:普通类可以实例化,抽象类不能实例化
2:普通类不能有抽象方法,抽象类可以有抽象方法,也可以没有抽象方法
3:抽象类不能用final修饰,因为定义抽象类的目的就是为了让其他类继承的,final修饰的类不能被继承。编译也不会通过
七:接口和抽象类有什么区别?
1:默认方法实现——抽象类可以有默认的方法实现;接口不能有默认的方法实现。Java8之后,接口新增了一个default 关键字,被default修饰的方法不必让子类实现,还可有方法体。
2:实现方式——抽象类的子类可以通过extends 来继承;接口必须通过 implements 来实现接口。
3:构造函数——抽象类可以有构造函数;接口不能有构造函数。
4:main方法——抽象类可以有main方法,并且可以运行;接口不能有。
5:实现数量——类只能继承一个类;但是可以实现多个接口。
6:访问修饰符——抽象类中的方法可以是任意访问修饰符;接口中的方法默认使用public 修饰。
7:修饰符——抽象类用abstract,接口用interface。
八:Java中的IO流
1:按功能来分:输入流(input)、输出流(output)。
2:按类型来分:字节流和字符流。
字节流和字符流的区别:字节流是按8位传输,以字节为单位输入输出数据,字符流是按16位传输,以字符为单位输入输入数据。
九:BIO、NIO、AIO 有什么区别:
1:BIO:Block IO 同步阻塞式 IO,就是我们平时使用的IO,它的特点是模式简单使用方便,并发处理能力低
2:NIO:New IO 同步非阻塞 IO,是传统IO 的升级,客户端和服务器端通Channel(通道)通讯,实现了多路复用。
3:AIO:Asynchronous IO 是NIO的升级,也叫NIO2 ,实现了异步非阻塞 IO,异步 IO的操作基于事件和回调机制。
十:Files 的常用方法都有哪些?
1:Files. exists():检测文件路径是否存在。
2:Files. createFile():创建文件。
3:Files. createDirectory():创建文件夹。
4:Files. delete():删除一个文件或目录。
5:Files. copy():复制文件。
6:Files. move():移动文件。
7:Files. size():查看文件个数。
8:Files. read():读取文件。
9:Files. write():写入文件。
十:什么是Java反射
1:反射是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个属性和方法;这种在运行状态下动态获取信息以及动态调用对象的方法的功能 成为 Java 反射。
2:Java 获取反射的方式:
2.1:通过 new 对象 实现反射机制
2.2:通过路径实现反射机制
2.3:通过类名实现反射机制
//获取 反射机制的三种方式:
//方式一(通过建立对象)
Student stu = new Student();
Class classobj1 = stu.getClass();
System.out.println(classobj1.getName());
//方式二(所在通过路径-相对路径)
Class classobj2;
try {
classobj2 = Class.forName("com.tearsky.base.Student");
System.out.println(classobj2.getName()); // Class.forName("fanshe.Student");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//方式三(通过类名)
Class classobj3 = Student.class;
System.out.println(classobj3.getName());
十一:什么是 Java 序列化,什么情况下需要 Java 序列化?
1:Java 序列化是 为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读取出来。
2:什么情况下需要 Java 序列化?
2-1:想把的内存中的对象状态保存到一个文件中或者数据库中时候;
2-2:想用套接字在网络上传送对象的时候;
2-3:想通过 RMI(远程方法调用)传输对象的时候。
十二:动态代理是什么?有哪些应用?
1:动态代理就是在运行时动态生成的代理类。
2:动态代理的应用有 spring aop、hibernate 数据查询、测试框架的后端 mock、rpc,Java 注解对象获取等。
十三:怎么实现动态代理?
1:JDK 原生动态代理和 cglib 动态代理。JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。
十四:为什么要使用克隆?
1:克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。
十五:如何实现对象克隆?
1:实现 Cloneable 接口并重写 Object 类中的 clone() 方法。
2:实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
十六:深拷贝和浅拷贝区别是什么?
1:浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
2:深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。
Web 应用
十七:session 和 cookie 有什么区别?
1:存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。
2:安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。
3:容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。
4:存储的多样性:session 可以存储在 Redis 中、数据库中、应用程序中;而 cookie 只能存储在浏览器中。
十八:说一下 session 的工作原理?
1:session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把session 的 id 发送给客户端,客户端再存储到浏览器中。
2:这样客户端每次访问服务器时,都会带着sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。
十九:如果客户端禁止 cookie 能实现 session 还能用吗?
1:可以用,session 只是依赖 cookie 存储 sessionid,如果 cookie 被禁用了,可以使用 url 中添加sessionid 的方式保证 session 能正常使用。
二十:spring mvc 和 struts2 的区别是什么?
1:拦截级别:struts2 是类级别的拦截;spring mvc 是方法级别的拦截。
2:数据独立性:
2-1):spring mvc 的方法之间基本上独立的,独享 request 和 response 数据,请求数据通过参数获取,处理结果通过 ModelMap 交回给框架,方法之间不共享变量;
2-2):而 struts2 虽然方法之间也是独立的,但其所有 action 变量是共享的,这不会影响程序运行,却给我们编码和读程序时带来了一定的麻烦。
3:拦截机制:struts2 有以自己的 interceptor 机制,spring mvc 用的是独立的 aop 方式,这样导致struts2 的配置文件量比 spring mvc 大。
4:对 ajax 的支持:spring mvc 集成了 ajax,所有 ajax 使用很方便,只需要一个注解 @ResponseBody就可以实现了;而 struts2 一般需要安装插件或者自己写代码才行。
二十一:如何避免 SQL 注入?
1:使用预处理 PreparedStatement。
2:使用正则表达式过滤掉字符中的特殊字符。
二十二:什么是 XSS 攻击,如何避免?
1:XSS 攻击:即跨站脚本攻击,它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户 cookie、破坏页面结构、重定向到其他网站等。
2:预防 XSS 的核心是必须对输入的数据做过滤处理。
二十三:什么是 CSRF 攻击,如何避免?
1:CSRF:Cross-Site Request Forgery(中文:跨站请求伪造),可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件、发消息、购买商品,虚拟货币转账等。
2:防御手段:①:验证请求来源地址;②:关键操作添加验证码;③:在请求地址添加 token 并验证。
foreach和while的区别(编译之后)
foreach 一次读取全部内容,while读一次显示一次