JAVA基础知识与题目汇总(持续更新)

it2024-10-21  39

JAVA基础

基本数据类型 数值型:

byte 1字节 8位 -128~127 short 2字节 16位 -32768~32767 int 4字节 32位 -2^31~2^31-1 long 8字节 64位 2^63~2^63-1

浮点类型:

float 4字节 32位 double 8字节 64位

字符型:char 2字节 16位 0~65535

布尔型:boolean true false

2.引用类型:

字符串 String、 类 class 、枚举 enum、接口interface

3.重载与重写 重载(Overload):函数名相同,参数不同。可以改变返回值类型,参数的个数和类型。 重写(Override):和父类的的方法名称、参数完全相同。 4.面向对象的三大特征 封装、继承、多态。 5.抽象类

1、如果一个类里有抽象方法,那么这个类必须声明成抽象类。 2、一个类里面可以没有抽象方法,可以有非抽象方法, 3、类继承抽象类: 把子类也用abstract修饰,变成抽象类。 子类重写父类的抽象的方法 4、抽象类不能创建对象。 5、抽象类可以有构造方法,在创建子类的时候,super隐式调用父类的构造方法,将父类的属性和方法放到子类的对象空间里。 6、在继承你关系中,子类能够继承抽象类的各种属性和方法,除了私有的和构造方法。 7、只有公开的才可以和abstract连用,static final private 都不可以。 static属于类方法,不允许覆盖,abstract必须被覆盖。final不能被重写。

6.接口与抽象类区别

1、关键字:抽象类 abstract 接口interface 2、抽象类继承 extends 接口实现 implements 3、子类继承抽象类和 实现类实现接口的格式不同 4、接口中只有全局变量和抽象方法 抽象类中有各种属性和方法 5、抽象类只能单继承 接口可以多实现 6、抽象类的子类只能继承一个父类 实现类可以实现多个接口,并且还可以继承父类 7、抽象类的作用:提高代码的复用性 接口的作用:1、规范代码2、提高代码的拓展性

7.访问权限修饰符

本类中 本包中 其他包子类 其他包非子类 public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × ×

8.内部类

成员内部类

1、可以用四种访问权限修饰符修饰 2、可以有自己的属性和方法,除了静态的。 3、可以使用外部类的所有属性和方法,包括私有的。 4、创建对象 1、通过创建外部类对象的方式创建对象 外部类 外部类对象=new 外部类(); 内部类 对象名=外部类对象.new 内部类(); 2、内部类 对象名=new 外部类.new 内部类();

静态内部类

1、格式:static class 类名{} 2、可以声明静态的属性和方法 3、可以使用外部的静态的属性和方法 4、创建对象 内类名 对象名=new 内类名();(可以直接创建) 外部类名.内部类 对象名=new 外部类.内部类(); 包名.外部类名.内部类 对象名=new 包名.外部类.内部类(); 5、外部类与内部类同名时,默认是使用内部类对象调用外部类属性 this代表内部类对象 6、要想使用外部类属性,需要使用外部类对象调用

局部内部类

1、在方法中声明 2、只能用default修饰 3、可以声明属性和方法,但不能是静态的 4、创建对象,必须在声明内部类的方法内创建 5、调用方法的时候,局部内部类才会被执行

匿名内部类

1、匿名内部类只是用一次 2、格式: 父类或接口名 对象名=new 父类或接口名(参数列表){ 重写抽象方法 } 调用抽象方法:对象名.方法名

9.String、StringBuffer、StringBuilder

String 长度不可变 StringBuffer 长度可变 线程安全 速度慢 StringBuilder 长度可变 线程不安全 速度快

10.异常

try{}catch(){}catch(){}... catch中子类异常放在父类异常的上面 try{]catch(){}finally{} finally中的代码一定会被执行到

11.设计模式

1、单例模式 分类:懒汉式、饿汉式 1、构造方法私有化 2、在本类中创建本类对象 3、保证对象的唯一性final 4、给外界提供得到对象的方法 static 5、在多线程中,饿汉式安全,懒汉式不安全 2、简单工厂模式 批量创建对象 1 创建工厂类 : 创建对象的方法 2 果汁类 是所有种类果汁的父类 3 在工厂类的方法中返回果汁类 4 根据测试类中传递的字符串判断到底返回哪种果汁 5 测试类通过工厂类返回果汁对象 3、建造者模式 内部类使用场景 目的:静态内部类创建外部类对象 1、 创建外部类,在其中创建一个静态内部类 2、静态内部类中写属性,构造方法和set get方法 3、静态内部类中写一个方法,必须返回外部类对象 4、 给外部类创建对象,传递参数。 4、装饰者模式 1、在处理流中使用 2、子类重写父类的方法,提高父类方法的功能及效率 3、为了尽可能减少重复代码,在重写的方法中用父类的对象调用父类原来的方法 4、得到父类对象可以通过将父类对象作为子类属性,通过子类构造方法传递父类对象

