String类型的创建
在Java中创建一个字符串可以有两种方法:
String name = " 你好";
String name = new Strng("你好");
这两段代码打映的都是一样的字符,主要的区别就是创建时字符串是如何来的.
new String这样的方法就是在运行时向操作系统中申请内存,并且创建出字符串常量;
而不new的方式就是在编译期间就将这些字符串常量创建好,等到程序一运行就会将这些常量创建好对应的String对象,放到一起构成字符串常量池.
不使用new的方法其实就是更快,更小的开销,时间也会更快.
字符串常量池是Java内置的机制,jvm运行时就会自动构造,不需要自行关注.当然常量池也不是只有一个字符串常量池,还有一些其他常量池.
我们可以对比两个方法创建的字符串对比进行观察:
String a = "abc";
String b = ""abc";
a==b
//此时就是返回true,表示两个引用类型的地址是一样的
String a = new Srting(abc);
String b = new String(abc);
a==b
//此时就是返回false,因为这是创建了两个不同的引用
标题String中的一些常用方法
1)比较两个string:
==比较两个string的引用是否相同.
equals比较字符串内容是否相同.
compareto方法会根据字典序(字母的大小关系)比较,返回的整数的正负就表示大小关系.
2)字符串查找:
charAt()方法是根据字符串的下标获取对应的字符(第1个字符下标为0).
indexOf()查找该字符串中是否包含的子字符串(子串需要连续).
3)把数字转为字符串
数字转成字符串有两种方法,一种是通过字符串的拼接,一种是调用valueof方法。
int j = 10;
String i =""+j;
System.out.println(i); //通过字符串拼接,将数字转成字符
String s = String.valueOf(j);
System.out.println(s); //通过value这个静态方法,将数字转成字符串
4)把字符串转为数字
如果只是将字符串加减上一个数字,则会触发字符串的拼接,要想实现字符串加减一个数得到一个整形加减结果,则要使用Integer.parseInt()。
int i = 10;
String s = "10";
System.out.println(i+s);//触发拼接,打映1010
int n = Integer.parseInt(s);
System.out.println(i+s);//字符串转为数字,打映20
5)字符串转大写和转小写
字符串转小写使用toLowerCase,字符串转大写用toUpperCase。
String i = "Hello";
System.out.println(i.toLowerCase());//d打印结果 hello
System.out.println(i.toUpperCase());//打映结果 HELLO
System.out.println(i);//打映 Hello
这里注意打映本来的字符串是没有改变的,证明转大小写是重新创建新的字符串。
https://docs.oracle.com/javase/8/docs/api/index.html
String中的所有方法都不能改变string本身,String这个对象其实是一个不可变对象.
String不能修改不是引用不能修改,而是new出来的对象不能修改,后面完全可以将 s=“你好” 这样写.

在Java中表示一个汉字,有可能是2个字节(utf16)也有可能是3个字节(utf16),主要取决于编码方式.
异常处理
异常是当代码在运行过程中出现错误而抛出使程序强行停止的一种手段.
抛出异常:
在编写代码时,我们可以在可能出现错误的地方使用try_catch捕捉异常,当我们没有手动进行抛出时,此时jvm内部就会抛出.
当使用try_catch捕捉到异常时,此时就程序就不会停止,而是会接着往下运行.
处理异常:
捕捉到异常后,不仅仅可以将它抛出,而是可以进行一些其他操作.
try_catch关键字
try_catch表示可以捕捉异常,同时也可以针对多个异常进行捕获,但是如果要使用runtimeException时,此时就需要要将它放在最后一个catch.
我们可以将Exception这个所有异常的父类最后一个catch,防止有出乎意料的异常不能捕捉到.
teat2 d = new teat2();
try{
int a = 10/0;
}catch (NullPointerException e){
System.out.println("");
}catch (ArithmeticException e){
System.out.println("");
}
}
还可以同时捕获多个:
teat2 d = new teat2();
try{
int a = 10/0;
}catch (NullPointerException e|ArithmeticException e){
System.out.println("");
}}
finally中的操作会在try_catch结束后继续执行,如果有return语句,finally中的return会覆盖掉上面的return.

throws关键字:
除了可以将异常使用try捕捉,还可以在方法外声明:

JAVA SE语法补充
1)JDK是一个Java开发的工具包,只有安装了JDK才能进行编写运行Java代码,其次,Java之所以能在个个系统上运行,实现"一次编写到处运行",主要是JVM这个"翻译官"在从中帮忙,我们编写的Java代码会被编译成.class文件,JVM会将这个字节码文件进行编译执行,不同的操作系统会有不同的JVM.
2)<<是左移,左边补0 ;
.>>是右移,当最高位是0是0时补0,最高位为1时补1 ;
.>>>是逻辑右移,不论高位是0还是1都补0.
3)scanner.next表示读到空白符(空格,换行符…)就会返回,nextLine表示读取一行直到读到/n为止返回.
当我们要循环输入多个数时,可以使用has系列的方法,这个方法返回的都是boolean类型的值,它会判断控制台输入的是否和它的规定类型相一致,hasNext读入一行字符串,hasNextLine判断是否有一行可读.当我们通过键盘输入一段数时,此时操作系统根据输入的东西放到对应的位置.
4)一个类中的所有方法都存放在“方法区”,所有的对象都是共同使用的同一份方法,只是传入的参数不同.
5)this 表示的是当前谁调用了这个方法,this就表示这个调用方法的引用,举例就是创建一个类,类中有一个方法,方法中有一个变量赋值操作,在要赋值的变量前加上this ,创建这个类的引用和实例,此时这个这个this 中就是表示这个类的引用.
编译器底层可以看成将引用和参数一起传到方法.

这样的代码就可以看作:

当使用this的时候就会使用这个引用.
6)初始化有就地初始化,代码块初始化,构造方法初始化.
代码块初始化就是在类内部写一个{},在大括号中对变量进行初始化.
三者的执行顺序是就地初始化,代码块初始化,构造方法初始化.
7)被ststic修饰的方法或属性,表示不论多少的创建多少方法都使用的是同一个方法或属性。
static 修饰的属性会影响到属性的存储位置 ;static 修饰的方法不会影响到方法的存储位置,还是在方法区.
8)深浅拷贝问题(clone是否要递归进行)
当使用cloneable接口时,如果要拷贝的对象中只有内置类型时,此时不涉及深浅拷贝;
当要clone的对象中存在应用类型时,此时针对clone后的新对象进行修改的时候就会影响到要clone的对象.此时就是浅拷贝.
原因是当进行克隆时,实例的地址是相同的,这样它们其中的引用类型就指向同一块地方,此时修改就是修改的同一个引用.

解决办法就是在要clone的方法内部再实现Cloneable接口,重写clone方法,再在clone时调用克隆类的克隆方法,就可以将其中的引用类型也克隆(深克隆就是递归克隆引用类型).
10)匿名内部类
这里创建了一个匿名内部类,不知道名字,只知道它实现了comparator接口.
此处new出来的实例就是匿名内部类的实例.


被折叠的 条评论
为什么被折叠?



