Java基础整理(二)

1,对象的强、软、弱和虚引用

  • 强引用:被引用时,处于可达状态,不能被回收
  • 软引用:当内存不足时,即使有引用也会被回收
  • 弱引用:当系统的垃圾回收机制运行时,就会被回收
  • 虚引用:不能通过虚引用来获取被引用的对象,主要作用是跟踪对象被回收的状态,它不能单独使用必须和引用队列一起联合使用

    String str = new String(“Java”);
    ReferenceQueue rq = new ReferenceQueue();
    PhantomReference pr = new PhantomRerence(str, rq);
    pr.get();//虚引用不能来获取被引用的对象,输出为null
    rq.poll()==pr;//返回true,取出引用队列中最先进入队列的引用与pr比较
    强、软、弱都能通过一个get()方法获取所引用的对象

2,Java为工具类的命名习惯是添加一个字母s,比如:

  • 操作数组的工具类:Arrays
  • 操作集合的工具类:Collections

3,属于object的常见方法

  • equals(),finalize(),getClass(),toString(),clone(),hashCode(),wait(),notify(),notifyAll()

4,使用String、StringBuffer和StringBuilder的情况

  • 单纯地想创建一个字符串就用String
  • 如果在一个多线程下进行多次增删字符串,就用线程安全的StringBuffer
  • 如果是在单线程下进行多次字符串的增删,就可以用StringBuilder非线程安全速度快

5,Math类提供算术运算的工具类

6,Java7的ThreadLocalRandom和Random,都是专门用于产生一个伪随机数的类,不过ThreadLocalRandom更加强大,是线程安全的

  • 只要两个Random对象的种子相同,而且方法的调用顺序也相同,就会产生相同的数字序列。所以,只会一个伪随机数;
  • 解决办法就是种子传入当前时间,Random r = new Random(System.currentTimeMillis());
  • 如果在多线程环境下,ThreadLocalRandom rand = ThreadLoaclRandom.current();

7,Java的double类型会发生精度丢失,尤其是在运算时。所以BigDecimal类就是一个防止这情况的。

  • 注意传入数值时要用字符串形式,如:BigDecimal bd = new BigDecimal(“0.500”);

8,日期、时间类,Data和Calendar类,不过Data的设计上存在些缺陷,所以尽量多用Calendar类

Calendar c = Calendar.getInstance();
c.set(2017, 2, 3, 10, 11, 12);//年 月 日,时 分 秒
c.getTime();//2017-3-4 10:11:12
c.add(YEAR, -1);//2016-3-4 10:11:12
注意:用add方法上一级有影响,而roll不能影响。
c.add(MONTH, 10);//2017-1-4 10:11:12
c.roll(MONTH, 10);//2016-1-4 10:11:12

9,Java8新增的日期时间包

Clock:该类用于获取指定事情的当前日期、时间

Duration:代表持续时间

Instant:代表一个具体的时刻,可以精确到纳秒

LocalDate:代表不带时区的日期,如:2017-01-11

LocalTime:代表不带时区的时间,如:10:33:45

LocalDtaeTime:代表不带时区的日期、时间,例如2004-11-11T10:10:10

MonthDay:该类仅代表月日,如:--01-10

Year:仅代表年,如:2017

YearMonth:仅代表年月,如:2017-10

ZonedDateTime:代表一个时区化的日期、时间

ZoneId:代表一个时区

DayOfWeek:星期枚举类,定义了周日到周六的枚举类

Month:月的枚举类,定义了一月到十二月的枚举类

10,正则表达式(Pattern),一个字符串处理工具类,能对字符串进行查找、提取、分割、替换等操作

Pattern.matches("a*b","aaaaaaaab");//返回true

提取目标字符串,通过Matcher类的find和group方法,可以做网络爬虫
Matcher m = Pattern.compile("((13\\d)|(15\\d)\\d{8})").matcher(str);//str目标字符串,匹配13,15开头的字符串
while(m.find()){
    System.out.println(m.group());
}

11,Set、List、Queue、Map四种集合

最常用的实现类是HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap、TreeMap

12,接口Collection定义的方法

boolean add(Object o),向集合添加一个元素,成功就返回true

boolean addAll(Collection c),把集合c里的所以元素添加到指定集合里面,成功就返回true

void clear(),清除集合里的元素,长度将变为0

boolean contains(Object o),返回集合是否包含指定元素

boolean containsAll(Collection c),返回集合是否包含集合c的所有元素

boolean isEmpty(),返回集合是否为空

Iterator iterator(),返回一个Iterator对象用于遍历集合

boolean remove(Object o),删除集合中指定的元素o,如果集合有多个o元素只删除第一个,返回true

boolean removeAll(Collection c),从某集合删除集合c包含的所有元素,删除了一个或多个成功就返回true

boolean retainAll(Collection c),取与集合c的交集,如果改变了调用方法的集合,则返回true

int size(),返回集合元素个数

Object[] toArray(),把集合转换成数组

13,HashSet类特点:

不保证元素的顺序

不是同步的,不安全的

集合元素可以为空

HashSet集合判断两个元素相等的标准是两个对象通过equals()比较相等,并且hashCode()返回值也相等

所以,要把某个类的对象保存到HashSet中,需重写equals()和hashCode(),让equals()返回true,hashCode()返回值也相等

猜想:打印集合对象时,打印的格式是:类名+@+hashCode

14,LinkedHashSet类是HashSet的子类,有序,使用了链表来维护次序。

15,TreeSet是SortedSet接口的实现类,在将元素加进去时就已经排好序了。

16,向TreeSet集合中添加一个对象时,就让该类实现Comparable接口,且实现compareTo(Object obj)方法

