String, CharSequence, StringBuffer & StringBuilder

String 实现了equals,所以new String("abc").equals(new String("abc"))是true, 但是StringBuffer没有实现equals方法,所以结果是false。 String实现了equals & hashcode, 但是StringBuffer没有,所以放入集合类的时候可能会出现问题。在后面要多次修改String的话, 那么建议用StringBuffer,以此避免创建多个objects,占用太多内存。

StringBuilder是非线程安全的,

StringBuffer是线程安全的,

start\final type int String Char
int X String.valueOf(i)/Integer.toString(i)/"" + i String.valueOf(_int).charAt(0)
String Integer.valueOf(_str).intValue()/Integer.parseInt(_str) X String.toCharArray()
Char Character.getNumericaValue(_char) ca.toString() X

*Integer.valueOf() return an Integer object, use intValue to cast Integer to int type

Java Collection

https://www.gitbook.com/book/zcm0705/allaboutjava/edit#/edit/master/data-structures.md?_k=ptjq2c

  • 介绍下ArrayList, LinkedList 和 Vector

(相同 -- 不同)

ArrayList and Vector 都实现了list接口,底层数据结构都是数组。不同的是,ArrayList不是线程同步的,Vector是线程同步的(线程安全的),即某一时刻只有一个线程可以写Vector,因此访问也会很慢。ArrayList可以随机访问,但是插入和删除元素会慢。不够空间的时候,要复制list到新的list去。

关于ArrayList和Vector区别如下:

  1. ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
  2. Vector提供indexOf(obj, start)接口,ArrayList没有。
  3. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

LinkedlList实现了Queue接口,底层数据结构是双向链表。不能随机访问,但是插入和删除数据快。

ArrayList和Vector在很多时候都很类似。

(1)两者都是基于索引的,内部由一个数组支持。

(2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。

(3)ArrayList和Vector的迭代器实现都是fail-fast的。

(4)ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。

以下是ArrayList和Vector的不同点。

(1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。

(2)ArrayList比Vector快,它因为有同步,不会过载。

(3)ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。

  • 介绍下HashMap 和 HashTable

HashMap: 线程不同步,可以接受null作为key or value,

HashTable:线程同步的,不可以接受null, Java 5提供了ConcurrentHashMap来代替HashTable

  • Comparable vs Comparator

参考链接:http://www.cnblogs.com/skywang12345/p/3324788.html

Comparable是排序接口,若类实现了这个接口,即可用Collections.sort() or Arrays.sort();此外,可以放入TreeSet 和 TreeMap 等有序框架中,不用另外制定比较器。

package java.util.*;
package java.lang;

public interface Comparable<T> {
    int compareTo(T o);
}

Comparator是比较器接口,只有两个函数;若要进行排序,但该类并没有实现Comparable接口,那么可以通过比较器来实现。

package java.util.*;

public interface Comparator<T> {
    int compare (T o1, T o2);
    boolean equals(Object obj);//可省略,因为所有类都是继承Object类,有自带的equals
}

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

  • HashCode() & equals()

equals(): 定义在Object当中,源代码“return (this == obj);"。如果不覆盖的话,就是相当于”==“。

hashCode(): 获取哈希表,即该对象在哈希表中的索引位置。

相互之间的关系:

1)、如果两个对象相等,那么它们的hashCode()值一定相同。
这里的相等是指,通过equals()比较两个对象时返回true。

2)、如果两个对象hashCode()相等,它们并不一定相等。
因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。补充说一句:“两个不同的键值对,哈希值相等”,这就是哈希冲突。

    此外,在这种情况下。若要判断两个对象是否相等,除了要覆盖equals\(\)之外,也要覆盖hashCode\(\)函数。否则,equals\(\)无效。
  • Set 中如何判断新元素是否重复?

用equals方法。根据增加对象的hash code来确定插入位置,如果位置是空的,那么就说明无重复元素。如果已经被占据了,那么就用equals来比较。如果equals相同,则有重复元素。如果不相同,则插入到其他位置。因此,可以看出来,如果hash code相等的话,equals也可能不相等。

  • 五个常用的类,包和接口

常用的类:String, Integer, File, Scanner, PrintStream

常用的包:java.lang, java.io, java.util

常用的接口:List, Map, Set, Comparable

  • heap vs steak 栈和堆

内存分两种,栈内存和堆内存。

栈内存:进入一个方法的时候,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。

堆内存:一般用于存放不放在当前方法栈中的那些数据,例如,使用 new 创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用 final修饰后,放在堆中,而不是栈中。

  • 抽象关键字不可以和哪些关键字共存?
1
)
private
不能:抽象方法就是给子类覆盖的,私有了就不能覆盖了。
      (
2
)
static
不能:
static
可以直接用类名调用,而调用抽象方法没有意义。
      (
3
)
final
 不能:
final
修饰的方法不可以被复写,修饰的类不可以被继承。与
abstract
冲突。

String, CharSequence, StringBuffer & StringBuilder

String 实现了equals,所以new String("abc").equals(new String("abc"))是true, 但是StringBuffer没有实现equals方法,所以结果是false。 String实现了equals & hashcode, 但是StringBuffer没有,所以放入集合类的时候可能会出现问题。在后面要多次修改String的话, 那么建议用StringBuffer,以此避免创建多个objects,占用太多内存。

StringBuilder是非线程安全的,

StringBuffer是线程安全的,

start\final type int String Char
int X String.valueOf(i)/Integer.toString(i)/"" + i String.valueOf(_int).charAt(0)
String Integer.valueOf(_str).intValue()/Integer.parseInt(_str) X String.toCharArray()
Char Character.getNumericaValue(_char) ca.toString() X

*Integer.valueOf() return an Integer object, use intValue to cast Integer to int type

results matching ""

    No results matching ""