Java基础理论知识

308 阅读12分钟

java基础

三大集合:List、Map、Set区别与联系

一、结构特点

List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合; List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。

结构图
结构图

二、实现类

    1. List接口有三个实现类:
    • 1.1 LinkedList 基于链表实现,链表内存是散列的,增删快,查找慢;
    • 1.2 ArrayList 基于数组实现,非线程安全,效率高,增删慢,查找快;
    • 1.3 Vector 基于数组实现,线程安全,效率低,增删慢,查找慢;
  1. Map接口有四个实现类:

    • 2.1 HashMap 基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null 键;
    • 2.2 HashTable 线程安全,低效,不支持 null 值和 null 键;
    • 2.3 LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序;
    • 2.4 SortMap 接口 TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序
  2. Set接口有两个实现类:

    • 3.1 HashSet 底层是由 Hash Map 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hash Code()方法;
    • 3.2 LinkedHashSet 继承于 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap
    • 3.3 TreeSet 底层数据结构是红黑树。(唯一,有序)

三、 区别

  1. List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
  2. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
  3. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 Tree Set 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator< Type >接口来自定义排序方式。

四、补充:HashMapHashTable

HashMap 是线程不安全的,HashMap 是Map的实现类,是将键映射到值得对象,不允许键值重复,允许空键和空值;由于非线程安全, HashMap的效率要较 HashTable 的效率高一些.

HashTable 是线程安全的一个集合,不允许 null 值作为一个 key 值或者 Value 值; HashTablesychronize(同步化),多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被多个线程访问的时候需要自己为它的方法实现同步;

final、finally、finalize的区别与用法

1. 简单区别:

final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。

2. 中等区别:

虽然这个单词在Java中都存在,但是并没太多关联:

  • final:java中的关键字,修饰符。
    • A).如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类被继承。因此,一个类不能同时被声明为abstract抽象类的和final的类。
    • B).如果将变量或者方法声明为final,可以保证它们在使用中不被改变.
      • 被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。
      • 被声明final的方法只能使用,不能重载。
  • finally:java的一种异常处理机制。   finally是对Java异常处理模型的最佳补充。finally结构使代码总会执行,而不管无异常发生。使用finally可以维护对象的内部状态,并可以清理非内存资源。特别是在关闭数据库连接这方面,如果程序员把数据库连接的close()方法放到finally中,就会大大降低程序出错的几率。
  • finalize:Java中的一个方法名。 Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

Java中常见修饰符

访问修饰符有四个,权限从大到小:publicprotecteddefaultprivate ,访问范围如下:

访问权限 本类 本包 不同包子类 不同包非子类
public
protected
default
private

索引的作用

索引的作用:创建索引能够大大的提高系统的性能

优点:

  1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
  2. ②大大加快数据的检索速度,这也是创建索引的最主要原因
  3. 加快表与表之间的连接,在实现数据的参考完整性方面特别有意义
  4. 在使用分组和排序,子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
  5. 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

  1. 创建索引和维护索引需要时间,这种时间随着数据量的增加而增加
  2. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占物理空间,如果要建立聚簇索引,需要的空间更大
  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这就降低了数据的维护速度。

索引是创建在数据库的表中的列上。因此,在创建索引的时候,要考虑哪些列上适合加索引,那些列上不适合加索引。

什么是视图

视图是从一个或者几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。

数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以一旦基本表中发生数据变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就是一个窗口,通过视图可以看到数据库中自己想了解的数据变化。

创建视图语法:

create view 视图名 as 查询语句;

视图使用案例:

//查询姓胡的学生名和专业名
select stuname,mojarname from stuinfo s inner join major m on s.majorid=m.id where s.stuname like '胡%';

//创建视图
 create view v1 as select stuname,mojarname from stuinfo s inner join major m on s.majorid=m.id ;
 
//利用视图()
select * from v1 where stuname like='张%';

什么是存储过程

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程。

存储过程是一个预编译的SQL语句,比如一些场景的sql比较复杂,并且需要经常使用或者多次使用的。存储过程的优点是说只需创建一次编译一次,以后在该程序中就可以多次直接调用。如果一个sql是经常需要操作的,并且逻辑不容易改变,使用存储过程比单纯SQL语句执行要快,因为sql每次查询而且都需要编译。而且网络开销也大,存储过程只需要传一个名字,在数据库调用就行了,而且这样程序可移植高。

