eclipse使用的步骤:
1.选择工作目录。以后在Eclipse上面写的所有代码都是在工作目录上的
2.在Project Exploer窗口上新建一个工程,以后我们写代码都是以工程为单位的
3.在工程的src目录下右击,new一个class或者一个package
工程的目录介绍:
- settings:eclipse自动生成的配置文件,别碰它
- bin:用于存放所有的class文件
- src:用于存放所有的java源文件
- 运行java文件
- 导入工程
运行有三种方式:
- java的源代码右击——————>run as————————>java application
- 绿色箭头的右边向下箭头——————>run as————————>java application
- Ctrl+F11
使用eclipse的好处:
- ctrl+/ 内容补全
- 不需要你在使用javac工具编译,你在eclipse上面一旦保存,Eclipse自动编译
- 精准报错,自动修复(ctrl+1)
Object类是所有类的终极父类。任何一个类都继承了Object类
Object类:
常用的方法:
- toString()方法 返回该对象的字符串表示 返回的字符串表示:完整类名+@+对象的哈希码
- equals(Object obj)方法 用于比较两个对象的内存地址,判断两个对象是否为同一个对象
- hashcode()方法 返回该对象的哈希码值
疑问:toString()方法有什么作用?
查看源代码的方式:
方式一:按住ctrl键单击你需要看的源代码
方式二:把光标移动到你需要查看的代码处按下F3
这时候,我们就有了疑问,为什么要查看源代码呢?
- 查看源代码可以了解别人是如何写出这个技术的,让我们了解的更加的深入
- 吸收大牛的思想
看源代码最忌讳的一点:不要每行代码都弄懂是什么意思,能看个大概猜出他意思就足以
例题:改写toString方法
public class Demo1 { public static void main(String[] args) { // TODO Auto-generated method stub Demo1 d=new Demo1(); System.out.println("hashcode="+d.hashCode()); Object o=new Object(); System.out.println("toString:"+o.toString()); //toString:java.lang.Object@2c13da15 System.out.println(o); Person p1=new Person(110,"狗娃"); System.out.println(p1); Person p2=new Person(120,"狗蛋"); System.out.println(p2); } } class Person{ int id; String name; public Person() {} public Person(int id,String name) { this.id=id; this.name=name; } public String toString() { return "编号:"+this.id+"姓名:"+this.name; } } 结果: hashcode=1361960727 toString:java.lang.Object@2c13da15 java.lang.Object@2c13da15 编号:110姓名:狗娃 编号:120姓名:狗蛋
经过这次例题,我们可以看出,重写toString之后,我们直接输出一个对象的时候,就会输出符合我们需求的格式数据
重写equals()方法
@Override public boolean equals(Object obj) { // TODO Auto-generated method stub Person p=(Person)obj; return this.id==p.id; } 结果: p1与p2是同一个对象吗?true
java种的规范:一般我们重写了一个类的equals方法我们都会重写它的hashcode方法。
@Override public int hashCode() { // TODO Auto-generated method stub return this.id; } System.out.println("p1哈希码:"+p1.hashCode()); System.out.println("p2哈希码:"+p2.hashCode()); 结果: p1哈希码:110 p2哈希码:110
这是因为比如equals方法返回为true,但是hashcode返回的值不一样,这就让人看起来很难受。
String 字符串类:
笔试题目:new String("abc")创建了几个对象
两个对象,一个对象是位于字符串常量中,一个对象是位于堆内存中。
使用equals方法的时候,我们一般都会将常量作为方法的调用者,这样避免空指针异常
test(null); public static void test(String str) { if ("中国".equals(str)) { System.out.println("回答正确"); } else { System.out.println("回答错误"); } } 结果: 回答错误
String类的构造方法:
String() 创建一个空内容的字符串对象。
String str=new String();
String(byte[] bytes) 使用一个字节数组构建一个字符串对象
public static void main(String[] args) { // TODO Auto-generated method stub String str=new String(); byte[] buf= {97,98,99}; str=new String(buf); System.out.println("字符串的内容是:"+str); } 结果: 字符串的内容是:abc
String(byte[] bytes, int offset, int length)
bytes:要解码的数组
offset:指定从数组中哪个索引值开始解码。
length:要解码多少个字符
str=new String(buf,1,2); System.out.println("字符串的内容是:"+str); 结果: 字符串的内容是:bc
String(char[] value) 使用一个字符数组构建一个字符串
String(char[] value, int offset, int count)
使用一个字符数组构建一个字符串,然后从给的的索引值开始,解码length个字符
char[] arr= {'明','天','会','更','好'}; str=new String(arr); System.out.println("字符串的内容是:"+str); 结果: 字符串的内容是:明天会更好
String(int[] codePoints, int offset, int count)
int类型的索引
String(String original)
初始化一个新创建的String对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本
记住:使用字节数组或者字符数组都可以构建一个字符串对象。
获取方法:
int length 获取字符串的长度
char charAt(int index)获取特定位置的字符(角标越界)
int indexOf(String str)查找字串第一次出现的索引值,如果字串没有出现在字符串中,那么则返回-1表示。
int lastIndexOf(String str) 获取最后一个字符的位置,如果字串没有出现在字符串中,那么则返回-1表示。
public static void main(String[] args) { // TODO Auto-generated method stub String str="abc中国ab中国"; System.out.println("字符串的字符个数:"+str.length()); System.out.println("根据索引值获取对应的字符:"+str.charAt(3)); System.out.println("查找字串第一次出现的索引值:"+str.indexOf("中国")); System.out.println("查找字串第一次出现的索引值:"+str.lastIndexOf("中国")); } 结果: 字符串的字符个数:9 根据索引值获取对应的字符:中 查找字串第一次出现的索引值:3 查找字串第一次出现的索引值:7
判断方法:
boolean endsWith(String str) 是否以指定字符串结束
boolean isEmpty() 是否长度为0
boolean contains(CharSequences) 是否包含指定序列 应用:搜索
boolean equals(Object anObject) 是否相等
boolean equalsIgnoreCase(String anotherString)忽略大小写是否相等
public static void main(String[] args) { // TODO Auto-generated method stub String str="Demo.java"; System.out.println("是否以指定的字符串结束:"+str.endsWith("java")); System.out.println("判断字符串是否为空内容:"+str.isEmpty()); System.out.println("判断字符串是否包含指定的内容"+str.contains("De")); System.out.println("判断两个字符串的内容是否一致:"+"DEMO.JAVA".equals(str)); //区分大小写 System.out.println("判断两个字符串的内容是否一致(忽略大小写比较)"+"demo.java".equalsIgnoreCase(str)); } 结果: 是否以指定的字符串结束:true 判断字符串是否为空内容:false 判断字符串是否包含指定的内容true 判断两个字符串的内容是否一致:false 判断两个字符串的内容是否一致(忽略大小写比较)true
转换方法:
String (char【】 value) 将字符数组转换为字符串
String (char【】value,int offset,int count)
static String valueOf(char[] data)
static String valueOf(char[] data,int offst,int count)
char[] toCharArray() 将字符串转化为字符数组
byte[] getBytes()
字节数组,字符数组,字符串它们三者之间是可以互相转换的。
char[] buf=str.toCharArray(); //转换为字符数组 System.out.println("字符数组:"+Arrays.toString(buf)); byte[] buf2=str.getBytes(); System.out.println("字节数组:"+Arrays.toString(buf2)); 结果: 字符数组:[D, e, m, o, ., j, a, v, a] 字节数组:[68, 101, 109, 111, 46, 106, 97, 118, 97]
String replace(char oldChar,char newChar) 替换 也可以传两个字符串
String【】split(String regex)切割
String substring(int beginIndex) 截取字串
String substring(int beginIndex,int endIndex) 截取字符串
String toUpperCase() 转大写
String toLowerCase()转小写
String trim() 去除字符串首尾的空格
import java.util.*; public class Demo6 { public static void main(String[] args) { // TODO Auto-generated method stub String str="今天晚上不考试"; System.out.println("指定新内容替换旧的内容:"+str.replace("不", "要")); System.out.println("指定新内容替换旧的内容:"+str.replace("不", "要好好")); str="大家-下-午-好"; String[] arr=str.split("-"); System.out.println("字符串数组:"+Arrays.toString(arr)); str="广州传智播客"; System.out.println("指定开始的索引值截取子串:"+str.substring(2)); System.out.println("指定开始和结束的索引值截取子串:"+str.substring(2,4));//包头不包尾 注意:截取的内容是包括开始的索引值,不包括结束的索引值,截取的位置是结束的位置-1位 str="abcde中国"; System.out.println("转大写:"+str.toUpperCase()); str="ASsdadaHGKda"; System.out.println("转小写:"+str.toLowerCase()); str=" 大家最近 都非常 努力 "; System.out.println("去除字符串首尾的空格:"+str.trim()); } } 结果: 指定新内容替换旧的内容:今天晚上要考试 指定新内容替换旧的内容:今天晚上要好好考试 字符串数组:[大家, 下, 午, 好] 指定开始的索引值截取子串:传智播客 指定开始和结束的索引值截取子串:传智 转大写:ABCDE中国 转小写:assdadahgkda 去除字符串首尾的空格:大家最近 都非常 努力
例1:自己重写Tirm方法
public class Demo7 { public static void main(String[] args) { // TODO Auto-generated method stub String str=" 传智 播客 "; System.out.println("字符串:"+str); System.out.println("去除空格后的字串:"+myTirm(str)); } public static String myTirm(String str) { //先转换字符数组 char[] arr=str.toCharArray(); //定义两个变量记录开始的索引值与结束的索引值 int startIndex=0; int endIndex=arr.length-1; //确定开始的索引值 while (true) { if (arr[startIndex]==' ') { startIndex++; } else { break; } } //确定结束的索引值 while (true) { if (arr[endIndex]==' ') { endIndex--; } else { break; } } //截取子串返回 return str.substring(startIndex, endIndex+1); } } 结果; 字符串: 传智 播客 去除空格后的字串:传智 播客
例2:从一串文件名中获取文件名称
public static void getFileName(String path) { int index=path.lastIndexOf("\\"); String fileName=path.substring(index+1); System.out.println("文件名:"+fileName); } str="D:\\20120512\\day12\\Demo1.java"; getFileName(str); 结果: 文件名:Demo1.java
例3:将字符串对象中存储的字符反序
public static String reverse(String str) { char[] arr=str.toCharArray(); char[] arr2=new char[arr.length]; int index=0; for (int i=arr.length-1;i>=0;i--) { arr2[index++]=arr[i]; } String str2=new String(arr2); return str2; } str="新中国好"; System.out.println("倒置后的字符串:"+reverse(str)); 结果: 倒置后的字符串:好国中新
例4:统计子串出现的个数
public static void getCount(String str,String target) { int count=0; //用于记录出现的次数 int fromIndex=0; //记录从哪个索引值开始寻找目标字串 while (str.indexOf(target, fromIndex)!=-1) { //如果indexOf返回的不是-1,那么意味着找到了目标元素 fromIndex=str.indexOf(target, fromIndex); count++; fromIndex=fromIndex+target.length(); } System.out.println("出现的次数:"+count); } str="abcjavaabcjavajavaphpjava"; getCount(str,"java"); 结果: 出现的次数:4
字符串特点:字符串是常量,他们的值在创建之后不能更改
字符串的内容一旦发生变化,那么马上会创建一个新的对象
注意:字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象。
如果需要频繁修改字符串的内容,建议使用字符串缓冲类(StringBuffer)。
StringBuffer 其实就是一个存储字符的容器。
添加数据:append();
StringBuffer底层是依赖了一个字符数组才能存储字符数据的,该字符串数组默认的初始容量是16,如果字符数组的长度不够使用时,自动增长一倍
容器应该具备的行为: 增删查改判断