12.集合

HashMap和Hashtable的区别?

HashMap:实现了Map接口,允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率高于Hashtable。 Hashtable:不能将null作为key或者value。方法是同步的,线程安全。

ConncurrentHashMap和hashtable比较

ConcurrentHashMap融合了hashtable和hashmap二者的优势。hashtable是做了同步的,即线程安全,hashmap未考虑同 步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下,同步操作能保证程序执行的正确性。 但是hashtable是阻塞的,每次同步执行的时候都要锁住整个结构,ConcurrentHashMap正是为了解决这个问题而诞生的, ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术(一个Array保存多个Object,使用这些对 象的锁作为分离锁,get/put时随机使用任意一个)。它使用了多个锁来控制对hash表的不同部分进行的修改。

HashMap的工作原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象 的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正 确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

13.Java I/O

1.字节流 FileInputStream,FileOutputStream 2.字符流 FileReader,FileWriter 缓冲流,转换流,对象流,打印流。。。

14.多线程

进程和线程的区别

1、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位) 2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间而线程是共享进程中的数据的,使用相同的地址空间。 3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。 4、多进程程序更健壮。多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响。

创建线程的两种方式

1、创建一个类继承Thread→重写run方法→创建线程对象→启动线程 2、实现Runable→重写run方法→创建共享资源对象→创建线程对象,将将共享资源对象添加到线程中→启动线程

run与start的区别

run没有开辟新的栈空间,没有新线程,都是主线程在执行。 start开辟了新的栈空间,在新的栈空间启动run()方法。

线程调度

setPriority();分配优先级,默认5,最低1,最高10 .join();插队,阻塞指定的线程等到另一个线程完成以后再继续执行 .sleep();需要设置睡眠时间 .yield();礼让,当执行到这个方法时,会让出cpu时间,立马变成可执行状态 **java中的sleep()和wait()的区别** 对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。 sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者, 当指定的时间到了又会 自动恢复运行状态。 在调用sleep()方法的过程中,线程不会释放对象锁。 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池, 只有针对此对象调用notify()方法后本线程才进入 对象锁定池准备获取对象锁进入运行状态。

线程的五种状态

新建 就绪 执行 死亡 阻塞

线程同步

1、synchronized修饰静态方法和普通方法有什么区别? 在static方法前加synchronizedstatic:静态方法属于类方法,它属于这个类,获取到的锁,是属于类的锁。 在普通方法前加synchronizedstatic:非static方法获取到的锁,是属于当前对象的锁。 2、synchronized与Lock的区别? 首先synchronized是java内置关键字,在jvm层面,Lock是个java类; synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁; synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁; 用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了; Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题

Java网络编程

1.TCP/UDP/IP协议

1、TCP/IP协议与Http协议的区别? TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据;IP协议是网际互连协议,只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。 2、TCP与UDP TCP(Transmission Control Protocol): 面向连接,数据安全可靠,效率偏低,传输数据大小无限制 UDP:面向无连接,数据安全不可靠,执行效率高,数据大小不超过64kb

2.反射机制

