1.二分法查找——建立在数组排序之上

案例程序:

class BinarySearch{public static void binarySearch(int[] arr,int des) {Arrays.sort(arr);/**对数组排序*/int begin=0;int end=arr.length;while (begin<=end){int mid=(begin+end)/2;if (des == arr[mid]){System.out.println("目标元素下标:"+mid);return;}else if (arr[mid]>des){  //目标数des在arr[mid]左边end=mid-1;}else     //目标数des在arr[mid]右边begin=mid+1;}System.out.println("本数组不含有目标数元素");return;}
}

2.String类

2.1.对String在内存存储方面的理解:
  • 1.字符串一旦创建不可变。

  • 2.双引号括起来的字符串存储在字符串常量池中。(且相同字符串,地址固定)

  • 3.字符串的比较必须使用equals方法。(不建议用“==”双等号)

  • 4.String已经重写了toString()和equals()方法。

面试题1:为何String一旦创建,不可改变?

我看过源代码,String类中有byte[]数组,byte[]数组由final修饰。数组一旦创建,长度不可改变。并且被final修饰的引用一旦指向某个对象之后,不能再指向其他对象,所以String是不可变的。

面试题1.5:StringBuffer/StringBuilder为什么是可变的?

我看过源代码,StringBuffer/StringBuilder内部实际上是一个byte[]数组,这个数组没有被final修饰,StringBuffer/StringBuilder的初始化容量我记得应该是16,当存满之后会进行扩容,底层调用了数组copy方法System.arraycopy()……是这样进行扩容的。所以StringBuffer/StringBuilder适合进行字符串的频繁拼接。

面试题2:以下程序创建了几个对象?

String s5=new String(“abc”);
String s6=new String(“abc”);
3个对象,方法区字符串常量池有1个“abc”,堆内存中有2个String对象。

2.2.String的构造方法
  • String s = “abc”;
  • String s = new String(“abc”);
  • String s = new String(byte数组);//数组中数字对应的字母传入字符串s中。
  • String s = new String(byte数组, 起始下标, 长度);
  • String s = new String(char数组);
  • String s = new String(char数组, 起始下标, 长度);

2.3.String类常用的21个方法

2.3.1.compareTo不仅能比较大小,还能知道谁大谁小,返回值为0,说明相等.

例如:abce与aBd比较时比到第二个就分出胜负了,后边就不再比较了

  •   System.out.print("compareTo不仅能比较大小,还能知道谁大谁小——");int result="abcd".compareTo("Ab");System.out.println(result);
    
2.3.2…contains()判断前边的字符串是否包含括号内的字符串
  •    System.out.print("字符串1.contains(字符串2)判断字符串1是否包含字符串2——");System.out.println("abcdef".contains("cde"));
    
2.3.3.字符串1.startsWith(字符串2)判断字符串是否以…开头
  •   System.out.print("字符串1.startsWith(字符串2)判断字符串1是否以字符串2开头——");System.out.println("abcd".startsWith("a"));
    
2.3.4.判断字符串是否以…结尾
  •   System.out.print("字符串1.endsWith(字符串2)判断字符串1是否以字符串2结尾——");System.out.println("abcd".endsWith("cd"));
    
2.3.5.判断两个字符串是否相等,而且忽略大小写
  •    System.out.print("字符串1.equalsIgnoreCase(字符串2)判断两个字符串是否相等,而且忽略大小写——");System.out.println("ABc".equalsIgnoreCase("abc"));
    
2.3.6.判断字符串是否为空
  •   System.out.print("字符串..isEmpty()判断字符串是否为空——");System.out.println("".isEmpty());System.out.println("1".isEmpty());
    
2.3.7.替换字符串中的某部分
  •   System.out.print("字符串1.replace(字符串2,字符串3)字符串3替换掉字符串1中的字符串2部分——");String newstring="123456abc".replace("123456","opqwer");System.out.println("替换后的字符串:"+newstring);
    
2.3.8.以”-“号,把字符串拆分成数组
  •   System.out.print("xxx-xx-xx-x.split(减号)以”-“号,把字符串拆分成数组——");String[] split="2020-09-01-20:20".split("-");for (int i=0;i< split.length;i++)System.out.print(split[i]+",");System.out.println();
    

2.4.StringBuffer/StringBuilder——可变长度字符串

