package hashcode;

public class LearnString {

	public static void main(String[] args) {
//1.先在栈中创建一个对String类的对象引用变量str
//2.然后查找堆中常量池(内存中以表存在)里有没有存放"abc"
//3.如果没有,则将"abc"存放进常量池,并令str指向”abc”
//4.如果已经有"abc"则直接令str指向“abc”。
String str1 = "abcdefg";//在编译期时就确定了
//1. 首先在堆(不是常量池)中创建一个包含指定内容的字符串对象,并将字符串引用指向该对象。
//2. 去字符串常量池中查看,是否有包含该内容的对象。
//3. 若有,则将new出来的字符串对象与字符串常量池中内容相同的对象联系起来。
//4. 若没有,则在字符串常量池中再创建一个包含该内容的字符串对象,并将堆中的对象与字符串常量池中新创建出来的对象联系起来。
//5.栈中的str2总是指向的是堆中的String对象
String str2 = new String("abcdefg");
// 1.== 比较的是地址
System.out.println(str1 == str2);// false
// 2.String重写了Object的equals().
System.out.println(str1.equals(str2));// true
// 3.java规定,equals()相等,hashcode必须相同,所以String也重写了Object的hashcode(),不然可能有bug.
System.out.println(str1.hashCode()==str2.hashCode());//true
str2=str2.intern();
//String intern()为每个字符序列生成唯一的String引用
System.out.println(str1==str2);//true
String str3="abc"+"defg";
System.out.println("str3:"+(str1==str3));//true 只是因为在编译期,自动优化为abcdefg } }
//在Object中equals(),hashcode().使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用
public boolean equals(Object obj) {
return (this == obj);
} public native int hashCode();

  

//String中重写的equals(),hashcode
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value; for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

  

最新文章

  1. Linux下安装nginx
  2. HoloLens外包团队:HoloLens有一个严重缺陷,但微软并不想改
  3. phpcms 搜索结果页面栏目不显示解决 方法
  4. 在Salesforce中对某一个Object添加 Validation Rule
  5. php防盗链,php ci在control里面控制除了自己站内的链接点击跳转,其他来源的都跳到站内页面
  6. careercup-中等难度 17.9
  7. 浅谈iOS中的视图优化
  8. POJ2186 Popular Cows 【强连通分量】+【Kosaraju】+【Tarjan】+【Garbow】
  9. 2.Java 加解密技术系列之 MD5
  10. Servlet--ServletRequest接口,ServletResponse接口
  11. day-3 python多线程编程知识点汇总
  12. Android进阶(十六)子线程调用Toast报Can&#39;t create handler inside thread that has not called Looper.prepare() 错误
  13. 10个Python基础练习项目,你可能不会想到练手教程还这么有趣
  14. c# 枚举安卓系统中所有目录及文件名
  15. pycharm同步代码到coding
  16. Vue-发布订阅机制(bus)实现非父子组件的传值
  17. LOJ2537 PKUWC2018 Minimax 树形DP、线段树合并
  18. DataGuard----&gt;备库参数db_file_name_convert和log_file_name_convert的作用
  19. centos7安装部署mysql5.7服务器
  20. ASP.NET Core开源地址

热门文章

  1. java实现qq邮箱每天定时发送邮件
  2. #添加屏蔽IP LINUX
  3. 使用sqlmap注入DVWA的SQL Injection菜单
  4. DIV+CSS 网页布局之:三列布局
  5. wampserver修改默认根目录
  6. 粘滞位(sticky bit)
  7. js 小数格式化函数
  8. PHP、JSP、.NET各自的真正优势是什么
  9. SDWebImage 清除缓存
  10. Linux发行版