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

JAVA基础

  1. 基本数据类型
    数值型:

     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. 成员内部类

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

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

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

     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.集合

  1. HashMap和Hashtable的区别?

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

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

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

13.Java I/O

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

14.多线程

  1. 进程和线程的区别

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

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

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

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

    新建    就绪   执行   死亡  阻塞
    
  6. 线程同步

    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

  1. spring
    spring bean的生命周期包括四个阶段:实例化 Instantiation 属性赋值 Populate 初始化 Initialization 销毁 Destruction
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值