  • 2.4.1.StringBuffer/StringBuilder初始化容量16 byte[]数组.
  • 2.4.2.StringBuffer/StringBuilder是完成字符串拼接操作的,方法名:append
  • 2.4.3.StringBuffer是线程安全的,因为它的所有方法都由synchronized(协调\同步)修饰,StringBuilder是非线程安全的。
  • 2.4.4.频繁进行字符串拼接不建议使用“+”,因为会占用大量字符串常量池的内存。
  • StringBuffer.append()不会占用大量的字符串常量池内存。
案例程序输出:123123China中国
  •   System.out.print("StringBuffer初始化数组、.append()拼接数组——");StringBuffer sb=new StringBuffer(100);System.out.println("StringBuffer输出:");sb.append(123);sb.append("123");sb.append("China");sb.append("中国");System.out.println(sb);/**输出:123123China中国*/
    

面试题:如何优化StringBuffer性能?

在创建StringBuffer时,尽量给定一个初始化容量,尽可能减少底层数组的扩容次数。

为何字符串判断是否相同,建议用".equal()",不建议用“==”?

eg.s1、s2中都是存的“方法区”中相同的字符串常量池的“地址”。
s3、s4,存的是堆内存中不同对象的地址。
s1 == s2?——>true;
s1 == s3?——>false;
s1 == s4?——>false;
s3 == s4?——>false;
s1.equal(s3)?—>true;
s1.equal(s4)?—>true;
s3.equal(s4)?—>true;

  1.  String s1="abc";
    
  2.  String s2="abc";
    
  3.  String s3=new String("abc");
    
  4.  String s4=new String("abc");
    
3.常量池的作用——Cache缓存机制——提升效率

java中-128~127的所有数字,都放在常量池中,不再new。

JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。

//装箱时,x、y存的都是整数常量池中的地址
Integer x=127;
Integer y=127;
x == y ?——>true

x.equals(y)?——>true(更换为引用数据类型的比较方法)

//超出-128~127范围,a、b分别在不同位置new出了对象,存储的地址不再相同。
Integer a=128;
Integer b=128;
a == b ?——>false

a.equals(b)?——>true(更换为引用数据类型的比较方法)

4.包装

4.1.包装有什么用?

方便编程。
eg.下边这个方法要代入Object型数据,不能传入8种基本数据类型,此刻就需要包装。
public void doSome(Object obj){
java语句;
……
}

4.2、8种包装类的类名:

Byte、Short、Integer、Long、Float、Double、Boolean、Character

引用数据类型:
  •   1.类Class【String类、Object类(所有类的父类)】
    
  •   2.接口interface
    
  •   3.数组
    
5.所有数字的父类Number
6.照葫芦画瓢:学习Integer,其它的模仿Integer。

 0. /**静态方法实现数据类型转换***Integer——>int**/System.out.print("静态方法parse实现数据类型转换:");int retValue=Integer.parseInt("123");System.out.println(retValue);1.   /***String——>int**/int m=Integer.parseInt("123");System.out.println("String——>int:"+m);2. /***int——>String**/String s2=m+"";System.out.println("int——>String:"+s2);3. /***String——>Integer**/Integer k=Integer.valueOf("123");System.out.println("String——>Integer:"+k);4./***Integer——>String**/String s=String.valueOf(k);System.out.println("Integer——>String:"+s);5./***int——>Integer**//***自动装箱*/Integer x=100;System.out.println("int——>Integer:"+x);6./***Integer——>int**//**自动拆箱*/int y=x;System.out.println("Integer——>int:"+y);
7.什么是装箱?什么是拆箱?

装箱:基本数据类型——>引用数据类型
eg.Integer x = 100;
拆箱:引用数据类型——>基本数据类型
int y = x;

注意:拆箱时,字符串必须全为数字!否则出现:NumberFormatException(数字格式化异常)错误。

eg.Integer i = new Integer(“1b34”);//NumberFormatException(数字格式化异常)

JavaDay16-P104-P142—二分法查找—String类—常量池—包装—装箱、拆箱—NumberFormatException相关推荐

