搜狗 java开发 面试

1、写strcpy函数。

检查点:1、空异常是否考虑到;2、字符串是否以‘\0’结尾;3、const src ;4、返回指针,为了链式表达式

char * strcpy( char *des, const char *src)
{
	if(src == NULL || des ==NULL)
	{
		throw("invalid param");
	}
	char  *addr = des;
	while((*des ++ = *src ++) != '\0');
	return addr;
}

2、hashcode()和equals()

      a)要判断两个对象是否相等,或者是否是同一个对象,要比较两个过程一是比较地址,二是比较内容。

      b)比较地址时,使用hashcode方法,相当于给对象编码,类似文件的md5(可能会有冲突),返回int类型。

     c)比较内容时,使用equals,返回bool。

    d)在hashmap中,判断key是否重复,首先先看看hashcode是否相同,再看equals是否相同。

    e)对一个自定义的类,判断实例是否相同,再覆盖equal方法的时候也要覆盖hashcode方法。

3、String、StringBuilder 和StringBuffer区别

String:字符串常量,对String更改值相当于生成新的String对象。当无引用的对象多的时候,垃圾收集器开始工作,影响执行速度。用于操作少量的数据。

StringBuffer:对对象本身进行操作。主要方法append,insert。线程安全,用在多线程操作字符串。

StringBuilder:对对象本身操作,线程非安全,用于单线程操作字符串。

4、jdk中,你常用的方法?

从包的角度想:

  • java.lang(语言包)
    • Object,祖宗类
    • 数据类型包装
    • Math:abs()、sin()、cos()、min()、max()、random()
    • 字符串类:String、StringBuffer
    • Thread类:线程Runable
    • 错误和异常处理类:Throwable(所有错误和异常的父类)、Exception(异常类,用户处理)、Error(系统处理)
  • java.util(实用包)
    • 日期类
    • 数据结构类:LinkedList、Vector、Stack、HashTable
    • 随机数类
  • java.io(输入输出包)
    • 输入流
    • 输出流:实现文件的输入输出,管道的输入输出,网络数据的传输
  • java.net(网络函数包)
    • Socket类

5、设计模式:单例,工厂,责任链,写一下单例

      单例:

public class Singleton
	{
		//持有私有静态类,目的是防止被引用,初始值为null,目的是延迟加载
		private static Singleton instance = null;
		//构造函数为私有函数,防止被实例化
		private Singleton(){}
		public static getInstance()
		{
			if(instance == NULL)
			{
				synchronized(instance)
				{
					if(instance == NULL)
					{	
						instance = new Singleton();
					}
				}
			}
			return instance;
		}
		/* 保证对象序列化一致   */
		public Object readResolve()
		{
			return getInstance();
		}
	}

6、mysql,InnoDB,1000万的数据,如何就select * from user where city=?,alive=? order by age desc 建立索引。

mysql一张表存放1000万的数据,我想肯定这个设计是有问题的,因为mysql的性能就摆在那里,千万级数据使用mysql存储,是没有优势的。面试官强调的是数据多,如果不建立索引,查询会很慢。

innodb只支持b+树索引,进一步分为clustered index 与 secondary index。在一次查询中,只能使用一个索引。

clustered index的叶结点保存着整行的数据。如果,定义了primary key,则clustered index就是primary key的索引;如果没有定义primary key mysql会选中第一个仅有not null列的unique索引作为主键,并把此索引当作clustered index使用;如果没找到这样的列,innodb会创建一个6字节的RowId作为主键。所以每张表有且只有一个clustered index

Secondary index的叶结点不包括行的全部数据,包含键值以外还包括一个bookmark,可以告诉innodb到什么地方可以找到相对应的完整行数据,还保存了主键的健值。Secondary index包含主键,但不包含完整的行数据,所以innodb总是会先从secondary index的叶节点判断是否能得到所需的数据。

索引设计原则

1.       搜索的索引列,不一定是所要选择的列。也就是说,最适合索引的列是出现在where子句中的列,或者连接子句中指定的列,而不是出现在select关键字后的选择列表中的列。

2.       使用唯一索引。考虑某列的分布,索引的列的基数越大,索引的效果越好。例如,对性别M/F列做索引没多大用处。

