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默认会按照一定的顺序保存数据,如果明确定义了主键,则按照主键顺序保存。如果没有主键,但有唯一索引,就按照唯一索引的顺序保存。如果有几个列都是唯一的,都可以作为主键的时候,为了提高查询效率,应选择最常用访问的列作为主键。另外,innodb的secondary 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
最后的评价是:“一周内等通知”!没戏。。。