目录
API:
接口概念:
API:String、StringBuilder 的学习
String、StringBuffer、StringBuilder
String:
留神:面试考点
StringBuffer
StringBuilder
代码例子:
StringBuilder 和 String 互相转化:
非凡办法拓展:
ArrayList
汇合概述:
总结
API:
接口概念:
API(Application Programming Interface), 应用程序编程接口,Java API 是一本程序员的字典。是 JDK 中提供给咱们应用的类的阐明文档。
API 是 jdk 提供的各种性能的 java 类。
这些类将底层的代码实现封装了起来,咱们呢不须要这些类是如何实现的,只须要学习这些类如何应用即可。所以咱们可通过查问 API 的形式,来学习 Java 提供的类,并得悉如果应用它们。
API 的应用步骤:
关上帮忙文档(jdk 帮忙文档_汉化版)
点击显示,找到索引,看到输入框
你要找谁?再输入框里输出,而后回车。
看包。java.lang 下的类不须要导包,其余须要。
看类的解释阐明。
学习构造方法。
应用成员办法。
所谓的 API 就是好多类好多办法,jdk 提供了一些现成的类,能够间接俄拿过去应用,这些类是现成提供给咱们,间接拿来应用的类,他们都叫做 API。
API 文档:通知咱们到底只有哪些类是现成的,到底有哪些办法具备各自怎么的性能,这个样的一份阐明说就叫做 API 文档。
提醒:string 关键字都是小写的,String 是一个类,这个是 jdk 的作者写的。
API:String、StringBuilder 的学习
String、StringBuffer、StringBuilder
首先,三者的区别:
String 字符串常量
StringBuffer 字符串变量(线程平安)
StringBuilder 字符串变量(非线程平安)
简要的说,String 类型和 StringBuffer 类型的次要性能区别其实在于 String 是不可变的对象, 因而在每次对 String 类型进行扭转的时候其实都等同于生成了一个新的 String 对象,而后将指针指向新的 String 对象,所以常常扭转内容的字符串最好不要用 String,因为每次生成对象都会对系统性能产生影响,特地当内存中无援用对象多了当前,JVM 的 GC 就会开始工作,那速度是肯定会相当慢的。
而如果是应用 StringBuffer 类则后果就不一样了,每次后果都会对 StringBuffer 对象自身进行操作,而不是生成新的对象,再扭转对象援用。所以在个别状况下咱们举荐应用 StringBuffer,特地是字符串对象常常扭转的状况下。而在某些特地状况下,String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特地是以下的字符串对象生成中,String 效率是远要比 StringBuffer 快的:
String S1 =“This is only a”+“simple”+“test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“simple”).append(“test”);
你会很诧异的发现,生成 String S1 对象的速度几乎太快了,而这个时候 StringBuffer 竟然速度上基本一点都不占优势。其实这是 JVM 的一个花样,在 JVM 眼里,这个
String S1 =“This is only a”+“simple”+“test”; 其实就是:
String S1 =“This is only a simple test”; 所以当然不须要太多的工夫了。但大家这里要留神的是,如果你的字符串是来自另外的
String 对象的话,速度就没那么快了,譬如:
String S2 =“This is only a”;
String S3 =“simple”;
String S4 =“test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的依照原来的形式去做
在大部分状况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer 线程平安的可变字符序列。一个相似于 String 的字符串缓冲区,但不能批改。尽管在任意工夫点上它都蕴含某种特定的字符序列,但通过某些办法调用能够扭转该序列的长度和内容。
可将字符串缓冲区平安地用于多个线程。能够在必要时对这些办法进行同步,因而任意特定实例上的所有操作就如同是以串行程序产生的,该程序与所波及的每个线程进行的办法调用程序统一。
StringBuffer 上的次要操作是 append 和 insert 办法,可重载这些办法,以承受任意类型的数据。每个办法都能无效地将给定的数据转换成字符串,而后将该字符串的字符追加或插入到字符串缓冲区中。append 办法始终将这些字符增加到缓冲区的末端;而 insert 办法则在指定的点增加字符。
例如,如果 z 援用一个以后内容是“start”的字符串缓冲区对象,则此办法调用 z.append(“le”) 会使字符串缓冲区蕴含“startle”,而 z.insert(4, “le”) 将更改字符串缓冲区,使之蕴含“starlet”。
在大部分状况下 StringBuilder > StringBuffer
java.lang.StringBuilder
java.lang.StringBuilder 一个可变的字符序列是 5.0 新增的。此类提供一个与 StringBuffer 兼容的 API,但不保障同步。该类被设计用作 StringBuffer 的一个繁难替换,用在字符串缓冲区被单个线程应用的时候(这种状况很广泛)。如果可能,倡议优先采纳该类,因为在大多数实现中,它比 StringBuffer 要快。两者的办法基本相同。
其次,独自介绍:
String:
概念:
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例
也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。
非凡点:
字符串不可变,它们的值在创立后不能被更改。
尽管 String 的值是不可变的,然而它们能够被共享,字符串成果上相当于字符数组(char[] ),然而底层原理是字节数组(byte[] )。
特点:
1、通过 new 创立的字符串对象,每一次 new 都会申请一个内存空间,尽管内容雷同,但地址值不同。
2、以“”形式给出的字符串,只有字符序列雷同(程序和大小),无论在程序代码中呈现几次,JVM 都只会创立一个 String 对象,并在字符串池中进行保护。
留神:面试考点
如何了解 String 类的值不可变但能够共享?
string 说的不可变是其值不可变,比方 String str = “abc”,不可变值得是 abc 不可变,当咱们 str =“abcde”时,abc 没有被销毁,依然寄存在常量池中,只不过是让 str 指向了“abcde”的内存地址。所以就算不停的赋值,扭转的也只是 str 援用的地址问题,左边的值是不扭转的。
所以会产生冗余问题,占据大量内存空间,且无用。
而共享,共享是指你在申明一个具体内容的数据类型 String 时,如果你定义一个 string name= “tttt “,它将本人生成一个字符串池,其余的字符串类型,如果内容雷同,将间接拜访字符串池,而不会再生成新的内存。它将应用串池里原来的那个内存,而不会从新分配内存,也就是说,string saname= “tttt “, 将会指向同一块内存,变量名不同毫无关系。
String 的罕用办法:
1、indexOf(“字符”):查问指定的字符串是否存在,返回的是字符串的地位,不存在返回 -1;
2、substring(int begIndex,int endIndex):截取字符串;
3、CharAt(值):拿到指定地位的字符;
4、length():返回字符串的长度;
5、equals():比拟两个字符串是否相等;
6、toLowerCase():将字符串转换为小写字母;
7、toUpperCase():将字符串转换为大写字母;
8、equalsIgnoreCase(String):疏忽大小写比拟两个值是否相等;
9、spilt():将此字符串拆分为给定的 regular expression 的匹配。
10、replace():返回从替换所有呈现的导致一个字符串 oldChar,在这个字符串 newChar。
11、compareTo():按字典程序比拟两个字符串。
12、startsWith():判断以后字符串的前缀是否和指定的字符串统一。
StringBuffer
Java.lang.StringBuffer 线程平安的可变字符序列。一个相似于 String 的字符串缓冲区,但不能批改。尽管在任意工夫点上它都蕴含某种特定的字符序列,但通过某些办法调用能够扭转该序列的长度和内容。
可将字符串缓冲区平安地用于多个线程。能够在必要时对这些办法进行同步,因而任意特定实例上的所有操作就如同是以串行程序产生的,该程序与所波及的每个线程进行的办法调用程序统一。
StringBuffer 上的次要操作是 append 和 insert 办法,可重载这些办法,以承受任意类型的数据。每个办法都能无效地将给定的数据转换成字符串,而后将该字符串的字符追加或插入到字符串缓冲区中。append 办法始终将这些字符增加到缓冲区的末端;而 insert 办法则在指定的点增加字符。
例如,如果 z 援用一个以后内容是“start”的字符串缓冲区对象,则此办法调用 z.append(“le”) 会使字符串缓冲区蕴含“startle”,而 z.insert(4, “le”) 将更改字符串缓冲区,使之蕴含“starlet”。
StringBuilder
概念:
StringBuilder 是一个可变的字符串类,咱们能够把它看成是一个容器。
这里的可变指的是 StringBuilder 对象中的内容是可变的。
String 和 StringBuilder 的区别:
String:内容是不可变的
StringBuilder:内容是可变的
构造方法:
增加和反转办法:
代码例子:
增加:
反转:
StringBuilder 和 String 互相转化:
- StringBuilder 转换为 String
public String toString():通过 toString() 就能够实现把 StringBuilder 转换为 String
- String 转换为 StringBuilder
public StringBuilder(String s):通过构造方法就能够实现把 String 转换为 StringBuilder
非凡办法拓展:
line=line.toLowerCase();// 字符串中的字母都转为小写
toUpperCase():将字符串转换为大写字母;
line.equalsIgnoreCase(code)// 漠视大小写比拟。
CharAt(值):拿到指定地位的字符;
equals():比拟两个字符串是否相等;
查找字符串(indexOf),截取字符串(substring(int begIndex,int endIndex))
例子:
String str = "Java 语言是面向对象的,Java 语言是强壮的,Java 语言是平安的,Java 是高性能的,Java 语言是跨平台的";
String tar = "Java";
int count = 0;
// 定义索引变量,示意每次找到子串呈现的索引
int index = -1;
// 定义循环,判断条件为在字符串中找到了指标子串
while ((index = str.indexOf(tar)) != -1) { // 将找到的索引赋值给变量并判断
// 次数累加
count++;
// 把查找过的局部剪切掉,从找到的索引 + 子串长度的地位开始截取。str = str.substring(index + tar.length());
}
return count;
String.intern() 办法能够使得所有含雷同内容的字符串都共享同一个内存对象,能够节俭内存空间。
spilt 办法:public String[] split(String regex);// 依据给定正则表达式的匹配拆分此字符串。
该办法的作用就像是应用给定的表达式和限度参数 0 来调用两参数 split 办法。因而,所得数组中不包含结尾空字符串。
例如,字符串“boo:and:foo”应用这些表达式可生成以下后果:
Regex 后果
{“boo”,“and”,“foo”}
o {“b”,“”,“:and:f”}
Arrays.sort(变量):冒泡排序的办法。
toCharArray():蕴含所有字符均转换成相应的字符数组。
ArrayList
汇合概述:
概念:提供一种存储空间可变的存储模型,存储的数据容量能够产生扭转。
特点:底层是数组实现的,长度能够变动。
ArrayList<E>:可调整大小的数组实现,<E>: 是一种非凡的数据类型,泛型。
怎么用呢?
在呈现 E 的中央咱们应用援用数据类型替换即可。
举例:ArrayList<String>,ArrayList<Student>
构造方法:
代码例子:
增加:
反转:
StringBuilder 和 String 互相转化:
- StringBuilder 转换为 String
public String toString():通过 toString() 就能够实现把 StringBuilder 转换为 String
- String 转换为 StringBuilder
public StringBuilder(String s):通过构造方法就能够实现把 String 转换为 StringBuilder
非凡办法拓展:
line=line.toLowerCase();// 字符串中的字母都转为小写
toUpperCase():将字符串转换为大写字母;
line.equalsIgnoreCase(code)// 漠视大小写比拟。
CharAt(值):拿到指定地位的字符;
equals():比拟两个字符串是否相等;
查找字符串(indexOf),截取字符串(substring(int begIndex,int endIndex))
例子:
String str = "Java 语言是面向对象的,Java 语言是强壮的,Java 语言是平安的,Java 是高性能的,Java 语言是跨平台的";
String tar = "Java";
int count = 0;
// 定义索引变量,示意每次找到子串呈现的索引
int index = -1;
// 定义循环,判断条件为在字符串中找到了指标子串
while ((index = str.indexOf(tar)) != -1) { // 将找到的索引赋值给变量并判断
// 次数累加
count++;
// 把查找过的局部剪切掉,从找到的索引 + 子串长度的地位开始截取。str = str.substring(index + tar.length());
}
return count;
String.intern() 办法能够使得所有含雷同内容的字符串都共享同一个内存对象,能够节俭内存空间。
spilt 办法:public String[] split(String regex);// 依据给定正则表达式的匹配拆分此字符串。
该办法的作用就像是应用给定的表达式和限度参数 0 来调用两参数 split 办法。因而,所得数组中不包含结尾空字符串。
例如,字符串“boo:and:foo”应用这些表达式可生成以下后果:
Regex 后果
{“boo”,“and”,“foo”}
o {“b”,“”,“:and:f”}
Arrays.sort(变量):冒泡排序的办法。
toCharArray():蕴含所有字符均转换成相应的字符数组。
ArrayList
汇合概述:
概念:提供一种存储空间可变的存储模型,存储的数据容量能够产生扭转。
特点:底层是数组实现的,长度能够变动。
ArrayList<E>:可调整大小的数组实现,<E>: 是一种非凡的数据类型,泛型。
怎么用呢?
在呈现 E 的中央咱们应用援用数据类型替换即可。
举例:ArrayList<String>,ArrayList<Student>
构造方法:
代码例子:
增加办法:
代码例子:
public boolean remove(Object o), 删除指定元素的办法利用
如果我要删除我在汇合中增加的一种水果,请看以下:
Scanner sc=new Scanner(System.in);
System.out.println("请输入您要删除的水果编号");
String str=sc.nextLine();
for (int i = 0; i < list.size(); i++) {if(list.get(i).getNum().equalsIgnoreCase(str)){System.out.println("你确定要删除该水果吗?(y/n)");
String atr=sc.nextLine();
if(atr.equalsIgnoreCase("y")){list.remove(list.get(i));
}
}
}
System.out.println("水果信息删除结束!");
public E set(int index,E element);
如果我要批改我在汇合中增加的一种水果,请看以下代码:
这是批改汇合中一组录入的信息:
Scanner sc=new Scanner(System.in);
System.out.println("请输入您要批改信息的水果编号:");
String str=sc.nextLine();
System.out.println("请输出新的水果编号:");
String newstr=sc.nextLine();
System.out.println("请输出新的水果名称:");
String atr=sc.nextLine();
System.out.println("请输出新的水果单价:");
double ner=sc.nextDouble();
Pro02 p5=new Pro02();
p5.setNum(newstr);
p5.setName(atr);
p5.setPrice(ner);
for (int i = 0; i < list.size(); i++) {if(list.get(i).getNum().equals(str)){list.set(i,p5);
}
}
System.out.println("水果信息更新结束!");
而批改汇合中录入一组信息中某一个地位的信息,看以下代码:
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要批改的商品编号");
int sid = sc.nextInt();
System.out.println("请输入您要批改的库存数量");
int proNum = sc.nextInt();
// 第一种办法:// System.out.println(array.get(sid.charAt(0) - 49).getProNum());
// array.get(sid.charAt(0) - 49).setProNum(proNum);
//
Pro pro1 = array.get(sid-1);// 找到汇合外面的下标 sid-1(sid 从 1 开始),就找到了汇合外面的元素。pro1.setProNum(proNum);// 把批改的 proNum 调用到新对象 pro1
array.set(sid-1,pro1);//array.set(index 索引,元素 element); 批改指定地位的元素
}
这就是批改繁多元素的办法,找到索引地位,而后批改的元素信息笼罩旧的信息。
public E get(int index);
获取或者是说返回具体索引地位的办法:大多数用于获取某一个元素,或者某一个地位上的元素。通过遍历的形式找到。
例如:
ArrayList<Customer_2> cust=new ArrayList<Customer_2>();
for (int i = 0; i < list.size(); i++) {cust.add(list.get(i));
}
return cust;
其中,list 是汇合,list.get(i),就是遍历获取每一个元素。