黑马程序员之----------数组与字符串

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

----------------java之----数组------------------

 

数组就是数字的集合 

 

1.创建一维数组的方法 

 

int[] a = new int[4];------------int a[] = new int[4];

 

int[] a = {1, 15, 26};-------------int a[] = {1, 15, 26};

 

int[] a= new int[4]{1,2,3,4}; 

 

 

2.数组中常见的两个异常: 

System.out.println(arr[3]);//ArrayIndexOutOfBoundsException: //当访问到数组中不存在的角标时,就会发生该异常。 

arr = null; 

   System.out.println(arr[0]);//NullPointerException 

//当引用型变量没有任何实体指向时,还在用其操作实体。就会发生该异常。

 

3.按相反的顺序输出

public class Demo {

public static void main(String[]args){

int[] row={30,31,32,33,34,35,36,37,38,39};

System.out.println("\n入场顺序为:");

for(int i=0;i<row.length;i++){

System.out.print("  第七排"+row[i]+"号");

if((i+1)%5==0)

System.out.println();

}

System.out.println("\n出场顺序为:");

for(int i=row.length-1;i>=0;i--){

System.out.print("  第七排"+row[i]+"号");

if(i%5==0)

System.out.println();

}

}

}

4.插入新的元素

public class  Demo{

public static void main(String[] args) {

av();

}

 

public static void av() {

int i, j;

int n = 5;

int av[] = new int[n + 1];//定义av数组

for (i = 0; i < av.length - 1; i++) {

av[i] = i + (1 + 2 * i);//赋值

}

int length = av.length;//定义数组长度变量

System.out.println("插入元素前的数组为:");

for (i = 0; i < av.length; i++) {

if (av[i] == 0) {//对数组取值

System.out.print("  ");

else {

System.out.print(av[i] + "    ");

 

}

 

}

System.out.println();//换行

System.out.println("请输入一个数字:");

Scanner sc = new Scanner(System.in);

int pp = sc.nextInt();//定义一个变量pp,从键盘接受数字

for (i = 0; i < av.length - 1; i++) {

if (av[i] > pp)//键盘接收数字与数组中数字比较

break;   //得到比pp大的数字下标i

}

for (j = av.length - 1; j > i; j--) {

av[j] = av[j - 1];//将比pp大的数字,下标往后挪一

}

av[i] = pp;

System.out.println("将" + pp + "插入数组后,该数组为");

for (i = 0; i < length; i++) {

System.out.print(av[i] + "  ");

 

}

}

}

5.复制数组

public class Demo {

public static void main(String[] args){

vb();

}

public static void vb(){

int copy1[]=new int[]{12,23,45,65,23,45,45,12,32};

int copy2[]=new int[copy1.length];

System.out.println("数组copy1的元素为:");

for(int i=0;i<copy1.length;i++){

System.out.print(copy1[i]+" ");

if((i+1)%4==0)

System.out.println();

}

System.arraycopy(copy1, 0, copy2, 0, copy2.length);

System.out.println("\n数组copy2的元素为:");

for(int i=0;i<copy1.length;i++){

System.out.print(copy1[i]+" ");

if((i+1)%4==0)

System.out.println();

}

}

}

 

6。输出元素下标

 

import java.util.Arrays;

 

public class SearchDemo {

 

public static void main(String[] args) {

 

int[] num = { 112, 23, 323, 42, 51, 7, 73 };

 

Arrays.sort(num, 4, 10);// 第4个下标到第10个下标(不包括第10)进行递增排序

 

Arrays.sort(num); // 从小到大排序

 

for (int n : num) { // 输出

 

System.out.print(n + " ");

 

}

 

int m = Arrays.binarySearch(num, 7); // 数组中元素为7的下标位置,如果7是多个则下标随机

 

System.out.println("\n" + m);

}

}

7.奇偶分组并交替输出

import java.util.Random;

 

public class  Demo{

public static void main(String[]args){

Random ra=new Random();

int total[]=new int[30];

int even[]=new int[30];

int odd[]=new int[30];

int j=0,k=0;

System.out.println("总数组total的元素如下:");

for(int i=0;i<total.length;i++){

total[i]=ra.nextInt(100);

if(total[i]%2==0){

odd[j]=total[i];

j++;

}else{

even[k]=total[i];

k++;

}

System.out.print(" "+total[i]);

if((i+1)%5==0){

System.out.println();

}

}

System.out.println("\n 奇偶交替输出:");

int max=j>k?j:k;

int min=j>k?k:j;

for(int x=0;x<max;x++){

if(x>=min && j==min){

System.out.print(" "+even[x]);

}else if(x>=min && k==min){

System.out.print(" "+odd[x]);

}else if(x<min){

System.out.print("   "+odd[x]+","+even[x]);

}

if((x+1)%5==0){

System.out.println();}

}

}

}

8.冒泡排序

public class Demo {//也叫选择排序

public static void main(String[]args){

int av[]={54,12,847,45};

for(int i=0;i<av.length;i++){

System.out.print(" "+av[i]);

if((i+1)%5==0)

System.out.println();

}

int vt;

for(int i=0;i<av.length;i++){

for(int j=i;j<av.length;j++){

if(av[j]<av[i]){//比较大小,0下标与1下标比较

vt=av[i]; //把大的付给一个变量

av[i]=av[j];//位置互换,把小的放到前面即0下标

av[j]=vt; //把大的付给数组中后面,即1下标

}

}

}

System.out.println("冒泡排序后为:");

for(int i=0;i<av.length;i++){

System.out.print(" "+av[i]);

if((i+1)%5==0)

System.out.println();

}

}

}

 

二维数组-----------------



 

9,创建:1------int [][]nums={ {23,67,34}, {34,67,56},{6,17} };

 

2----------int [][]nums=new int[3][4];//定义3行4列

 

3---------int [][]nums=new int[][]{ {2,3,4,5}, {33,44,22,55},{3,45,6,4} };

10.矩阵转置(行列互换)

 

public class Demo {// 行列互换

 

public static void main(String[] args) {

 

int av[][] = { { 1, 2, 3 }, { 7, 8, 44 }, { 4, 56, 87 }, { 54, 12, 45 } };// 定义数组

 

int vt[][] = new int[3][4];// 定义空数组

 

System.out.print("元型矩阵如下:\n");

 

for (int i = 0; i < av.length; i++) {

 

for (int j = 0; j < av[i].length; j++) {

 

System.out.print(av[i][j] + " ");

 

}// 遍历原数组

 

System.out.println();

 

}

 

for (int i = 0; i < av.length; i++) {

 

for (int j = 0; j < av[i].length; j++) {

 

vt[j][i] = av[i][j];// 将行列互换

 

}

 

}

 

System.out.print("\n转型后矩阵如下:\n");

 

for (int i = 0; i < vt.length; i++) {

 

for (int j = 0; j < vt[i].length; j++) {

 

System.out.print(vt[i][j] + " ");

 

}// 遍历输出新数组

 

System.out.println();

 

}

 

}

 

}

 

 

11.数组的定义:数组是相同类型数据的集合,描述的是相同类型的若干个数据按照一定的先后顺序排列组合而    成,其中每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。

 

12,数组的四个基本特点

1.长度固定,一旦被创建它的长度就是不可改变的;

2.其元素类型必须是相同类型,不允许出现混合类型;

3.数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型;

4.数组变量属于引用类型,数组也可以看做是对象,数组中的每个元素相当于该对象的成员变量,数组本    身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组本身是在堆中 13.常用方法

数组的下标合法区间是[0,length-1]。 

数组的拷贝:System.arrayCopy(源数组,从哪开始,目标数组,从哪开始贴,粘几个)。 

数组排序:Arrays.sort(被排序的数组)。 

二分法查找:Arrays.binarySearch(哪个数组,数组中的什么元素)。 

填充:Arrays.fill(a, 2, 4,  100)。//将数组a中2到4的索引的元素替换为100 

获取数组的长度:数组.length,如a.length,获取数组a的元素个数;a[0].length,表示获取二维数组中第一个数组的长度

 

----------------Java之------字符串--------------------

 

 

 

1.创建:----------------------------------------------

 

1,使用new关键字创建字符串,String str = new String("abc");

 

2,直接指定。String str= "abc";

 

3,使用串联生成新的字符串。String str = "ab" + "c"; 

 

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字串。

 

因为 String 对象是不可变的,所以可以共享字符串;

 

关于字符串的创建说明一下。字符串和数字一样都存在于常量池中。并且池中的字符串的内容不重复 。注意,当使用任何方式来创建一个字符串对象时,会有个编译期,

 

 

 

2.注意:------------面试题---------------------------------

 

1.---------String str = new String("xy");创建了几个对象 

 

----------------两个,一个是对象,一个是对象的引用 。

 

2. String str ="ab"+"c";创建了几个对象

 

--------------一个对象

 

3.String str0 ="ab"; 

 

String str1 ="c"; 

 

String str2 ="abc"; 

 

String str3 ="abc";

 

( 1 ) System.out.println(str2==str3);//true 

 

2,3 -> 根据String的概念他们都指向了同一个缓冲池内的地址,所以结果true 

 

String str4="ab"+"c"; 

 

(2)System.out.println(str2==str4);//true 

 

2,4 -> 相加的两个为常量,所以编译器会把s5优化为abc,所以结果也为true 

 

String str5=new String("abc");

 

(3)System.out.println(str2==str5);//false//创建对象开辟内存 

 

5指向的是新分配的地址空间所以与缓冲池地址不同,所以为false。

 

String str6=str0+"c";

 

(4)System.out.println(str2==str6);//false 

 

因为有变量所以编译器无法优化,在运行时,会有新的String地址空间的分配,而不是指向缓冲池中所以结果false。 

 

final String str7 ="ab"; 

 

final String str8 ="c"; 

 

String str9=str7+str8;

 

(5)System.out.println(str2==str9);//true 

 

因为是final类型编译器进行了优化所以相同。 

 

注意原理:--------重点------------------

 

原理1:当使用任何方式来创建一个字符串对象时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串,否则,不在池中添加。

 

原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。

 

原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。

 

原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String对象。

 

3.public class Demo {

 

public static void main(String[] args) {

 

String st = " ghgsdhdsghsgdhsgdhsgh ";

 

String st1 = "Khgsdhdsghsgdhsgdhsgh";

 

char ch = st.charAt(3);

 

// 截取第三个下标字符

 

int len = st.length();

 

// 字符串的长度

 

char buf[] = new char[20];

 

// 截取一段字符串

 

st.getChars(6, 10, buf, 0);

 

// void getChars(int s1,int s2,char t1[],int t2)

 

// s1指定了子串开始字符的下标,s2指定了子串结束后的下一个字符的下标。

 

// 因此,子串包含从s1到s2-1的字符。 接收字符的数组由t1指定,t1中开始复制子串的下标值是t2。

 

int n = st.compareTo(st1);

 

int n1 = st.compareToIgnoreCase(st1);

 

// 比较字符串

 

st = st.concat(st1);

 

// 将st1追加到st的后面,首尾相连

 

System.out.println(st.equals(st1));

 

// equals前后两个字符串是否相等,考虑大小写

 

System.out.println(st.equalsIgnoreCase(st1));

 

// equals前后两个字符串是否相等,不考虑大小写

 

int m1 = st.indexOf(ch);

 

// 从前向后 定位char ch 第一次出现的位置

 

int m2 = st.indexOf(ch, 4);

 

// 从前向后 定位 char ch 从第4个字符串开始

 

String st3 = st.replace("d""h");

 

// 替换指定字符

 

String av = "我,喜欢,你,你,喜,欢,我,吗";

 

String[] av1 = av.split(",");

 

// 以标记分割

 

String[] av2 = av.split(",", 5);

 

// 分割成5分

 

String sub1 = st.substring(12);

 

// 包括第12个下标,截取12及以后下标字符

 

String sub2 = st.substring(0, 10);

 

// 不包括第十个下标

 

char[] av3 = st.toCharArray();

 

// 分解字符串

 

System.out.println("小写转大写" + st.toUpperCase());

 

System.out.println("大写转小写" + st1.toLowerCase());

 

String st4 = st.trim();

 

// 去除前后空格

 

char ch4[] = { '大''家''新''年''好' };

 

String st5 = String.valueOf(true);// boolen

 

String st6 = String.valueOf('我');// char

 

String st7 = String.valueOf(ch);// char ch[]

 

String st8 = String.valueOf(3.212333);// double

 

String st9 = String.valueOf(9.89978f);// float

 

String st10 = String.valueOf(10);// int

 

String st11 = String.valueOf(7847387878l);// long

 

String st12 = String.valueOf(ch4, 1, 3);// (char ch[],1,3)


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

 

String st13 = String.valueOf(st5);// object

 

System.out.println(st10);

 

System.out.println(st11);

 

System.out.println(st12);

 

System.out.println(st13);

 

System.out.println(st9);

 

System.out.println(st5);

 

System.out.println(st6);

 

System.out.println(st7);

 

System.out.println(st8);

 

// 把其他类型转换为String类型

 

}

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值