如:  class A implements Comparable{
    int mCount;
    public A(int count){
        this.mCount = count;
    }
    public int compareTo(Object obj){
        A a = (A)obj;
        //前一个数大于尾一个数时,返回1
        //前一个数小于尾一个数时,返回-1
        //前一个数等于尾一个数时,返回0
        return mCount>a.mCount ? 1 : mCount<a.mCount ? -1 : 0;
    }
}

17,TreeSet集合添加一个可变元素,如果删除被改变过的元素,则删除失败;如果是没改变的且不重复的元素,则删除成功。

18,为了程序更加健壮,更已维护,尽量不要将实例变量或对象放入HashSet和TreeSet中。

19,EunmSet类是一个专门为枚举类设计的集合类,内部以位向量的形式存储,不允许加入null元素,没有构造器

20,ArrayList是线程不安全的,Vector是线程安全的,不过不推荐使用。Collections工具类,可以将ArrayList变成线程安全的。

21,队列:先进先出,想一根水管;栈:先进后出,像一个杯子

22,Deque是Queue的一个接口,是一个“双端队列”,双端队列可以同时添加删除元素,Java为其提供了ArrayDeque和LinkedList两个实现类

23,ArrayDeque用来作为栈,和当做队列来使用。LinkedList也可以当栈、队列还有双端队列(既可以当作队列,也可以当作栈)来使用,内部是用一个链表来保存元素。

24,使用集合的建议

如果要遍历list集合,对于ArrayList、Vector,应该使用随机访问方法(get)来遍历;而LinkedList集合,则使用迭代器遍历

如果常要插入、删除操作改变大量数据的list集合的大小优先考虑LinkedList。因为ArrayList、Vector可能都需要经常分配内部数组的大小,所以效果不好

如果有多线程访问list集合时,可以考虑使用Collections将集合包装成线程安全的集合

25,Map集合,通过键值存数据put(key, value)来添加元素,key不允许重复,就是通过equlas()比较返回false才行

常用的方法:
void clear();删除map集合的key-value对

boolean containsKey(Object key);集合是否包含该指定key,是返回true

boolean containsValue(Object value);是否包含一个或多个value,是返回true

Set entrySet();返回包含key-value对所组成的Set集合,每个元素都是Map.Entry对象

Object get(Object key);返回指定key对应的value;如果不包含该key,则返回null

boolean isEmpty();查询集合是否为空

Set keySet();返回该map中所有key组成的Set集合

Object put(Object key, Object value);添加一个新键值对。如果存在相同的key,则覆盖value

void putAll(Map m);将指定的map的key-value复制到另一个map中

Object remove(Objcet key);删除指定key的元素

boolean remove(Object key, Object value);删除指定键值的元素。成功就返回true,否则返回false

26,可以查询集合是否存在某个key或者value

27,Java8改进的Hashtable和HashMap典型区别

Hashtable是线程安全的Map实现;但是HashMap是线程不安全的

Hashtable不允许使用null作为key和value;HashMap可以使用为null作为key和value,只能存放一个为null的key

尽量是这样用,Collections工具类把HashMap变线程安全

为了成功地在HashMap、Hashtable中存储、获取对象,key对象必须实现hashCode() equals()方法与HashSet类似的是,如果使用可变对象作为HashMap、Hashtable的key,并且修改了key,也会可能出现与HashSet相似情形,程序无法准确访问到被修改过的key

28,LinkedHashMap使用双向链表维护次序,性能略低于HashMap。因为是链表来维护顺序,所以在迭代访问Map里全部元素是性能较好

29,Properties类是Hashtable的子类,使用来读写属性文件。把map对象和属性文件关联起来,以键值形式写入文件

30,SortedMap接口的实现类TreeMap,它有两种排序结构

自然排序:key必须实现Comparable接口,而且类型要一样,否则就会抛出ClassCastExcption异常
定制排序:传入Comparator对象,key对象的类必须实现equals()返回true,compareTo()返回0

31,WeakHashMap的key保存对象的弱引用,不要用强引用,否则就会失去使用意义。

如:  WeakHashMap whm = new WeakHashMap();

//new一个key对象都属于弱引用,会被垃圾回收机制回收
whm.put(new String("电脑"), new String("戴尔"));

//key字符串直接量,系统自动保存成强引用了,不会被垃圾回收机制回收
whm.put("电脑", new String("戴尔"));

32,IdentityHashMap通过 “==” 比较key相同时,则认为这两个对象相同

33,修改、查询:HashMap 方便回收:WeakHashMap
排序:TreeMap 访问:LinkedHashMap,双向链表

LinkedHashMap逼HashMap慢一些,因为要维护顺序

34,hash表里有个“负载极限”,介乎在0-1的数值。默认的“负载极限”为0.75,即当该hash表只要存储3/4就算满了,达到该值时hash表会自动成倍增加容量

35,操作集合的工具类Collections,对list集合进行操作

reverse:反转
shuffle:随机排序
sort:排序,按升序进行排序
swap:交换位置
rotate:移动元素
binarySearch:对有序的list集合元素进行二分搜索法搜索指定的对象在集合中的索引。
frequency:指定集合中指定元素出现的次数

36,Collections控制同步,synchronizedXxx()方法解决多线程并发访问集合时的线程安全问题

Collection c = Collections.synchronizedCollecton(new ArrayList());
List c = Collections.synchronizedList(new ArrayList());
Set c = Collections.synchronizedSet(new HashSet());
Map c = Collections.synchronizedMap(new HashMap());

37,Collections设置不可变类(只能访问,不能修改)

emptyXxx():返回一个空的,不可变的集合对象
singletonXxx():返回一个只包含一个对象的不可变集合
unmodifiableXxx():返回指定集合对象的不可变视图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值