  1. java基础(八) 深入解析常量池与装拆箱机制

    ###引言 本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体 ...

  2. 深入解析常量池与装拆箱机制

    2019独角兽企业重金招聘Python工程师标准>>> 常量池 常量 可分为 字面常量(也称为直接常量)和 符号常量. 字面常量: 是指在程序中无需预先定义就可使用的数字.字符.bo ...

  3. 百无聊赖之JavaEE从入门到放弃(十一)string类 常量池原理 内部类

    目录 一.String类和常量池 1.String基础知识 2.常量池 二.内部类 1.概念 2.内部类的作用 3.注意 4.非静态内部类 5.静态内部类 6.匿名内部类 7.局部内部类 一.Stri ...

  4. 第十六节 装箱拆箱 类和结构

    View Code 案例1:装箱拆箱class Program{/// <summary>/// 装箱,拆箱/// </summary>/// <param name=& ...

  5. String和常量池

    jdk1.6之前常量池属于永久代,jdk1.7以后移到堆中. String s1 = "abc";// 放在常量池中String s2 = "abc";// 从 ...

  6. String 字符串常量池

    java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String实现了Seria ...

  7. java内置功能的使用,装箱拆箱及枚举类

    常用类(javaSE版本中内置的一系列功能) 字符串家族 了解字符串的原理和使用字符串类进行字符串的解析 字符串需要解析? web协议,http协议在网络上跑的是字符串,可以接受通过字符串获取的数据 ...

  8. java分装_Java ——Number Math 类 装箱 拆箱 代码块

    本节重点思维导图 当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等 int a = 5000;float b = 13.65f;byte c = 0x4 ...

  9. JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了

    JVM常量池最全详解-常量池/运行时常量池/字符串常量池/基本类型常量池,看这一篇就够了! 常量池详解 1. 字面量和符号引用 1.1 字面量 1.2 符号引用 2. 常量池vs运行时常量池 3. 常 ...

最新文章

  1. eclipse调用JNI之环境的搭建
  2. Excel表格快速将公式运用到一整列
  3. C++ 画星号图形——空心矩形(核心代码记录)
  4. linux共享内存的定义,共享内存是什么意思 Linux系统如何共享内存
  5. html必有标记,前段必备Html标签H5有标记-.docx
  6. 放假了,暂告一段落,迎接研究生
  7. ReactJS入门之前端开发的演变
  8. d3.js 教程 模仿echarts折线图
  9. 网络服务器有保存文件,将收到的图片保存到网络服务器上的文件夹
  10. electron增加导航按钮_Electron发布6.0 Released版本
  11. 设计psd分层素材模板|家居海报设计思路!
  12. azure备份存储层分类_备份到Azure –为什么要这样做?
  13. 汇编语言实现简单的计算器
  14. JAVA柱形图动态显示,动态控制柱形图显示柱数
  15. mne.io.read_raw_edf()
  16. 蔡司数码视疲劳测试软件_[专题]重度近视别担心!!蔡司数码型镜片真实测评,带给我不一样的体验...
  17. 清除90天苹果充值记录_王者荣耀安卓苹果跨系统角色转移服务,限量测试收费99元...
  18. 512G MLC颗粒 固态U盘 DIY
  19. C++学习笔记-第4单元-对象和类(基础)
  20. MATLAB小技巧(25)竞争神经网络与SOM神经网络

热门文章

  1. python如何查询数据库_通过Python查询数据库信息
  2. smalltalk五个特性
  3. vmware虚拟机上网设置教程(vmware虚拟机设置网络)
  4. access里的多步oledb错误_(ADO) 的 ConnectionString 属性 - SQL Server | Microsoft Docs
  5. Spring JMS 整合Weblogic JMS(weblogicMQ)
  6. 四种编程命名规则:驼峰命名法,帕斯卡命名法,匈牙利命名法,下划线命名法
  7. 解决ERROR: distribution port 25672 in use by another node: rabbit@
  8. chrome浏览器自动填充时背景色改变(-webkit-autofill)
  9. ubuntu16.4离线安装显卡驱动
  10. 高等数学求导积分公式