已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java 知识总结 JAVA中堆和栈的区别?堆内存用于存储局部变量,当数据使用完,所占空间会自动释放?栈内存o数组和对象,通过new建立的实例都放在堆内存中o每一个实体都有内存地址值o实体中的变量都有默认的初始值o实体不再被使用,会在不确定的时间被垃圾回收器回收?方法区o本地方法,寄存器在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 java中变量在内存中的分配 1、类变量(static修饰的变量)在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。 静态变量的生命周期-一直持续到整个系统关闭 2、实例变量当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的物理位置。 实例变量的生命周期-当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存 3、局部变量局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放附java的内存机制Java把内存划分成两种一种是栈内存,另一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。 堆内存用来存放由new创建的对象和数组,在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。 而数组和对象本身在堆中分配,即使程序运行到使用new产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。 这也是Java比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!优缺点栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。 但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 另外,栈数据可以共享。 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。 但缺点是,由于要在运行时动态分配内存,存取速度较慢。 java集合类说明与区别1ArrayList:元素单个,效率高,多用于查询2Vector:元素单个,线程安全,多用于查询3LinkedList:元素单个,多用于插入和删除4HashMap:元素成对,元素可为空5HashTable:元素成对,线程安全,元素不可为空集合类说明及区别CollectionListLinkedListArrayListVectorStackSet MapHashtableHashMapWeakHashMap Collection接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。 一些Collection允许相同的元素而另一些不行。 一些能排序而另一些不行。 Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。 所有实现Collection接口的类都必须提供两个标准的构造函数无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。 后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。 典型的用法如下Iterator it=collection.iterator();/获得一个迭代子while(it.hasNext()Object obj=it.next();/得到下一个元素由Collection接口派生的两个接口是List和Set。 List接口List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。 用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。 和下面要提到的Set不同,List允许有相同的元素。 除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。 实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。 LinkedList类LinkedList实现了List接口,允许null元素。 此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。 这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。 注意LinkedList没有同步方法。 如果多个线程同时访问一个List,则必须自己实现访问同步。 一种解决方法是在创建List时构造一个同步的List Listlist=Collections.synchronizedList(new LinkedList(.);ArrayList类ArrayList实现了可变大小的数组。 它允许所有元素,包括null。 ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。 但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。 其他的方法运行时间为线性。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。 这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。 当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。 和LinkedList一样,ArrayList也是非同步的(unsynchronized)。 Vector类Vector非常类似ArrayList,但是Vector是同步的。 由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。 在考虑并发的情况下用Vector(保证线程的安全)。 在不考虑并发的情况下用ArrayList(不能保证线程的安全)Stack类Stack继承自Vector,实现一个后进先出的堆栈。 Stack提供5个额外的方法使得Vector得以被当作堆栈使用。 基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。 Stack刚创建后是空栈。 2,Set接口Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有几个不同的List。 实际上Set就是Collection,只是行为不同。 (这是继承与多态思想的典型应用表现不同的行为)。 其次,Set是一种不包含重复的元素的Collection,加入Set的元素必须定义equals()方法以确保对象的唯一性(即任意的两个元素e1和e2都有e1.equals(e2)=false),与List不同的是,Set接口不保证维护元素的次序。 最后,Set最多有一个null元素。 很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。 请注意必须小心操作可变对象(Mutable Object)。 如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。 HashSet类为快速查找设计的Set。 存入HashSet的对象必须定义hashCode()。 LinkedHashSet类具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。 于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。 TreeSet类保存次序的Set,底层为树结构。 使用它可以从Set中提取有序的序列。 Map接口请注意,Map没有继承Collection接口,Map提供key到value的映射。 一个Map中不能包含相同的key,每个key只能映射一个value。 Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。 Hashtable类Hashtable继承Map接口,实现一个key-value映射的哈希表。 任何非空(non-null)的对象都可作为key或者value。 添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。 Hashtable通过initial capacity和load factor两个参数调整性能。 通常缺省的load factor0.75较好地实现了时间和空间的均衡。 增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。 由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。 hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。 如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条要同时复写equals方法和hashCode方法,而不要只写其中一个。 Hashtable是同步的。 HashMap类HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。 ,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。 因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。 WeakHashMap类WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。 总结如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。 这就是针对抽象编程。 同步性Vector是同步的。 这个类中的一些方法保证了Vector中的对象是线程安全的。 而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。 因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。 数据增长从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。 当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。 所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。 使用模式在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O (1)表示。 但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。 为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。 这一切意味着什么呢?这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。 如果是其他操作,你最好选择其他的集合操作类。 比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O (1),但它在索引一个元素的使用缺比较慢O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。 LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。 最后,建议使用一个简单的数组(Array)来代替Vector或ArrayList。 尤其是对于执行效率要求高的程序更应如此。 因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。 相互区别Vector和和ArrayList1,vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。 如果不考虑到线程的安全因素,一般用ArrayList效率比较高。 2,如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而ArrayList增长率为目前数组长度的50%.如过在集合中使用数据量比较大的数据,用vector有一定的优势。 3,如果查找一个指定位置的数据,vector和ArrayList使用的时间是相同的,都是0 (1),这个时候使用vector和arraylist都可以。 而如果移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用linklist,因为它移动一个指定位置的数据所花费的时间为0 (1),而查询一个指定位置的数据时花费的时间为0(i)。 ArrayList和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!arraylist和和linkedlist1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。 这一点要看实际情况的。 若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。 但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList.因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。 HashMap与与TreeMap 1、HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 HashMap中元素的排列顺序是不固定的)。 2、HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 集合框架”提供两种常规的Map实现HashMap和TreeMap(TreeMap实现SortedMap接口)。 3、在Map中插入、删除和定位元素,HashMap是最好的选择。 但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。 使用HashMap要求添加的键类明确定义了hashCode()和equals()的实现。 这个TreeMap没有调优选项,因为该树总处于平衡状态。 结过研究,在原作者的基础上我还发现了一点,二树map一样,但顺序不一样,导致hashCode()不一样。 同样做测试在hashMap中,同样的值的map,顺序不同,equals时,false;而在treeMap中,同样的值的map,顺序不同,equals时,true,说明,treeMap在equals()时是了顺序了的。 hashtable与与hashmap一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的三.值只有HashMap可以让你将空值作为一个表的条目的key或value数据库的优化(数据库内部优化和sql优化)1.数据库内部优化调整服务器内存分配;数据库管理员可以根据数据库运行状况调整数据库系统全局区(SGA区)的数据缓冲区、日志缓冲区和共享池的大小;还可以调整程序全局区(PGA区)的大小2.sql优化尽量使用索引不要使用like(迷糊查询)要尽量避免在where子句中对字段进行NULL值判断;不要使用*(全局查询)3.硬件优化CPU参数的调整;硬件的好坏也起到关键作用Java线程概念与原理 一、操作系统中线程和进程的概念现在的操作系统是多任务操作系统。 多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。 比如在Windows系统中,一个运行的exe就是一个进程。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。 比如java.exe进程中可以运行很多线程。 线程总是属于某个进程,进程中的多个线程共享进程的内存。 SQL语句优化 1、应尽量避免在where子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。 2、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。 3、应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如select id from t where numis null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询select idfrom t where num= 04、尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如select idfrom twhere num=10or num=20可以这样查询select idfrom twhere num=10union allselect idfrom twhere num= 205、下面的查询也将导致全表扫描(不能前置百分号)select idfrom twhere namelike%c%若要提高效率,可以考虑全文检索。 6、in和not in也要慎用,否则会导致全表扫描,如select idfrom twhere numin(1,2,3)对于连续的数值,能用between就不要用in了select idfrom twhere numbetween1and 37、如果在where子句中使用参数,也会导致全表扫描。 因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。 然而,如果在编译时建立访问计划,变量的值还是的,因而无法作为索引选择的输入项。 如下面语句将进行全表扫描。 select idfrom twhere num=num可以改为强制查询使用索引select idfrom twith(index(索引名)where num=num 8、应尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。 如select idfrom twhere num/2=100应改为:select idfrom twhere num=100* 29、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。 如select idfrom twhere substring(name,1,3)=abcname以abc开头的id select idfrom twheredatediff(day,createdate,xx-11-30)=0xx-11-30生成的id应改为:select idfrom twhere nam
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧水利未来-智慧水利共创新章程
- 2019年高中工作队驻村扶贫工作总结
- 脂肪瘤手术前后的护理
- 跟骨骨折患者家庭护理指导
- 2026 塑型维持期鸡排课件
- 面部护理的光疗方法
- 重症医学科护理科研与论文写作
- 重症监护技术及其护理应用
- 胎盘早剥新生儿的护理要点
- 脑心共病管理临床实践指南建议总结2026
- 湖南 2026 政府采购评审专家续聘考试(3) 真题
- 2026年pcb维修主管测试题及答案
- 2025年芯片测试岗笔试题目及答案
- 2026年无人机植保技术考试题库及答案
- TSG 08-2026 特种设备使用管理规则
- 个人身份调查表
- 五笔二级简码表格模板及常用1500字编码
- JJF(纺织)083-2018织物沾水度仪校准规范
- GB/T 32381-2015全地形车辆轮胎
- 最全品质管理手法-第8章 其他方法简介课件
- 股骨头坏死的诊断与治疗及预防
评论
0/150
提交评论