- 浏览: 958381 次
- 性别:
- 来自: 魔都
文章分类
- 全部博客 (745)
- MultiThread (19)
- My Plan (118)
- JavaBasic (61)
- MyInterview (104)
- InternetTechnique (5)
- ProjectConclusion (1)
- Maven (5)
- MogoDb (5)
- Hadoop (11)
- Memcached (6)
- TechniqueCollect (1)
- Ibaits (1)
- Android (34)
- ItLife (40)
- Tree (2)
- ProjectArchitect (7)
- Open Source (3)
- liunx (5)
- socket (8)
- Spring (27)
- DesginPattern (35)
- WebBasic (13)
- English (13)
- structs (1)
- structs2 (2)
- Oracle (17)
- Hibernate (2)
- JavaScript (4)
- Jdbc (1)
- Jvm (15)
- Ibatis (1)
- DataStructures (13)
- Https/Socket/Tcp/Ip (3)
- Linux (4)
- Webservice (7)
- Io (2)
- Svn (1)
- Css (1)
- Ajax (1)
- ExtJs (1)
- UML (2)
- DataBase (6)
- BankTechnique (3)
- SpringMvc (3)
- Nio (3)
- Load Balancing/Cluster (3)
- Tools (1)
- javaPerformanceOptimization (8)
- Lucene(SEO) (1)
- My Think (80)
- NodeJs (1)
- Quartz (1)
- Distributed-java (1)
- MySql (7)
- Project (4)
- junit (4)
- framework (1)
- enCache (1)
- git (2)
- SCJP (1)
- sd (1)
最新评论
-
lkjxshi:
你都这水平了还考这个证干嘛
SCJP 认证考试指南 -
钟逸华:
问的真多
百度java开发面试题(转) -
zuimeitulip:
觉得我就是这样的,从小阅读量就很少,导致现在的读的速度非常慢, ...
让读书成为一种习惯 -
DDT_123456:
我觉得你是不符合要求。问你hashmap的那个问题,你那样回答 ...
阿里面试2(转) -
jingjing0907:
刚刚写了很多读过此博客的感受,竟然没有发上去,以为我注册账号还 ...
让读书成为一种习惯
1.冒泡排序
2.arraylist存放的是对象的引用,不是对象本身,在java里面除了8中基本类型(int ,double ,long ,short,char,byte,boolean,float)
3.你做相似的工作又多种选择的时候,可以考虑用抽象工厂
这个抽象工厂运用他的场景:
1。你有两台单色打印机,一台黑白墨的,一台彩墨的。
2。你有两种文件要打,一种讲演搞,一种图片
3.ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,
调用arraylist默认构造函数时,实际上会在底层生成一个长度为10的Object类型的数组.
4.如果增加的元素个数超过10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组中,并且后续增加的内容都
hi放到新数组中,当新数组无法容纳增加的元素时,重复该过程.
5.arraylist底层采用数组实现,linkedList底层采用双向链表实现,当执行插入或者删除时,linkedlist好
执行收索时arraylist好(下标)
6.集合添加时用hascode(字符相等),equals判断。(重写hascode跟equals方法)
HashSet 首先判断hascode是否相同不同则加进去,否则判断equals方法是否返回true,若为false则不加进去。
7.HashSet(按散列放到什么位置不是按顺序)底层是用HashMap实现的,当使用add方法将对象添加到set当中时,实际上是将该对象作为底层所维护的Map
对象的key,而value则都是同一个对象Object对象(该对象用不上)。
8.hashmap(数组+链表)底层维护一个数组(hash碰撞),我一对们向HashMap中所放置的对象实际上是储存在该数组当中.
9.当向HashMap中put一对键值时,他会根据key的hashcode值计算出一个位置,该位置就是此对象准备往数组存放的位置。
如果该位置没有对象存在,直接把该对象放进数组当中,如果该位置已经有对象存在了,
则顺着次存在的对象的链表开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一个对象),
如果此链上有对象的话,再去使用equlas方法进行比较,
如果对此链表上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组当中的该位置以前存在的那个对象链表到此对象的后面。
hashmap get
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<k> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
hashmap put
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<k> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
10.java中底层只有数组,链表,数组管理多个对象。</k></k>
Hashset跟Treeset的区别
1.HashSet 是哈希表实现的,无序的结合,表现为检索(contains)的时间复杂度是 o(0)
TreeSet 是红黑树实现的,排序的集合
先看看源码:
public class TreeSet
extends AbstractSet
implements SortedSet, Cloneable, java.io.Serializable
public class HashSet
extends AbstractSet
implements Set, Cloneable, java.io.Serializable
其中SortedSet中组合了一个:Comparator super E&gt; comparator();
2.TreeSet与HashSet最大区别在于排序
3.Treeset中的数据是自动排好序的,不允许放入null值
2.HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束
3.HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,
hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例
今天有人问这个,发现自己只是大概理解而且只会用了。该忘的竟然忘得差不多了,翻翻书复习下。
对于处理一列数据项,Java提供了两个类ArrayList和LinkedList。
ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更像数组、
但LinkedList的内部实现是基于一组连接的记录,所以,它更像一个链表结构,所以,它们在性能上有很大的差别。
在ArrayList的前面或中间插入数据时,必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;
而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
如果在编程中,两种情形交替出现,这时,可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。
ArrayList的查询效率比较高,增删动作的效率比较差,适用于查询比较频繁,增删动作较少的元素管理的集合。LinkedList的查询效率低,但是增删效率很高。适用于增删动作的比较频繁,查询次数较少的元素管理集合。
ArrayList,LinkedList都是线程不安全的。
StringBuilder、StringBuffer和String三者的联系和区别
1. String 类
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。
String a = "a"; //假设a指向地址0x0001
a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。
因此String的操作都是改变赋值地址而不是改变值操作。
2. StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
3.StringBuffer
StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。
4.线程安全
StringBuffer 线程安全
StringBuilder 线程不安全
5.速度
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
6.总结
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
2.arraylist存放的是对象的引用,不是对象本身,在java里面除了8中基本类型(int ,double ,long ,short,char,byte,boolean,float)
3.你做相似的工作又多种选择的时候,可以考虑用抽象工厂
这个抽象工厂运用他的场景:
1。你有两台单色打印机,一台黑白墨的,一台彩墨的。
2。你有两种文件要打,一种讲演搞,一种图片
3.ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,
调用arraylist默认构造函数时,实际上会在底层生成一个长度为10的Object类型的数组.
4.如果增加的元素个数超过10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组中,并且后续增加的内容都
hi放到新数组中,当新数组无法容纳增加的元素时,重复该过程.
5.arraylist底层采用数组实现,linkedList底层采用双向链表实现,当执行插入或者删除时,linkedlist好
执行收索时arraylist好(下标)
6.集合添加时用hascode(字符相等),equals判断。(重写hascode跟equals方法)
HashSet 首先判断hascode是否相同不同则加进去,否则判断equals方法是否返回true,若为false则不加进去。
7.HashSet(按散列放到什么位置不是按顺序)底层是用HashMap实现的,当使用add方法将对象添加到set当中时,实际上是将该对象作为底层所维护的Map
对象的key,而value则都是同一个对象Object对象(该对象用不上)。
8.hashmap(数组+链表)底层维护一个数组(hash碰撞),我一对们向HashMap中所放置的对象实际上是储存在该数组当中.
9.当向HashMap中put一对键值时,他会根据key的hashcode值计算出一个位置,该位置就是此对象准备往数组存放的位置。
如果该位置没有对象存在,直接把该对象放进数组当中,如果该位置已经有对象存在了,
则顺着次存在的对象的链表开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一个对象),
如果此链上有对象的话,再去使用equlas方法进行比较,
如果对此链表上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组当中的该位置以前存在的那个对象链表到此对象的后面。
hashmap get
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<k> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
hashmap put
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<k> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash &amp;&amp; ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
10.java中底层只有数组,链表,数组管理多个对象。</k></k>
Hashset跟Treeset的区别
1.HashSet 是哈希表实现的,无序的结合,表现为检索(contains)的时间复杂度是 o(0)
TreeSet 是红黑树实现的,排序的集合
先看看源码:
public class TreeSet
extends AbstractSet
implements SortedSet, Cloneable, java.io.Serializable
public class HashSet
extends AbstractSet
implements Set, Cloneable, java.io.Serializable
其中SortedSet中组合了一个:Comparator super E&gt; comparator();
2.TreeSet与HashSet最大区别在于排序
3.Treeset中的数据是自动排好序的,不允许放入null值
2.HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束
3.HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,
hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例
今天有人问这个,发现自己只是大概理解而且只会用了。该忘的竟然忘得差不多了,翻翻书复习下。
对于处理一列数据项,Java提供了两个类ArrayList和LinkedList。
ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更像数组、
但LinkedList的内部实现是基于一组连接的记录,所以,它更像一个链表结构,所以,它们在性能上有很大的差别。
在ArrayList的前面或中间插入数据时,必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;
而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
如果在编程中,两种情形交替出现,这时,可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。
ArrayList的查询效率比较高,增删动作的效率比较差,适用于查询比较频繁,增删动作较少的元素管理的集合。LinkedList的查询效率低,但是增删效率很高。适用于增删动作的比较频繁,查询次数较少的元素管理集合。
ArrayList,LinkedList都是线程不安全的。
StringBuilder、StringBuffer和String三者的联系和区别
1. String 类
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。
String a = "a"; //假设a指向地址0x0001
a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。
因此String的操作都是改变赋值地址而不是改变值操作。
2. StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。 每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。
StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。
3.StringBuffer
StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。对于经常要改变值的字符串应该使用StringBuffer和StringBuilder类。
4.线程安全
StringBuffer 线程安全
StringBuilder 线程不安全
5.速度
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
6.总结
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
发表评论
-
java的8种排序
2013-03-19 22:51 956url:http://www.iteye.com/topic ... -
排序算法分析之冒泡排序
2012-05-25 11:27 1536冒泡排序(Bubble Sort)是一种简单的排序算法。它重复 ... -
想对集合说的一些话
2012-04-24 00:11 1009Java的集合很有用,自己看过很多了,但是总是感觉很模糊,用起 ... -
数据结构(c语言)
2012-04-19 21:29 11391. 经典算法 单链表:遍 ... -
java中数据结构二分查法
2012-04-20 00:19 1323数据结构和算法是一个程序的灵魂,优化程序的主要手段。在查询里, ... -
插入排序
2012-04-21 21:16 959插入排序无非就是在原来已经排好序的基础上再一个个添加元素,每次 ... -
java经典算法40题
2012-04-14 12:16 1701排序算法:http://www.cnblogs.com/mor ... -
数据结构与算法基础
2012-03-29 09:31 12201.arraylist(底层数组实现) ... -
2012/3/27----归并排序
2012-03-27 13:58 1005通过使用分治算法的思想来对数组进行排序(这里叫做归并排序),分 ... -
算法学习一之常见的七大排序算法
2012-03-19 09:40 1489算法之排序 十三个经典 ... -
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
2012-03-18 18:06 1457先推荐一篇关于排序算法的文章:http://www.cppbl ... -
快速排序算法原理与实现/交换排序
2012-03-19 09:45 1515快速排序的大致思想为取到中间位置的元素,其他元素和其一一比较, ...
相关推荐
### ArrayList #### 简介 `ArrayList` 是 Java 中的一种动态数组实现方式,它允许在运行时调整其大小。`ArrayList` 实现了 `List` 接口,并且内部通过一个数组来存储数据。当添加元素导致数组空间不足时,`...
本文主要探讨了几个关键的集合接口和实现类的底层源码,包括List、HashMap、HashSet等,以及它们的基本操作。 首先,Collection接口是所有单值集合的父接口,提供了增加、删除、遍历元素的基本方法。例如,`add()`...
掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用
HashSet 是 Set 的一种实现,它使用哈希表(实际上是一个 HashMap)来存储数据,这意味着元素的存取速度较快,但迭代顺序无法保证。哈希表通过计算对象的哈希值来确定元素在表中的位置,以实现快速查找。哈希冲突时...
java jdk1.8 源码 Java-source-reading 缓慢更新一些个人学习java相关源码过程中的笔记,在这里你将不可避免地看到以下情况: 个别不懂/没想好的地方留空待补全 ...ArrayList LinkedList HashMap HashSet LinkedHashMap
2. **迭代顺序**:由于HashMap的特性,HashSet中的元素遍历顺序并不固定,这与ArrayList或LinkedList等线性数据结构不同。如果需要按特定顺序遍历元素,应考虑使用LinkedHashSet。 3. **构造方法**: - 无参构造器...
Collections 源码 java Java Java的ArrayList、LinkedList、HashMap、TreeMap、LinkedHashMap、HashSet、TreeSet相关源码分析,及相关问题和应用总结。
1. **集合框架理解**:深入理解Java集合框架,包括List接口、Set接口和Map接口,以及它们的实现类如ArrayList、LinkedList、HashSet、HashMap等。 2. **ArrayList与LinkedList的区别**:对比分析ArrayList和...
// 常用的list接口的实现类有ArrayList和LinkedList // 学习map对象容器的使用 // map对象容器里面储存的元素是(key,value)形式的键值对,比如(a,1)(b,20)(c,55) // key不可以重复,value可以重复 // 常用的map接口...
在Java集合框架的学习中,除了List接口的实现,还应了解Set接口(如HashSet和TreeSet)和Map接口(如HashMap和TreeMap)等其他容器,以及它们的数据结构和操作特性。同时,关注集合框架的并发支持,如...
3. **集合框架**:ArrayList、LinkedList、HashMap、HashSet等数据结构的使用,理解它们的特点和操作。 4. **异常处理**:异常的分类、抛出和捕获机制,以及如何有效地使用try-catch-finally结构。 5. **多线程**...
java所有集合类底层源码解析汇总,包括ArrayList、HashMap、HashSet、LinkedList、TreeMap、HashSet、ConcurrentHashMap等集合框架的底层实现源码大白话解读。
类集框架是Java标准库的一部分,提供了用于存储和操作对象的数据结构,如ArrayList、LinkedList、HashSet、HashMap等。这些数据结构在实际编程中广泛应用,理解和熟练使用它们是提升编程效率的关键。 在Java中,类...
Java集合框架提供了多种数据结构和算法来存储和操作数据,包括LinkedList、ArrayList、HashMap、TreeMap、HashSet、TreeSet、ArrayBlockingQueue、PriorityQueue等。每种数据结构都有其特点和使用场景,需要根据实际...
ArrayList和LinkedList虽然不是Set,但它们的父接口List属于Collection,而Collection接口有一个子接口Set,例如HashSet是Set接口的一个实现,它内部基于HashMap实现,保证元素唯一性。 7. WeakHashMap WeakHashMap...
这个框架包括了ArrayList、LinkedList、HashSet、HashMap等常见的数据结构,以及它们各自的操作方法和特性。本压缩包提供的"java实例源码集合"是一个宝贵的学习资源,适合初级和中级程序员用来深入理解和掌握Java...
本文将深入探讨如何遍历Java中的各种集合,包括ArrayList、LinkedList、HashSet等,并分享一些实用技巧和注意事项。 首先,让我们从最常用的ArrayList开始。ArrayList是基于动态数组实现的集合,支持按索引访问元素...