A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 逆风TO 于 2018-5-21 11:04 编辑

公司名称:大连斯锐信息技术有限公司
公司地址:西安市 碑林区 天成大厦 光德路8号 天成大厦8楼
公司规模:1000-9999人
主要业务:外包
公司外景:



1.   说说反射的用途及实现
其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对一个类进行解剖。
反射的核心:是 JVM 在运行时才动态加载的类或调用方法或属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
可以通过下面这个图看到反射的作为。 在面试时候,可以尝试跟面试官描述一下。


反射的基本步骤:
1、获得Class对象,就是获取到指定的名称的字节码文件对象。
2、实例化对象,获得类的属性、方法或构造函数。
3、访问属性、调用方法、调用构造函数创建对象。

反射的三种方法:

1):对象名.getCalss();        
//此方法来自于Object  对象已经存在的情况下, 可以使用这种方式
Student s = new Student();
Class clazz1 = s.getClass();
2):类名.class                           
// 类名.class这是一个静态的属性, 只要知道类名, 就可以获取
Class clazz2 = Student.class;
3):Class.forName(“路径名”);      (最常用)   注意: 抛异常        
// 通过Class类中的静态方法, 指定字符串, 该字符串是类的全类名(包名+类名)
Class clazz3 = Class.forName("xxx.Student");

注意:在运行期间,一个类,只有一个Class对象产生
三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。

反射最重要的用途就是开发各种通用框架。
很多框架(比如 Spring)都是配置化的(比如通过 XML文件配置 JavaBean,Action之类的),为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。

java反射机制主要提供了以下功能:
l  在运行时判定任意一个对象所属的类;
l  在运行时构造任意一个类的对象;
l  在运行时判定任意一个类所具有的成员变量和方法;
l  在运行时调用任意一个对象的方法;
l  生成动态代理。



2.   COOKIE跨域问题
 cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie。在默认情况下,出于安全方面的考虑,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。那么此时如果希望其父级或者整个网页都能够使用cookie,就需要进行路径的设置。
  path表示cookie所在的目录,asp.net默认为/,就是根目录。在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/cd/,那么test下的所有页面都可以访问到cookie1,而/test/和/test/dd/的子页面不能访问cookie2。这是因为cookie能让其path路径下的页面访问。
让这个设置的cookie 能被其他目录或者父级的目录访问的方法:
        document.cookie = "name = value; path=/";
domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。






3.   索引使用的注意事项
在数据库的使用中,数据量一但增长,那么索引的使用也一定会相应增长。在考验我们在开发当中对数据库的了解有没有进阶。
这个时候也许有一些技术是我们开发当中没有用到过的,但是也要知无不言,言无不尽。
MySQL 索引通常是被用于提高WHERE 条件的数据行匹配时的搜索速度,在索引的使用过程中,存在一些使用细节和注意事项。
不要在列上使用函数和进行运算
不要在列上使用函数,这将导致索引失效而进行全表扫描。
select * from news where year(publish_time)< 2017
为了使用索引,防止执行全表扫描,可以进行改造。
select * from news where publish_time <'2017-01-01'
还有一个建议,不要在列上进行运算,这也将导致索引失效而进行全表扫描。
select * from news where id / 100 = 1
为了使用索引,防止执行全表扫描,可以进行改造。
select * from news where id = 1 * 100
尽量避免使用 != 或 not in或 <> 等否定操作符
应该尽量避免在 where 子句中使用!= 或 not in 或 <> 操作符,因为这几个操作符都会导致索引失效而进行全表扫描。
尽量避免使用 or 来连接条件
应该尽量避免在 where 子句中使用or 来连接条件,因为这会导致索引失效而进行全表扫描。
select * from news where id = 1 or id = 2
多个单列索引并不是最佳选择
MySQL 只能使用一个索引,会从多个索引中选择一个限制最为严格的索引,因此,为多个列创建单列索引,并不能提高 MySQL 的查询性能。
假设,有两个单列索引,分别为 news_year_idx(news_year) 和 news_month_idx(news_month)。现在,有一个场景需要针对资讯的年份和月份进行查询,那么,SQL 语句可以写成:
select * from news where news_year = 2017and news_month = 1
事实上,MySQL 只能使用一个单列索引。为了提高性能,可以使用复合索引 news_year_month_idx(news_year, news_month) 保证 news_year 和 news_month 两个列都被索引覆盖。
复合索引的最左前缀原则
复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。如果不是按照索引的最左列开始查找,则无法使用索引。
假设,有一个场景只需要针对资讯的月份进行查询,那么,SQL 语句可以写成:
select * from news where news_month = 1
此时,无法使用 news_year_month_idx(news_year,news_month) 索引,因为遵守“最左前缀”原则,在查询条件中没有使用复合索引的第一个字段,索引是不会被使用的。
覆盖索引的好处
如果一个索引包含所有需要的查询的字段的值,直接根据索引的查询结果返回数据,而无需读表,能够极大的提高性能。因此,可以定义一个让索引包含的额外的列,即使这个列对于索引而言是无用的。
范围查询对多列查询的影响
查询中的某个列有范围查询,则其右边所有列都无法使用索引优化查找。
举个例子,假设有一个场景需要查询本周发布的资讯文章,其中的条件是必须是启用状态,且发布时间在这周内。那么,SQL 语句可以写成:
select * from news where publish_time >='2017-01-02' and publish_time <= '2017-01-08' and enable = 1
这种情况下,因为范围查询对多列查询的影响,将导致news_publish_idx(publish_time, enable) 索引中 publish_time右边所有列都无法使用索引优化查找。换句话说,news_publish_idx(publish_time,enable) 索引等价于 news_publish_idx(publish_time) 。
对于这种情况,我的建议:对于范围查询,务必要注意它带来的副作用,并且尽量少用范围查询,可以通过曲线救国的方式满足业务场景。
例如,上面案例的需求是查询本周发布的资讯文章,因此可以创建一个news_weekth 字段用来存储资讯文章的周信息,使得范围查询变成普通的查询,SQL 可以改写成:
select * from news where     news_weekth = 1 and enable = 1
然而,并不是所有的范围查询都可以进行改造,对于必须使用范围查询但无法改造的情况,我的建议:不必试图用 SQL 来解决所有问题,可以使用其他数据存储技术控制时间轴,例如 Redis 的 SortedSet 有序集合保存时间,或者通过缓存方式缓存查询结果从而提高性能。
索引不会包含有NULL值的列
只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL值,那么这一列对于此复合索引就是无效的。
因此,在数据库设计时,除非有一个很特别的原因使用 NULL 值,不然尽量不要让字段的默认值为 NULL。
隐式转换的影响
当查询条件左右两侧类型不匹配的时候会发生隐式转换,隐式转换带来的影响就是可能导致索引失效而进行全表扫描。下面的案例中,date_str 是字符串,然而匹配的是整数类型,从而发生隐式转换。
select * from news where date_str =201701   
因此,要谨记隐式转换的危害,时刻注意通过同类型进行比较。
like 语句的索引失效问题
like 的方式进行查询,在 like“value%” 可以使用索引,但是对于 like “%value%” 这样的方式,执行全表查询,这在数据量小的表,不存在性能问题,但是对于海量数据,全表扫描是非常可怕的事情。所以,根据业务需求,考虑使用 ElasticSearch 或 Solr 是个不错的方案。

