JAVA基础部分(一)

String、StringBuffer和StringBuilder的区别是什么?String为什么是不可变的?

  1. String是字符串常量,StringBuffer和StringBuilder是字符串变量;
  2. StringBuffer是线程安全的,因为它的方法都加了sychronized,而StringBuilder是非线程安全的;
  3. String不可变是因为在JDK中String类被声明为final类;
  4. 线程安全会带来额外的系统开销,因此StringBuilder比StringBuffer效率高。

Vector、ArrayList和LinkedList的区别是什么

  1. Vector和ArrayList都是类似数组的形式存储在内存中,LinkedList则是以链表的形式存储;
  2. Vector线程同步,ArrayList和LinkedList是线程不同步的;
  3. LinkedList适合做插入、删除操作,不适合查找;
  4. Vector和ArrayList适合查找,不适合插入删除操作。

HashMap和HashSet

  1. HashMap实现了Map接口,Map接口对键值进行映射,Map中不允许存在重复的键。HashMap允许键和值都为null
  2. HashSet实现了Set接口,它不允许集合中有重复的值。添加元素时,当元素重复时立即返回false,如果不重复成功添加的话返回true。

HashMap和HashTable

  1. HashMap是非线程安全的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
  2. HashTable是线程安全的,由于线程安全会带来额外的系统开销,因此效率没有HashMap高

Object类中方法

  1. toString():返回该对象的字符串的表示;
  2. equals():比较两个对象是否相同(默认比较对象的地址);
  3. clone():创建并返回此对象的一个副本;
  4. hashcode():返回该对象的hash值;
  5. getclass():返回该对象的运行时类;

java的内存机制

  Java 把内存划分成两种:一种是栈内存,另一种是堆内存。

  在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

  堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

  这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值