实习基础总结

来源:互联网 发布:怎么判断矩阵的一致性 编辑:程序博客网 时间:2024/06/07 05:08

看着身边的人都实习了,自己有点着急了,发现基础太差,然后开始恶补基础。。。

1.关于Object类的常用方法

equal() toString()方法 23333,重要要回答线程通信的方法,不然岂不是很LOW,线程之间通信wait()、notify()、notifyAll()!问常用方法 就可以回答这三个

protected Object clone() //创建并返回此对象的一个副本

boolean equals() //指示其他某个对象是否与此对象相等

String toString() //返回该对象的字符串表示

void wait() //在其他线程调用此对象的notify()或者notifyAll()前,导致当前线程在等待

void notify() //唤醒在此对象监视器上等待的单个线程

void notifyAll() //唤醒在此对象监视器上等待的所有线程

int hashcode() //返回该对象的哈希码值

Class<> getClass() //返回此Object的运行时类

protected void finalize() //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

这里每一个方法用来做什么,务必要搞清楚,例如对一个非基本数据类型的对象进行复制,不影响原对象,就用clone()方法

2.关于一些常用的类、包、接口、常见的runtimeexceptio,举出例子

常见的类:BufferdeReader、BufferWriter、FileReader、FileWriter、String 、Integer、StringBuffer 、StringBuilder、Stack

常用的包:java.lang java.util java.io java.awt java.xml java.sql java.NET

常用的接口:List Map Document NodeList Remote 

常见的异常:  ArithmeticException (a=5/0即数学中除0异常)、ClassCastException(强制转换类型异常)、NullPointerException(空指针异常)、ArrayIndexOutofBoundsException(数组越界)、StringIndexOutBoundsExcepton(索引为负或者超出字符串大小)、IndexOutofBoundsException( 下标越界)SecurityException(安全异常)、FileNotFoundException(文件未找到异常)SQLException(操作数据库异常)IOException(i/o输入输出异常)

3.说说你常见的数据结构

数据结构很重要 程序=数据结构+算法+语言

我们Java面试不像c++他们应该问链表指针树、堆、图,哈哈,我们Java应该说说集合框架就行了吧

(1)关于集合框架那副图 ,首先collection和collections,collection是集合类的上级接口,就是所有java.util下所有几个的父接口,继承与他的接口主要有List Set,collections是针对集合类的一个工具类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化操作

(2)List和Set是继承自Collection接口,而Map并不是继承自Collection接口,Set集合中的元素是不能重复的,可以用iterator()方法来区分是否重复!equals()是判决两个set是否相等,equals()和==方法决定引用值是否指向同一个对象,equals在类中被覆盖,为的是当两个分离的对象的内容和类型匹配时,返回真值

(3)Collection框架中实现比较要实现 comparable/comparator接口

(4)ArrayList和Vector的区别

共同点:这两个类都实现了List接口(List接口继承了Collecton接口),他们都是有序集合,储存在这两个集合中的元素都是有顺序的,相当于一个动态的数组,我们以后可以按照位置索引号取出某个元素,并且其中的数据是允许重复的,这是和HashSet之类的集合最大的不同,HashSet之类的集合不可以按照索引号去检索其中的元素,也不允许有重复的元素

同步性:Vector是线程安全的,也就是说它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的。如果只有一个线程访问到集合,那最好使用ArrayList,因为他不考虑线程安全问题,效率会更高,如果多线程访问一个集合,那么最好使用Vector,这样就不用去考虑和编写线程安全的代码

关于线程安全问题:线程安全就是线程同步的意思,当一个程序对一个线程安全的方法或者变量进行访问的时候,其他的程序不能对他进行操作,必须等到这次访问结束以后才能对这个线程安全的方法进行访问,否则会造成错误发生,线程安全就是说,如果你的代码所在进程有多个线程在同时运行,而这些线程可能会同时运行这些都代码。如果每次运行结果和单线程运行的结果是一样的,其他的变量的值也和预期一样,就是线程安全的,线程安全的问题由全局变量和静态变量引起的,定义在方法内部的局部私有变量是没有线程安全问题的

对于ArrayList和Vector Hashtable和HashMap,要记住线程安全的问题,记住Vector和Hashtable是旧的,是Java一诞生就提供的,他们是线程安全的,ArrayList和HashMap是Java2中提供的,他们是线程不安全的

数据增长:ArrayList和Vector都有一个初始的容量大小,当储存进他们里面的元素个数超出容量,就要增加存储空间,每次增加存储空间,都会增加多个存储单元,Vector默认增加原来两倍ArrayList的增长策略没提,但是源码中大概1.5倍,ArrayList和Vectord都可以设置初始化空间大小,Vector可以设置增长的空间大小,ArrayList不行

