`
wuhoujian322
  • 浏览: 63020 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java基础知识回顾第二篇 - String,StringBuffer和StringBuilder|Java内存模型简介|HashMap和Hashtable

阅读更多

1、String,StringBuffer和StringBuilder

String:字符串常量,不可变;

StringBuffer:字符串变量,可改变的对象,线程安全,多线程处理大量数据选择;

StringBuilder:字符串变量,可改变的对象,速度快,单线程情况下处理大量数据选择;

 

补充:字符串String类型全方位考察

考察一:

String a = "a1";   

String b = "a" + 1;   

System.out.println(a == b);

输出结果:true

总结:当两个字符串字面值连接时(相加),得到的新字符串依然是字符串字面值,保存在常量池中。

 

考察二:

String a = "ab";   

String bb = "b";   

String b = "a" + bb;   

System.out.println(a == b);

输出结果:false

总结:当字符串字面值与String类型变量连接时,得到的新字符串不再保存在常量池中,而是在堆中新建一个String对象来存放。

 

考察三:

String a = "ab";   

final String bb = "b";   

String b = "a" + bb;   

System.out.println(a == b);  

输出结果:true

总结:道理同考察一,这里的变量bb是String类型常量。

 

考察四:

String a = "ab";   

final String bb = getBB();   

String b = "a" + bb;   

System.out.println(a == b);

 

private static String getBB() {   

return "b";   

}  

输出结果:false

总结:这里的bb变量虽然定义成了final,但是并不会保存到常量池,因为getBB()方法相当于new String("b")。

 

考察五:

private static String a = "ab";   

public static void main(String[] args) {   

    String s1 = "a";   

    String s2 = "b";   

    String s = s1 + s2;   

    System.out.println(s == a);   

    System.out.println(s.intern() == a);   

}  

输出结果:false true

总结:主要考察了String的intern()方法,当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

 

考察六:

private static String a = new String("ab");   

public static void main(String[] args) {   

String s1 = "a";   

String s2 = "b";   

String s = s1 + s2;   

System.out.println(s == a);   

System.out.println(s.intern() == a);   

System.out.println(s.intern() == a.intern());   

输出结果:false false true

 

2、Java内存模型简介

    Java内存模型用来定义程序中各个变量的访问规则(在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节)。包括两部分内容:主内存和工作内存。

    所有的变量都存储在主内存中,每条线程还有自己的工作内存。线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。如果要把一个变量从主内存复制到工作内存,就需要按顺序执行readload操作,如果把变量从工作内存同步回主内存中,就要按顺序执行storewrite操作。

 

内存间交互操作:

lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。

unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。

read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用

load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。

use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。

assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。

store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。

write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

 

3、HashMap和Hashtable的区别

    它们都是通过key-value的方法来存储数据的,不同之处主要有以下三点:

    1、HashMap是java本身Map(java.util.Map)接口的一个实现,而Hashtable是基于旧的Dictionary类的;

    2、HashMap是非线程安全的,而Hashtable线程安全;

    3、HashMap可以允许空值作为key或value,但是只允许一个空的key,value可以多个为空;Hashtable不允许空值作为键或值;

 

另外:HashMap去掉了Hashtable的contains方法,使用containsKey和containsValue方法;性能方面的话,由于它们采用的hash/rehash算法基本上一样,所以性能上不会有太大差异。

 

HashMap原理总结:

    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。 HashMap在每个LinkedList节点中储存键值对对象。

    当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的LinkedList中。键对象的equals()方法用来找到键值对。

    默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。

0
1
分享到:
评论

相关推荐

    Java面试题.docx

    3、String、StringBuffer、StringBuilder区别 4、什么是内部类?内部类的作用 5、进程和线程的区别 6、final,finally,finalize的区别 7、Serializable 和Parcelable 的区别 8、静态属性和静态方法是否可以被...

    JavaSE 笔试 精华

    笔试必备的 java 知识 1. java.util.*包的UML结构图。 Collection List LinkedList ArrayList Vector Stack Set HashSet Map HashMap Dictionary Hashtable Comparetor 2. Vector和ArrayList、LinkedList区别? ...

    java面试常见问题

    在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 ...

    Java面试中,最常被人问到的几个问题

    1. java.util.*包的UML结构图。 2. Vector和ArrayList、LinkedList区别? Hashtable 和 HashMap之间的区别 3. String、StringBuffer,StringBuilder之间区别。

    涵盖了90%以上的面试题

    String,StringBuffer,StringBuilder有什么区别 java中的数组是不是对象 数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 ...

    JAVA面试资料大全-整理.zip

    9、 String、StringBuffer、StringBuilder 的区别 10、 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 .............................................. ...............................................

    java7hashmap源码-WeishenTemp:WeishenTemp

    就会开始工作,影响性能,可以考虑使用可变字符序列StringBuilder)就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector 与 Array 的区别、...

    史上最全的Java面试题集锦.pdf

    java知识点 Hashmap 源码级掌握,扩容,红⿊树,最⼩树化容量,hash冲突解决,有些⾯试官会提出发⾃灵魂的审问,⽐如为什么是红⿊树, 别的树不可以吗;为什么8的时候树化,4不可以吗,等等 concureentHashMap,段锁...

    java面试宝典

    24、String, StringBuffer StringBuilder 的区别。 10 25、Overload 和Override 的区别。Overloaded 的方法是否可以改变返回值的类型? 10 27、描述一下JVM 加载class 文件的原理机制? 10 28、char 型变量中能不能...

    java8源码-java-start::seedling::seedling::seedling:学习Java语法过程中的一些案例

    (String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别、HashMap的底层...

    疯狂JAVA讲义

    9.3.2 String、StringBuffer和StringBuilder类 322 9.3.3 Math类 327 9.3.4 Random类 328 9.3.5 BigDecimal类 330 9.4 处理日期的类 333 9.4.1 Date类 333 9.4.2 Calendar类 334 9.4.3 TimeZone类 337 9.5 ...

    java8源码-putaoo.github.io:putao.github.io

    (String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别、HashMap的底层...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】java中String、StringBuffer、StringBuilder的区别 21 【基础】运行时异常和非运行时异常 参见 21 运行时异常 21 非运行时异常 22 【基础】java引用类型 23 强引用(StrongReference) 23 软引用...

    Java面试宝典2020修订版V1.0.1.doc

    二、Java基础部分 13 1、java中有哪些基本类型? 13 2、java为什么能够跨平台运行? 13 3、String是基本数据类型吗?我可不可以写个类继承于String? 14 4、谈谈&和&&的区别? 14 5、Switch语句里面的条件可不可以是...

    安卓java读取网页源码-interview:安卓面试

    String、StringBuffer、StringBuilder 之间的区别? 对反射的了解? 对注解的了解? 对依赖注入的了解? 对泛型的了解? 泛型中 extends 和 super 的区别? 对 Java 的异常体系的了解? 对解析与分派的了解?

    java8集合源码分析-Outline:大纲

    string,stringbuffer和stringbuilder(,,,, ) 伪泛型(, , ) 自动装箱(,) Try-with-resources() 序列化 反序列化(, , , ) interface 和 abstract class 区别 变长参数( ) 枚举详解(, , , , ) Null详解() Java 8 默认...

    JAVA面试常考

    文章目录1.HashMap 和 Hashtable的区别2.StringBuilder 和 StringBuffer的区别3.java垃圾回收机制(GC)5.Java的特性–继承/多态/封装5.1 封装5.2 继承5.3 多态6.super 和 this7. 抽象类和接口的区别 1.HashMap 和 ...

    javajdk源码学习-JavaSourceLearn:JDK源码学习

    java jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...

    安卓java读取网页源码-questions:自问自答

    String、StringBuilder 和 StringBuffer 有什么区别 == 和 equals 和 hashCode 有什么区别 说说你对 final 修饰符的理解 说说你对泛型的理解 泛型中 extends 和 super 的区别 描述下 Java 中的异常处理机制 什么是 ...

    千方百计笔试题大全

    24、String, StringBuffer StringBuilder 的区别。 10 25、Overload 和Override 的区别。Overloaded 的方法是否可以改变返回值的类型? 10 27、描述一下JVM 加载class 文件的原理机制? 10 28、char 型变量中能不能...

Global site tag (gtag.js) - Google Analytics