zoukankan      html  css  js  c++  java
  • java面试题

    一、string和stringbuffer和stringbuilder的区别

    1、string:

    String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间

    String str = "abc";
    str += "def";

    2、stringbuffer和stringbuilder:

    当对字符串进行修改的时候,特别是字符串对象经常改变的情况下,需要使用 StringBuffer 和 StringBuilder 类。

    和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

    StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

    由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

    StringBuilder str = new StringBuilder("abc");
    str.append("def");

    3、小结:

    (1)如果要操作少量的数据用 String;

    (2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

    (3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。

    二、list, set, map区别

    List特点:元素有放入顺序,元素可重复 

    Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
    Map特点:元素按键值对存储,无放入顺序 

    三,get,post,put,delete

    1、GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。

    2、与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。

    3、POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。

    4、DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。

    四,get,post区别

    GET 请求可被缓存

    GET 请求保留在浏览器历史记录中

    GET 请求可被收藏为书签

    GET 请求有长度限制

    GET 请求只应当用于取回数据

    GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息

     GET参数通过URL传递,POST放在Request body中。

    五、mysql的索引

    1、方式:

    根据存储方式的不同,MySQL 中常用的索引在物理上分为  B-树索引和 HASH 索引两类,两种不同类型的索引各有其不同的适用范围。

    1) B-树索引

    B-树索引又称为 BTREE 索引,目前大部分的索引都是采用 B-树索引来存储的。

    B-树索引是一个典型的数据结构,其包含的组件主要有以下几个:

    • 叶子节点:包含的条目直接指向表里的数据行。叶子节点之间彼此相连,一个叶子节点有一个指向下一个叶子节点的指针。
    • 分支节点:包含的条目指向索引里其他的分支节点或者叶子节点。
    • 根节点:一个 B-树索引只有一个根节点,实际上就是位于树的最顶端的分支节点。


    基于这种树形数据结构,表中的每一行都会在索引上有一个对应值。因此,在表中进行数据查询时,可以根据索引值一步一步定位到数据所在的行。

    B-树索引可以进行全键值、键值范围和键值前缀查询,也可以对查询结果进行 ORDER BY 排序。但 B-树索引必须遵循左边前缀原则,要考虑以下几点约束:

    • 查询必须从索引的最左边的列开始。
    • 查询不能跳过某一索引列,必须按照从左到右的顺序进行匹配。
    • 存储引擎不能使用索引中范围条件右边的列。

    2) 哈希索引

    哈希(Hash)一般翻译为“散列”,也有直接音译成“哈希”的,就是把任意长度的输入(又叫作预映射,pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。

    哈希索引也称为散列索引或 HASH 索引。MySQL 目前仅有 MEMORY 存储引擎和 HEAP 存储引擎支持这类索引。其中,MEMORY 存储引擎可以支持 B-树索引和 HASH 索引,且将 HASH 当成默认索引。

    HASH 索引不是基于树形的数据结构查找数据,而是根据索引列对应的哈希值的方法获取表的记录行。哈希索引的最大特点是访问速度快,但也存在下面的一些缺点:

    MySQL 需要读取表中索引列的值来参与散列计算,散列计算是一个比较耗时的操作。也就是说,相对于 B-树索引来说,建立哈希索引会耗费更多的时间。

    不能使用 HASH 索引排序。

    HASH 索引只支持等值比较,如“=”“IN()”或“<=>”。

    HASH 索引不支持键的部分匹配,因为在计算 HASH 值的时候是通过整个索引值来计算的。

    2、类型

    1) 普通索引

    普通索引是 MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。

    普通索引允许在定义索引的列中插入重复值和空值。

    创建普通索引时,通常使用的关键字是 INDEX 或 KEY。

    2) 唯一索引

    唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复。

    唯一索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。

    创建唯一索引通常使用 UNIQUE 关键字。

    3) 主键索引

    顾名思义,主键索引就是专门为主键字段创建的索引,也属于索引的一种。

    主键索引是一种特殊的唯一索引,不允许值重复或者值为空。

    创建主键索引通常使用 PRIMARY KEY 关键字。不能使用 CREATE INDEX 语句创建主键索引。

    4) 空间索引

    空间索引是对空间数据类型的字段建立的索引,使用 SPATIAL 关键字进行扩展。

    创建空间索引的列必须将其声明为 NOT NULL,空间索引只能在存储引擎为 MyISAM 的表中创建。

    空间索引主要用于地理空间数据类型 GEOMETRY。对于初学者来说,这类索引很少会用到。

    5) 全文索引

    全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引。

    全文索引允许在索引列中插入重复值和空值。

    不过对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。

    创建全文索引使用 FULLTEXT 关键字。

    3、复合索引

    索引在逻辑上分为以上 5 类,但在实际使用中,索引通常被创建成单列索引和多列索引(又称复合索引,组合索引)。

    1)单列索引

    单列索引就是索引只包含原表的一个列。在表中的单个字段上创建索引,单列索引只根据该字段进行索引。

    单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。

    2)多列索引

    组合索引也称为复合索引或多列索引。相对于单列索引来说,组合索引是将原表的多个列共同组成一个索引。多列索引是在表的多个字段上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中第一个字段时,索引才会被使用。

    例如,在表中的 id、name 和 sex 字段上建立一个多列索引,那么,只有查询条件使用了 id 字段时,该索引才会被使用。

    总结:

    多个单列索引在多条件查询时优化器会选择最优索引策略,可能只用一个索引,也可能将多个索引全用上! 但多个单列索引底层会建立多个B+索引树,比较占用空间,也会浪费一定搜索效率,故如果只有多条件联合查询时最好建联合索引!

    当创建**(a,b,c)联合索引时,相当于创建了(a)单列索引**,(a,b)联合索引以及**(a,b,c)联合索引**

    其他知识点:

    1、需要加索引的字段,要在where条件中
    2、数据量少的字段不需要加索引;因为建索引有一定开销,如果数据量小则没必要建索引(速度反而慢)
    3、避免在where子句中使用or来连接条件,因为如果俩个字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描
    4、联合索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高。

    六、equals与==

    == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。

    equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。

    java中的数据类型可以分为两类:

    基本数据类型

    byte,short,char,int,long,float,double,boolean

    基本数据类型之间的比较需要用双等号(==),因为他们比较的是值

    引用数据类型

    接口、类、数组等非基本数据类型

    Java中的字符串String属于引用数据类型。因为String是一个类

    当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为没new一次就会重新开辟一个新的堆内存空间

    equals()方法介绍

    Java中所有的类都是继承与Object这个基类的,在Object类中定义了一个equals方法,这个方法的初始行为是比较对象的内存地址,但在一些类库中已经重写了这个方法(一般都是用来比较对象的成员变量值是否相同),比如:String,Integer,Date 等类中,所以他们不再是比较类在堆中的地址了

    String a = new String("ab"); // a 为一个引用
    String b = new String("ab"); // b为另一个引用,对象的内容一样
    String aa = "ab"; // 放在常量池中
    String bb = "ab"; // 从常量池中查找
    
    System.out.println(aa==bb); // true
    
    System.out.println(a==b);  // false,非同一对象
           
    System.out.println(a.equals(b)); // true

    总结:

    对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。

     == 的作用:
      基本类型:比较的就是值是否相同
      引用类型:比较的就是地址值是否相同
    equals 的作用:
      引用类型:默认情况下,比较的是地址值,重写该方法后比较对象的成员变量值是否相同

  • 相关阅读:
    CTF-1-5题笔记
    无相劫指:Web安全之其他专题—第七天
    七伤拳:Web安全之文件包含漏洞专题—第六天
    CTF-输入密码查看flag -80
    工业级路由器采用的协议和功能
    PLC模拟量采集模块在工控领域的应用
    串口服务器的作用和工作原理是什么
    在PLC中开关量采集模块的作用
    4G DTU和4G工业路由器有哪些区别?
    应该怎么提升4G工业路由器的无线信号?
  • 原文地址:https://www.cnblogs.com/Neonuu/p/14414886.html
Copyright © 2011-2022 走看看