JAVA 笔记(七)
- 字符串的面试题(看程序写结果)A:==和equals()。
String s1 = new String("hello"); String s2 = new String("hello"); System.out.println(s1 == s2);// false System.out.println(s1.equals(s2));// true String s3 = new String("hello"); String s4 = "hello"; System.out.println(s3 == s4);// false System.out.println(s3.equals(s4));// true String s5 = "hello"; String s6 = "hello"; System.out.println(s5 == s6);// true System.out.println(s5.equals(s6));// true
B:字符串的拼接
String s1 = "hello"; String s2 = "world"; String s3 = "helloworld"; System.out.println(s3 == s1 + s2);// false System.out.println(s3.equals((s1 + s2)));// true System.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是true System.out.println(s3.equals("hello" + "world"));// true
- 字符串的功能
A:判断功能
boolean equals(Object obj) boolean equalsIgnoreCase(String str) boolean contains(String str) boolean startsWith(String str) boolean endsWith(String str) boolean isEmpty()
B:获取功能
int length() char charAt(int index) int indexOf(int ch) int indexOf(String str) int indexOf(int ch,int fromIndex) int indexOf(String str,int fromIndex) String substring(int start) String substring(int start,int end)
C:转换功能
byte[] getBytes() char[] toCharArray() static String valueOf(char[] chs) static String valueOf(int i) String toLowerCase() String toUpperCase() String concat(String str)
D:其他功能
a:替换功能 String replace(char old,char new) String replace(String old,String new) b:去空格功能 String trim() c:按字典比较功能 int compareTo(String str) int compareToIgnoreCase(String str)
- 线程安全问题:安全-----同步(数据是安全的,我在做别人就不能做,效率低) 不安全------异步(效率高)
- Append(Sting str)可以把任意类型数据添加到字符串缓冲区 ,并且返回字符串缓冲区本身。Insert( 参数)是从指定位置插入,例如第五个位置,就是字符第五个位置开始插入。
- Delete(参数)删除是包左不包右。
- Reverse()反转(stingbuffer 类中也有)
- StringBuffer的截取返回值是String(这个要特别注意,因为这样改变的就是新的地址值,而不是原地址修改了)
- Stingbuffer转换成string(1.通过构造方法2.通过append()方法)string转换成Stingbuffer(1.通过构造方法2.通过toString()方法)
- 任何引用类型使用tostring()方法都可以编程字符串。
- StringBuilder可看做和Stringbuffer一样(只不过它主要操作单线程异步操作,效率高)
- String作为参数传递的时候,效果和基本类型作为参数的效果一样。(切记,这条结论很重要)因为字符串是一种特殊的引用类型。而stringbuffer作为形参时,调方法会改变,直接赋值不会改变。
- 冒泡排序排序相邻元素两两比较,第一次结束就是最大值出现在最大索引处,再以此类推。
- 冒泡排序:(for(intx=0;x<length-1;x++){for(inty=0;y<length-1-x;y++)})这种循环才是最佳的,c语言书中的该方法外循环次数虽然一样,但是内循环次数没有减掉每次已经排好的数据。
- 选择排序,从0索引开始,依次和后面元素比较,小的往前放,第一次比较完毕,最小值出现在最小索引处。
- 选择排序的循环for(int x=0;x<length-1;x++){for(int y=x+1;y<length;y++)}也就是到数组的最后两个元素相比较的时候就结束了。而内循环从x+1是因为每一次比较完毕后,最小索引处就确定了,不需要在进行比较。
- 将字符转换成字符串(valueof()方法最佳)
- 二分查找的前提是数组有序。而无序就用基本查找(从头找到尾)大了在左边找,max=mid-1;小了在右边找,min=mid+1;如果最小值比最大值大了还没有找到就是没有,那么返回一个负数---(low+1)这是原码定义的;
- Arrays:针对数组进行操作的工具类(比如排序和查找)。
- Sort()的原码是快速排序。
- 开发原则:只要是对象,我们需要判断该对象是否为null.
- Integer(String s)的这个构造方法中的字符串必须是数字组成的字符串。
- Int-àstring(string.valueof()) stringàint(Integer.parseInt()),这些方法推荐使用,别的虽然也能实现二者的转换,但是较为麻烦。
- 十进制到其它进制public static String tostring(int I,int radix)(其范围是2-36,因为数字是0---9,字母是a---z,其余木有了)。
- 其它进制转换成十进制publicstatic int parseInt(Stirng s,int redix).
- 自动装箱:就是把基本类型转换成包装类类型。自动拆箱:就是把包装类类型转换成基本类型。在使用时integer x=null,会出现空指针异常,所以使用的时候要先判断是否为空。
- For循环的第二条语句如果省略不写,就默认是ture.
- 通过查看源码,我们就知道了,针对-128到127之间的数据,做了一个数据缓冲池,如果数据是该范围内,每次并不创建新的空间。不在范围之内,每次要创建。(这条结论很重要)。【integer的数据直接赋值,如果在-128到127之间,就直接从缓冲池中获取数据】
- StringBuffer的构造方法
A:StringBuffer()
B:StringBuffer(int size)
C:StringBuffer(String str)
StringBuffer:同步的,数据安全,效率低。
StringBuilder:不同步的,数据不安全,效率高。
- 排序和查找
A:冒泡排序
相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。同理,其他的元素就可以排好。
public static void bubbleSort(int[] arr) { for(int x=0; x<arr.length-1; x++) { for(int y=0; y<arr.length-1-x; y++) { if(arr[y] > arr[y+1]) { int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } }
B:选择排序
把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,最小值出现在了0索引。同理,其他的元素就可以排好。
public static void selectSort(int[] arr) { for(int x=0; x<arr.length-1; x++) { for(int y=x+1; y<arr.length; y++) { if(arr[y] < arr[x]) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } }
(2)查找
A:基本查找
针对数组无序的情况
public static int getIndex(int[] arr,int value) {
int index = -1;
for(int x=0; x<arr.length; x++) {
if(arr[x] == value) {
index = x;
break;
}
}
return index;
}
B:二分查找(折半查找)
针对数组有序的情况(千万不要先排序,在查找)
public static int binarySearch(int[] arr,int value) { int min = 0; int max = arr.length-1; int mid = (min+max)/2; while(arr[mid] != value) { if(arr[mid] > value) { max = mid - 1; }
else if(arr[mid] < value) { min = mid + 1; } if(min > max) { return -1; } mid = (min+max)/2; } return mid; }
Integer i = 100; 装箱
i += 200; 先拆线,在装箱
- 正则表达式:符合一定规则的字符串。
(1)就是符合一定规则的字符串
(2)常见规则
A:字符
x 字符 x。举例:'a'表示字符a
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
B:字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围)
[0-9] 0到9的字符都包括
C:预定义字符类
. 任何字符。我的就是.字符本身,怎么表示呢? \.
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixi
E:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
(3)常见功能:(分别用的是谁呢?)
A:判断功能
String类的public boolean matches(String regex)
B:分割功能
String类的public String[] split(String regex)
C:替换功能
String类的public String replaceAll(String regex,String replacement)
D:获取功能
Pattern和Matcher
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
find():查找存不存在
group():获取刚才查找过的数据
- 正则表达式(.表示任意字符。\b 单词边界(就是不是单词字符的地方))规则字符在java.util.regex Pattern类中,字符串中的matches()方法就是验证字符串是否满足正则表达式。
- String的replaceALL()具有替换功能(主要是和谐)
- 获取功能:pattern(模式)和matcher(匹配器)【二者典型的调用顺序为:Pattern p = Pattern.compile("a*b");Matcher m = p.matcher("aaaaab");boolean b = m.matches();(第三句根据不同的需求来写,是可变的)】matcher中的group()方法使用前必须的先使用find()方法,就是先找,然后才能返回。
- Math类中的ceil()向上取整,floor()向下取整(这两个方法不考虑四舍五入的)。Round()方法是四舍五入。Sqrt()是取正平方根。
- 获取任意两个数之间的随机数的式子:int number=(int )((math.random()*(end-start+1))+start;(其中的start和end就是表示范围的两个数据。
- Random()本身也是包括左边不包括右边。
- Random类(非math类中的random()方法)是提供随机数的类public Random();没有给种子的构造方法,用得是默认种子,是当前时间的毫秒数。Public Random(long seed);给出指定的种子(给出种子后,每次得到的随机数一样的,因为种子相同)。该类方法nextInt();返回的范围是整个int范围内。nettInt(参数);返回是[0,参数)的范围内。
- 引用对象默认调用tostring()方法
- 执行system.gc()前。系统会自动调用finalize()方法清除对象占有的资源,通过super.finalize()方式可以实现从下到上的fianlize()方法的调用,即先释放自己的资源,然后再去释放父类的资源。(尽量不要频繁的调用垃圾回收机制)-------->待续