(5)ArrayList和vector都是用数组方式存储数据,此数组元素数大于实际存储的数据,以便于增加插入元素,他们允许直接按照序号索引元素,但是插入元素时候需要涉及数组元素的移动等内存操作,所以数据索引快插入慢,vector使用了synchronized方法(线程安全),所以性能比ArrayList差,而LinkedList使用的是双向链表实现存储,按照序号索引需要进行前向或者后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度快,LinkedList是线程不安全的,但是LinkedList提供了一些方法,使得它可以被当做栈和队列来使用

(6)List和Map的区别

一个是存储单列数据的集合,一个是存储键值对的双列数据的集合,List存储的有顺序且允许重复,而Map中存储的数据时没有顺序的,其键是不能重复的,它的值是可以重复的,存值时用put(key,avlue),取值时用value=m.get(key)

(7)HashMap和Hashtable的区别

HashMap是线程不安全的,Hashtable是线程安全的,HashMap把Hashtable的contains方法去掉了,改成了containsvalue和containskey。因为contains方法更容易让人引起误解:hashtable是基于旧的dictionary类的,hashmap是Java1.2引入Map接口的一个实现;hashtable是线程安全的,同步的,hashmap是不安全的;只有hashmap可以让你将空值作为一个表的key或者value即hashmap允许将null做一个entry的key或者value,而hashtable是不允许的

4.String和StringBuffer的区别

这两个类可以存储和操作字符串,即包含多个字符的字符数据,String类提供数值不可改变的字符串,StringBuffer提供的字符串可以修改,所以当字符数据需要修改时候要使用StringBuffer,可以使用StringBuffer来动态的构造字符数据,还有一个StringBuilder,1.如果要操作少量的数据用 = String 2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder(线程不安全) 3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer(线程安全)4.速度方面String<StringBuffer<StringBuilder

String覆盖类equals方法和hashcode方法,而StringBuffer没有覆盖equals和hashcode方法,所以讲StringBuffer对象存储进Java集合中会出现问题(

String覆盖了equals方法和hashCode方法,即:可用语句/>if("a".equals("b")){...}以及比较哈希码的操作。但StringBuffer类型如上面的s就不能用s.equals(.....。/>故将对象装进集合时,对StringBuffer类型,无法完成比较的操作(这种操作对集合很重要),故出现了问题)

5.关于线程的一些问题?

(1)一般如何实现多线程,Java提供两种实习方式,一个是继承thread类,另一个是实现Runnable,由于Java不支持多继承,所以在多继承的时候,优先选择实现Runnable接口,因为通过实现接口的方式,间接的实现了多继承(thread是runnable的子类)

(2)线程之间通过哪些方法进行通信,wait()、notify()、notifyAll(),开启线程start()方法,线程的生命周期,创建、就绪、运行、阻塞、消亡

(3)线程池、interrupt()、currentThread()方法,线程池就是如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间

6.说说你常用的数据库

mysql常用存储引擎InnoDB和MyISAM,其中InnoDB适用频繁维护多修改插入的的,MyISAM适用少改写少插入的读取频繁的表,所以做开发的肯定InnoDB的存储引擎的用的多

关于事务,事务是并发控制的单位,用户定义的一个操作序列,要么全做,要么不做,是不可分割的,主要是保证数据的完整性!事务的特性ACID(原子性,一致性,隔离性,持久性)原子性表示事务中执行的任何失败都导致所做的修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态,事务的隔离性表示事务执行过程中对数据的修改,事务提交前,其他事务不可见,持久性表示已提交的数据在事务执行失败后,数据的状态都应该正确

事务就是为了保证数据的完整性,为了解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。那么Java事务的三种类型:JDBC事务、JTA(Java transaction API)事务、容器事务。spring的事务就是通过声明式的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处减小代码量,大大提高工作效率。

7.SQL之内外链接(还有LINUX软连接硬链接的问题)

left join 就是返回左表所有记录和右表中联结字段相等的记录,right就是右表所有记录和左表中联结字段相等的数据,inner join就是等值联结 只返回连接字段中相等的行记录 (a,b是where)(join 是on)

8.SQL优化

preparedStatement可以缓存sql语句,下一次执行相同语句的时候不需要再次解析,索引就是真正的sql优化(DB中的索引是某个表中一列或者多列值的集合和相对的指向物理标识这些值的数据页的逻辑指针)建立索引可以提高查询速度且把需要提高查询速度的字段都加入聚集索引,在sql中尽量多的适用commit!






原创粉丝点击