4.   Mysql人innoDB和MyISAM数据库引擎的区别。
作为 MySQL 数据库的两种主要的存储引擎,InnoDB 与 MyISAM 各有长处。
在 MySQL 5.1 及之前的版本中,MyISAM 是默认的存储引擎,而在 MySQL 5.5 版本以后,默认使用 InnoDB 存储引擎。
MyISAM 不支持行级锁,换句话说,MyISAM 会对整张表加锁,而不是针对行。同时,MyISAM 不支持事务和外键。MyISAM 可被压缩,存储空间较小,而且 MyISAM 在筛选大量数据时非常快。
InnoDB 是事务型引擎,当事务异常提交时,会被回滚。同时,InnoDB 支持行锁。此外,InnoDB 需要更多存储空间,会在内存中建立其专用的缓冲池用于高速缓冲数据和索引。InnoDB 支持自动奔溃恢复特性。
InnoDB 与 MyISAM 的主要区别

对于如何选择 InnoDB 与 MyISAM 存储引擎,我的建议:一般情况下,应该优先选择 InnoDB 存储引擎,并且尽量不要将 InnoDB 与 MyISAM 混合使用。


总结
感觉现在面试当中问的问题有些高于平时开发当中问的问题了。但是这些面试题还算是常见。我们在准备面试的过程中,也都有涉及到过这些面试题。因此学员也不用过度的紧张害怕。相信只要通过努力都能够打到工作的。






点评

谢谢分享  发表于 2018-6-14 19:20

177 个回复

倒序浏览
感谢田老师分享   棒棒哒
回复 使用道具 举报
回复 使用道具 举报
哇塞,老师们都好厉害啊,我也要加油哦
回复 使用道具 举报
谢谢分享啊啊啊
回复 使用道具 举报
相信只要通过努力都能够打到工作的。
回复 使用道具 举报
棒棒哒
回复 使用道具 举报
谢谢分享啊啊啊
回复 使用道具 举报
感谢分享
回复 使用道具 举报
三更灯火五更鸡,正是男儿读书时。
回复 使用道具 举报
              
回复 使用道具 举报
回复 使用道具 举报
厉害了,棒棒哒
回复 使用道具 举报
感谢分享
回复 使用道具 举报
666666666666666666666
回复 使用道具 举报
回复 使用道具 举报
谢谢楼主分享!!!
回复 使用道具 举报
回复 使用道具 举报
加油!你是最棒哒!
回复 使用道具 举报
耶耶耶耶耶耶耶耶耶
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马