Java中字符串处理和核心数据结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Aruis26/article/details/89058917

一、字符串处理
String对象一旦生成,则不能再对他进行改变。作用在于:当一个对象需要被多线程共享,并且频繁访问时,可以省略同步和锁等待的时间,提高效率。正因为这个不可变性,在需要对字符串进行修改操作时,String对象总是会生成新的对象,所以性能相对较差。此时需要使用StringBuffer和StringBuilder。

这两种实现方式基本相同。
StringBuilder stringBulider = new StringBuilder()
stringBuilder.append("new").append("word");

这种方式始终时对同一个对象进行追加操作,没有产生新的字符串对象,相对效率较高
StringBuffer中的方法都是同步方法,属于线程安全的操作,效率较低但安全性高。StringBuilder中的方法都是异步方法,属于非线程安全的操作,效率较高但安全性低.
在使用时,只有在需要频繁修改的时候需要考虑使用StringBuilder和StringBuffer,其他情况使用String

二、核心数据结构
常用的数据结构的实现有List、Map、Set,它们都继承自Collection接口。
List
List的实现有ArrayList、LinkedList、Vector,其中ArrayList和Vector使用了数组实现,对其的操作等价于对内部对象数据的操作。LinkedList使用了循环双向链表数据结构。
ArrayList和LinkedList区别:
由于ArrayList时基于数组实现,数组是一块连续的内存空间,在数组的任意位置插入元素会导致该位置后面的元素重新排列,效率相对较低。每次插入都会进行一次数据复制,插入元素的位置越靠前,数组重组的开销就越大。删除元素时也一样。ArrayList元素无序保存。
LinkedList的链表结构使得在任意位置插入元素效率都一样,并不会因为插入位置靠前而降低效率。删除元素时,首先通过循环找到要删除的元素,若删除的位置位于前半段,则从前往后找;若位于后半段则从后往前找。LinkedList中元素保存的顺序与插入顺序相同。
List的遍历
遍历方式有:foreach、迭代器、for循环(效率低,不推荐)

	foreach:
	for (String s:list) {
	//s为遍历到的元素
	}
	迭代器:
	for (Iterator<String> it =list.iterator();it.hasNext();){
		//it.next()为遍历到的元素
	}

编译器将foreach循环做迭代器处理,所以它和迭代器时等价的,推荐使用迭代器。ArrayList的随机访问速度较快;LinkedList的随机访问性能较差,若按一定顺序访问,可以考虑使用。

Map
Map接口的实现类有HashMap、HashTable、LinkedHashMap、TreeMap.
HashMap和HashTable的对比
HashTable的大部分方法做了同步,而HashMap没有,因此HashMap是线程不安全的。HashTable不允许key或者value为null,而HashMap可以。
HashMap底层数据结构是数组,内存地址即数组的下标索引。注意,对于同一个key,多次存放数据,最后一次存放的值会覆盖之前的值。
LinkedHashMap
LinkedHashMap是有序的HashMap,HashMap的缺点是无序性,被存入到HashMap中的元素,在遍历时,输出时无序的。如果希望元素保存输入时的顺序,需要使用LinkedHashMap替换。
LinkedHashMap继承自HashMap,在HashMap的基础上,LinkedHashMap增加了一个链表,可以存放元素的顺序。

public LinkedHashMap (int initialCapacity,float loadFactor,boolean accessOrder)

其中,accessOrder若为true,按照元素最后访问的顺序排序;若为false,按照插入顺序排序。默认为false。
TreeMap
TreeMap时基于元素固有的顺序排序的,内部实现时基于红黑树。排序时一个必须进行的过程,若要正常使用TreeMap,一定要将排序规则传递给TreeMap.

Set
常用的有HashSet、LinkedHashSet、TreeSet。Set时对对应的Map的封装,集合中元素不能重复。
HashSet的输出没有规律,LinkedHashSet的输出顺序和输入顺序完全相同,TreeSet则将所有输出从小到大排序。

猜你喜欢

转载自blog.csdn.net/Aruis26/article/details/89058917