优势:

  1. 提高性能 SQL语句在创建过程时进行分析和编译。 存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划,这样,在执行过程时便可节省此开销。
  2. 降低网络开销 存储过程调用时只需用提供存储过程名和必要的参数信息,从而可降低网络的流量。
  3. 便于进行代码移植 数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。
  4. 更强的安全性
  • 4.1 系统管理员可以对执行的某一个存储过程进行权限限制,避免非授权用户对数据的访问
  • 4.2 在通过网络调用过程时,只有对执行过程的调用是可见的。 因此,恶意用户无法看到表和数据库对象名称、嵌入自己的 Transact-SQL 语句或搜索关键数据。
  1. 使用过程参数有助于避免 SQL 注入攻击。 因为参数输入被视作文字值而非可执行代码,所以,攻击者将命令插入过程内的 Transact-SQL 语句并损害安全性将更为困难。
  2. 可以对过程进行加密,这有助于对源代码进行模糊处理。

劣势:

  1. 存储过程需要专门的数据库开发人员进行维护,但实际情况是,往往由程序开发员人员兼职
  2. 设计逻辑变更,修改存储过程没有SQL灵活

跳出for循环,break和continue的区别

  1. break:跳出当前循环体,也称结束当前循环体
  2. continue:跳出此次循环,继续执行下一次循环

XML和Json的区别

xml:可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言。

json:(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。

二者区别:

它们都是一种数据交换格式。

  1. xml是重量级的,json是轻量级的。
  2. xml在传输过程中比较占带宽,json占带宽少,易于压缩。
  3. xmljson都用在项目交互下,xml多用于做配置文件,json用于数据交互。
  4. json可用jacksongson等方法解析,xml可用dom,sax,demo4j等方式解析。

转发与重定向的区别

转发(服务端行为) 形式:

request.getRequestDispatcher().forward(request,response) 转发在服务器端发挥作用,通过forward()方法提交信息在多个页面之间进行传递。

  • 地址栏不会改变
  • 转发只能转发到当前Web应用内的资源
  • 在转发过程中,可以将数据保存到request域对象中去
  • 转发只有一次请求 转发是服务器端行为

转发过程:

  • 客户端浏览器发送http
  • web浏览器接受请求
  • 调用内部的一个方法在容器内部完成请求处理和转发动作

需注意的是:转发的路径必须是同一个web容器下的url。在客户端浏览器路径栏显示的仍然是第一次访问的路径。转发行为是浏览器只做了一次访问请求。

重定向(客户端行为)

形式:response.sendRedirect("");

  • 重定向地址栏会改变
  • 重定向可以跳转到当前web应用,甚至是外部域名网站
  • 不能在重定向的过程中,将数据保存到request域对象中。

重定向过程:

  • 客户端发送http请求,
  • web服务器接收后,发送302状态吗相应以及新的location给客户端浏览器
  • 客户端浏览器发现是302响应,则自动发送一个http请求,请求url为重定向的地址,响应的服务器根据此请求寻找资源并发送给客户。

Servlet 生命周期

Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()service()destroy()方法来表示

Servlet的生命周期包含了下面4个阶段:

  1. Servlet 通过调用 init () 方法进行初始化。
  2. Servlet 调用 service() 方法来处理客户端的请求。
  3. Servlet 通过调用 destroy() 方法终止(结束)。
  4. 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

Web服务器在与客户端交互时Servlet的工作过程是:

  1. 在客户端对web服务器发出请求
  2. web服务器接收到请求后将其发送给Servlet
  3. Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给WEB服务器.
  4. web服务器将从Servlet实例对象中收到的响应结构发送回客户端.

常见的几种RuntimeException[1]

  • NullPointerException - 空指针引用异常
  • ClassCastException - 类型强制转换异常。
  • IllegalArgumentException - 传递非法参数异常。
  • ArithmeticException - 算术运算异常
  • ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
  • IndexOutOfBoundsException - 下标越界异常
  • NegativeArraySizeException - 创建一个大小为负数的数组错误异常
  • NumberFormatException - 数字格式异常
  • SecurityException - 安全异常
  • UnsupportedOperationException - 不支持的操作异常 -End-

参考资料

[1]

常见的几种RuntimeException: https://blog.csdn.net/qq635785620/article/details/7781026