JAVA基础随记:java的堆和栈、集合类、java5之后提供的高并发线程安全集合

1.java的堆和栈

    java的内存分为栈内存和堆内存,其中栈内存一般存放的是java的基本数据类型变量(int,char,short,long,byte,boolean,float,double,包括特殊的String s="abc")和对象的引用变量
    堆内存存放的是对象类型变量,如通过new出来的变量String s = new String("abc"),对象类型变量创建后一直不用则会被GC自动回收,每new一次都会创建一个新的对象
    栈内存则是指向,如果值已经存在,不会创建新变量,而是把变量名指向已经存在的值,String a="1",String b="1",其中栈会分配一块内存给a并存放1,但是到b的时候,栈发现1已经存在了,则不另会分配一块内存放1,而是把b的引用指向a的1,这时a和b的引用都指向1
    但如果String a= new String("1"),String b=new String("1"),此时堆会分别给a,b分配一块内存创建2个对象,相对于栈更耗内存且速度更慢,因此在栈里的a==b是true,堆里的a==b是false,但堆里的a.equals(b)是true,因为equals比的是对象值,==是比较的对象地址
    String是一个定义好后不能再改变的类型,而StringBuffer的值是可改变的,原因是String a="1";定义好了后为变量的值已经分配好内存,如果这时候再给a改变值:a="2",此时栈内存发现2不存在则另开分一块内存给2,而a的引用改为指向2,同时1就变成了没有引用的废值,说白了就是a改变值后新生成了一个对象,原来的被弃用,而StringBuffer a=new StringBuffer("1");是在堆里创建的,由于StringBuffer是支持内容可变的,所以a.append("2");后还是在原来的对象上追加值2并没有重新创建对象,所以如果字符串内容需要经常变动的话最好是使用StringBuffer,对java内存的开销要比String小得多,不用造成内存浪费和溢出

2.集合类

    ArrayList:object类型、有序、允许重复
    HashHet:object类型、无序、不允许重复
    TreeSet:object类型、有序(二叉树排序)、不允许重复
    HashMap:key-value类型、无序、key不允许重复、value可重复,线程不安全
    TreeMap:key-value类型、有序(二叉树排序),实现了SortMap接口,默认key的升序,自定义排序则可重写Comparator接口、key不允许重复、value可重复,线程不安全
    LinkedHashMap:key-value类型、有序,是以链表结构存储数据,按存储插入顺序排序,是HashMap的子类

3.线程

    java 5后加了很多的并发容器,是在java.util.concurrent包下,包括:ConcurrentHashMap、CopyOnWriteArrayList、ArrayBlockingQueue(阻塞队列)等
    ArrayBlockingQueue和PriorityQueue的区别:ArrayBlockingQueue是支持高并发线程安全的阻塞队列,等待和唤醒是需要手工写,由ArrayBlockingQueue自动完成,而PriorityQueue则是线程不安全非阻塞队列,等待和唤醒要手工能过wait和notify完成
    ConcurrentHashMap和HashMap、HashTable的区别:HashMap是线程不安全的key-value集合,且key不重复,value能重复,允许一个null的key,允许多个null的value,HashMap的存储是没有顺序且线程不安全,因此多线程并发则可能导致数据错误,但效率上会比较高
    HashTable是线程安全的key-value集合,不允许有null的key和value存在,也不允许重复,HashTable是继承自Dictionay类,HashTable是有无序的,但是HashTable是锁住整个hash表,因此多线程下效率比较慢
    ConcurrentHashMap是java5提供的多线程高并发的线程安全集合,这个集合是实现的锁分离原理实现,集合是由多个segment(段)组成,每一个segment都是一个HashTable,锁的是segment而不是整个集合,锁的粒度更细,多线程写时不会相互被锁等待,因此发技高并发同时写,而读是完全不会被锁,HashTable读也会被锁

转载于:https://my.oschina.net/lwhmdj0823/blog/422845

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值