3.       使用短索引。如果是对字符串进行索引,如果有可能应该指定前缀长度。

4.       利用最左前缀。尽量将使用频繁且过滤效果好的字段放“左边”

5.       不要过度索引。

6.       Innodb默认会按照一定的顺序保存数据,如果明确定义了主键,则按照主键顺序保存。如果没有主键,但有唯一索引,就按照唯一索引的顺序保存。如果有几个列都是唯一的,都可以作为主键的时候,为了提高查询效率,应选择最常用访问的列作为主键。另外,innodbsecondary index都会保存主键的键值,所有主键要尽可能选择较短的数据类型。可以看出,应当尽量避免对主键的修改。经过dba的测试,保证主键的递增可以提高插入性能。

Mysql如何使用索引

1.       对于创建的多列索引,只要查询的条件中用到了最左边的列,索引一般就会被使用。

2.       对于使用like的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能被使用。

3.       如果对大文本进行搜索,应该使用全文索引,而不是使用like ‘%...%’. 但不幸的是innodb不支持全文索引。

4.       如果列名是索引,使用 index_column is null将使用索引。Oracle是不行的。

5.       如果mysql估计使用索引比全表扫描更慢,最不会使用索引。

6.       如果使用memory/head表并且where条件中不使用”=”进行索引列,那么不会用到索引。Head表只有在”=”的时候才会使用索引。

7.       or分割开的条件,如果or前的条件中的列有索引,而后面列中没有索引,那么涉及到的索引都不会被用到。

8.       不是多列索引的第一部分不会走索引。

9.       %开始的like不会走索引

10.   如果列是字符串,那么一定要在where条件中把字符串常量值用引号引起来,否则不能走索引。因为,mysql默认把输入的常量值进行转换以后才进行检索。

11.   经过普通运算或函数运算后的索引字段不能使用索引

12.   不等于操作不能使用索,<>not in

13.   Order by 优化:某些情况下,mysql可以使用一个索引满足order by,而不需要额外的排序。Where条件与order by 使用相同的索引,并且order by的顺序和索引顺序相同,并且order by的字段都是升序或者都是降序。

SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;

SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2

DESC;

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;

但是以下情况不使用索引:

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC 

--order by 的字段混合 ASC  DESC

SELECT * FROM t1 WHERE key2=constant ORDER BY key1 

-- 用于查询行的关键字与 ORDER BY 中所使用的不相同

SELECT * FROM t1 ORDER BY key1, key2 

-- 对不同的关键字使用 ORDER BY  


以上是我搜集的mysql方面的索引知识。我当时想建立组合索引,也就是复合索引,即(city, alive, age)索引按照age升序。

7、Https的过程。

     这个过程,我自己的感觉时,当时看懂了。过段时间又忘了。理解的不够透彻吧。

     HTTPS的两个主要过程:身份验证和通信加密。

身份验证

1、浏览器向服务器发送请求,请求信息中包含机密方式和加密算法,其中加密方式包括对称算法+密钥交换算法+摘要算法

2、服务器回复浏览器,自己选择的加密方式,再把自己的证书和公钥发送给浏览器

3、浏览器验证证书是否可信,主要验证5点,一是证书是否是根证书的颁发机构锁颁发;二是证书是否在吊销列表中;三是证书是否过期;四是证书的域名是否和网站域名相似;

     五是网站是否在黑名单列表。

4、服务器验证客户端的信息,例如手机,随机串等等


身份验证成功,或者允许继续通信,进行数据加密传输

1、浏览器产生随机的密码,用服务器提供的公钥加密,用hash计算握手消息。把消息发给服务器

2、服务器接收到信息后,使用自己的私钥解密,并计算握手信息的hash,如果与客户端传来的相同,此握手过程结束。

这个过程是确保双方之间获得一致密码。

     

   

8、常见的对称和非对称加密算法。

      对称加密:加密和解密过程中用同一个密钥。AES、DES、RC5、IDEA(分组加密),RC4(序列加密)

      非对称加密:密钥对成对出现,RSA,DSA、DH

9、常用的hash算法。

散列算法:MD5,SHA1,Base64,CRC


最后的评价是:“一周内等通知”!没戏。。。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值