1、反射: 反射是将类中的属性,方法,构造方法等解剖成一个个小的对象,并且能够调用 2、为什么使用反射: 在一个类中,可以创建另外一个类的对象,调用其的属性和方法,无论那个类是否被创建了。 3、如何使用反射: 类 Class class=Class.forName(包名.类名),每一个类都有唯一的一个类对象,这个类对象可以的得到类中的所有信息。 构造方法 class.getConstructor(null); 得到无参构造方法,返回Constructor class.getConstructor(String.clss,int.class);得到有参构造方法,返回Constructor constructor2.newInstance("曹菜菜",21); 返回Object类型的对象 class.getConstructors(); 得到所有构造方法,返回Constructor[]数组 方法 getMethod(); 得到普通的方法,返回Method,指定方法名 class1.getMethod("eat", null); 无参、无返回值、非私有的方法。 class1.getMethod("play", String.class); 有参、无返回值。非私有方法。参数一,方法名。参数二,参数类型.class method(n).invoke(object,null); 方法的执行,参数一是对象,参数二是传的参数值。 getMethods(); 得到子类和父类所有普通的方法,返回Method[]数组 class1.getDeclaredMethod("sleep", null);得到私有的方法 method6.setAccessible(true); class1.getDeclaredMethods(); 得到自己类的所有方法,包括私有的,返回Method[] 属性 getFields(); 得到public所有属性,返回Field[] getFileld("name"); 得到public属性,返回Field,指定属性名 field3.set(object5, "菜菜"); Object object6 = field3.get(object5); getDeclareFields(); 得到所有属性,包括私有的,返回Field[] getDeclareField(); 得到属性,包括私有的,指定属性名,返回Field 4、反射的优点 1、提高了java程序的灵活性和扩展性,降低了耦合性,提高了自适应的能力 2、允许程序创建和控制任何类的对象,无需提前编码目标类 5、反射的缺点 1、性能问题 2、代码维护问题

3.JS 4.SQL

1、创建表 create table [if not exists] tablename(_id integer primary key autoincrement,name vachar(15)....); 2、追加列 alter table tablename add 字段名 integer 3、插入数据 insert into tablename(id,name...)values(1,'aa'); 4、查询数据 select * from tablename where name='aa'; 5、修改数据 update tablename set name='aa' where name='aa'; 6、删除数据 delete from tablename where name='aa' 7、模糊查询 select * from tablename where name like '%aa%'; 8、升序 select * from employees order by id ; 9、降序 select * from employees order by id desc; 10、多字段 select * from employees order by department_id desc,salary asc;

5.Servlet

1、浏览器和服务器的交互 请求/响应式交互 1>浏览器先发送请求给服务器 2>指定的servlet去接收 (根据method属性值如果是post则调用doPost,如果不是则 调用doGet) 3>在servlet中动态的执行逻辑代码,也可以动态给浏览器发送数据 4>服务器响应浏览器的请求 2、C/S结构:客户端/服务器 优势:充分利用两端硬件的优势,提高了执行效率 劣势:必须安装客户端软件,维护客户端的更新 3、B/S结构:浏览器/服务器 优势:操作简单,不需要下载软件。只需要网络 劣势:将所有的操作全部交给服务器处理,增加了服务器的压力。 4、页面跳转: request.getRequestDispatcher("new.jsp").forward(request, response); 地址栏显示servelet的名字?属性名=属性值&...,可以将前一个网页的值传递过去。 5、重定向: response.sendRedirect("new.jsp"); 地址栏中显示指定页面的值。不能传递数据。 6、request request.getParameter("useName");括号内写的是输入框的名字。 request.getParameterValues("hobby");复选框,返回数组。 requst.setAttribute(属性的名字,属性值) requst.getAttribute(属性名字),在另一个页面中写。 doGet() name = new String(name.getBytes("iso-8859-1"),"utf-8") doPost() 给requst设置统一的编码格式 (要在得到表单中内容之前调用) request.setCharacterEncoding("utf-8"); 7、response response.sendRedirect("new.jsp");地址栏中显示的是 指定页面的地址。 8、请求方式: get: 1、可以缓存 2、请求保留在浏览器的历史中 3、可以收藏为书签 4、处理敏感数据时不能用 5、数据的长度有限制 6、数据在URL中对所有人可见 7、数据类型必须使用ASCII编码。 8、安全性差 post: 1、不可以缓存 2、请求不保留在浏览器的历史中 3、不可以收藏为书签 4、数据的长度无限制 5、数据在URL中不可见 6、数据类型无限制 7、安全在好 9、生命周期: http请求→解析请求→创建servlet实例→调用init()方法→调用service方法→输出响应信息→响应 10、错误提示 404:没有找到页面 500:服务器发生错误,一般代码有误 200:正确连接

6.forward和redirect两种跳转方式的区别?

1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL. 2.从数据共享来说 forward:转发页面和转发到的页面可以共享request里面的数据. redirect:不能共享数据. 3.从运用地方来说 forward:一般用于用户登陆的时候,根据角色转发到相应的模块. redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 4.从效率来说 forward:高. redirect:低. 本质上说, 转发是服务器行为,重定向是客户端行为。

SSM

spring spring bean的生命周期包括四个阶段:实例化 Instantiation 属性赋值 Populate 初始化 Initialization 销毁 Destruction
最新回复(0)