System.arraycopy就是把一个数组中某一段字节数据放到另一个数组中。至于从第一个数组中取出几个数据,放到第二个数组中的什么位置都是可以通知这个方法的参数控制的。
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src:源数组;
srcPos:源数组要复制的起始位置;
dest:目的数组;
destPos:目的数组放置的起始位置;
length:复制的长度.
注意:src 和 dest都必须是同类型或者可以进行转换类型的数组
package com.atguigu; import java.util.Arrays; public class Test { public static void main(String[] args) { String[] a = {"hello","java","world","atguigu","chai"}; int total =a.length; //5 //删除[2]位置元素 int index = 2; System.arraycopy(a, index+1,a, index, total-index-1);; a[--total] = null; System.out.println(Arrays.toString(a)); } }[hello, java, atguigu, chai, null]
Period:用于计算两个“日期”间隔
Duration:用于计算两个“时间”间隔
public void test01(){
LocalDate t1 = LocalDate.now();
LocalDate t2 = LocalDate.of(2018, 12, 31);
Period between = Period.between(t1, t2);
System.out.println(between);
System.out.println("相差的年数:"+between.getYears());
System.out.println("相差的月数:"+between.getMonths());
System.out.println("相差的天数:"+between.getDays());
System.out.println("相差的总数:"+between.toTotalMonths());
}
@Test
public void test02(){
LocalDateTime t1 = LocalDateTime.now();
LocalDateTime t2 = LocalDateTime.of(2017, 8, 29, 0, 0, 0, 0);
Duration between = Duration.between(t1, t2);
System.out.println(between);
System.out.println("相差的总天数:"+between.toDays());
System.out.println("相差的总小时数:"+between.toHours());
System.out.println("相差的总分钟数:"+between.toMinutes());
System.out.println("相差的总秒数:"+between.getSeconds());
System.out.println("相差的总毫秒数:"+between.toMillis());
System.out.println("相差的总纳秒数:"+between.toNanos());
System.out.println("不够一秒的纳秒数:"+between.getNano());
}
}
// Random类 //用于产生随机数
Random random = new Random();
for (int i = 0; i < 10; i++) {
int num = random.nextInt(16);
System.out.println(num);
}
Random a = new Random();
int aa = a.nextInt(10);
System.out.println(aa);
* int index = Arrays.binarySearch(nums,19);// 二分查找,要先排序,才能二分查找. * System.out.println(Arrays.equals(nums, numsOne));// 两个数组的长度和元素完全相同返回true,否则返回false
String的一些方法:
1.sbustring: 截取字符串
String str = "helloworldjavaatguigu"; String sub1 = str.substring(5); //substring(5)从5开始截,默认截取到最后一位。 String sub2 = str.substring(5,10); //从下标5开始截,到下标10停止,注意截取不到10,是10的前一位 System.out.println(sub1); //worldjavaatguigu System.out.println(sub2); //world2. toUpperCase:小写转大写 ;toLowerCase : 大写转小写 ; charAt(index):取出下标为index位置的字符 ;
String str1 = "jack"; str1 = Character.toUpperCase(str1.charAt(0))+str1.substring(1); System.out.println(str1);3. indexOf()在原串中搜索参数字符串(或者字符)一次出现的下标
int index2 = word.indexOf("l");在原串中搜索参数字符第串一次出现的下标 System.out.println(index2); 4. length 返回字符串包含中间及两端空格的字符数 System.out.println(word.length());// 返回字符串包含中间及两端空格的字符数5.cancat 拼接字符串
word = word.concat(" one two three");// 拼接字符串6.charAt(x) 返回下标x处的字符
System.out.println(word.charAt(0));// 返回参数索引位置的字符7.toUpperCase 字符串全转大写,toLowerCase 字符串全转小写。
System.out.println(word.toUpperCase());// 将字符串全转大写 System.out.println(word.toLowerCase());// 将字符串全转小写8.toCharArray() 将字符串转成字符数组
char[] chars = word.toCharArray();// 将字符串转成字符数组9.trim() 去掉两端的空格
System.out.println(word.trim());// 去掉两端的空格10.split(x)使用参数x作为分割点,将原字符串分割成字符串数组
String[] words = word.split("-");// 使用参数作为分割点,将原字符串分割成字符串数组
StringBuilder、StringBuffer的API因为String对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低。因此,JDK又在java.lang包提供了可变字符序列StringBuilder和StringBuffer类型
1.StringBuffer reverse(xy):反转,把xy反转成yx。
2.StringBuffer append(xx):拼接,追加 ,在原字符串后面添加字符;
3. StringBuffer replace(int start, int end, String str):替换[start,end)范围的字符序列为str
4.String substring(int start, int end):截取当前字符序列[start,end)
5.StringBuffer delete(int start, int end):删除[start,end)之间字符
StringBuffer deleteCharAt(int index):删除[index]位置字符
6.StringBuffer insert(int index, xx):在[index]位置插入xx
7.String substring(int start):截取当前字符序列[start,最后]
String substring(int start, int end):截取当前字符序列[start,end)
8.String toString():返回此序列中数据的字符串表示形式
StringBuffer和Stringbuilder的区别
1.StringBuffer多线程安全,但是加了synchronized,其效率低。故适用于多线程下,并发量不是很高的场景
2、StringBuilder没有加任何锁,其效率高,适用单线程场景,但同时也适用于高并发场景中,提高高并发场景下程序的响应性能,至于线程安全问题可以通过其它手段解决,如ThreadLocal,CAS操作等。
3、所以对于高并发场景下,若有用到二者,还是建议优先使用StringBuilder
String对象的两种创建方式//方式一:通过字符串常量的方式
String str1 = "joshua317"; 首先检索方法区字符串常量池有没有joshua317,没有则创建一个,如果有就把地址赋值给str1
//方式二:通过new一个对象方式创建
String str2 = new String("joshua317");
//false
System.out.println(str1==str2);
数组基本算法
package com.atguigu.test;
import java.util.Arrays;
public class TestTwo {
public static void main(String[] args) {
// 向指定索引位置新增元素
int[] nums = {74,38,96,42,37};
int emptyIndex = -1;
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 0){
emptyIndex = i;
break;
}
}
if(emptyIndex == -1){
System.out.println(Arrays.toString(nums));
// 扩容
nums = Arrays.copyOf(nums,nums.length*2);
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 0){
emptyIndex = i;
break;
}
}
System.out.println(Arrays.toString(nums));
}
int index = 1;// 新增元素下标
if(index < emptyIndex){
// 插队式新增
for (int i = emptyIndex; i > index ; i--) {
nums[i] = nums[i-1];
}
nums[index] = 101;
}else if(index == emptyIndex){
// 追加式新增
nums[index] = 101;
}else{
System.out.println("请输入正确的新增元素下标");
}
System.out.println(Arrays.toString(nums));
}
}
public class TestOne {
public static void main(String[] args) {
// 删除指定索引位置的元素
int[] nums = {74,38,96,42,37,60,0,0,0};
int index = 1;// 删除的元素的下标
int emptyIndex = -1;// 第一个空位的下标
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 0){
emptyIndex = i;
break;
}
}
if(emptyIndex == -1){
// 没有空位元素
for (int i = index; i < nums.length-1; i++) {
nums[i] = nums[i+1];
}
nums[nums.length-1] = 0;
System.out.println(Arrays.toString(nums));
}else{
// 有空位元素
for (int i = index; i < emptyIndex; i++) {
nums[i] = nums[i+1];
}
System.out.println(Arrays.toString(nums));
}
}
}



