JAVA——Java基础

一: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读一次显示一次


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值